- gconstpointer v = g_hash_table_lookup(enum_class->table.quark_to_value,
- (gconstpointer) q);
- return *(const int64_t *) v;
+ struct enum_range_to_quark *iter;
+ GArray *qs, *ranges = NULL;
+
+ /* Single values lookup */
+ qs = g_hash_table_lookup(enum_class->table.value_to_quark_set, &v);
+
+ /* Range lookup */
+ cds_list_for_each_entry(iter, &enum_class->table.range_to_quark, node) {
+ if (iter->range.start._signed > v || iter->range.end._signed < v)
+ continue;
+ if (!ranges) {
+ size_t qs_len = 0;
+
+ if (qs)
+ qs_len = qs->len;
+ ranges = g_array_sized_new(FALSE, TRUE,
+ sizeof(struct enum_range),
+ qs_len + 1);
+ g_array_set_size(ranges, qs_len + 1);
+ if (qs)
+ memcpy(ranges->data, qs->data,
+ sizeof(struct enum_range) * qs_len);
+ g_array_index(ranges, struct enum_range, qs_len) = iter->range;
+ } else {
+ g_array_set_size(ranges, ranges->len + 1);
+ g_array_index(ranges, struct enum_range, ranges->len) = iter->range;
+ }
+ }
+ if (!ranges)
+ ranges = qs;
+ return ranges;