Use pic_eq_p to compare pic_values; move reverse lookup out of khash.h

This commit is contained in:
Doug Currie 2015-12-27 10:11:47 -05:00
parent 6e879dbe87
commit 17d731228a
2 changed files with 8 additions and 18 deletions

View File

@ -72,7 +72,6 @@ PIC_INLINE khint_t ac_Wang_hash(khint_t key)
void kh_destroy_##name(pic_state *, kh_##name##_t *h); \ void kh_destroy_##name(pic_state *, kh_##name##_t *h); \
void kh_clear_##name(kh_##name##_t *h); \ void kh_clear_##name(kh_##name##_t *h); \
khint_t kh_get_##name(const kh_##name##_t *h, khkey_t key); \ khint_t kh_get_##name(const kh_##name##_t *h, khkey_t key); \
khint_t kh_reverse_get_##name(const kh_##name##_t *h, khval_t val); \
void kh_resize_##name(pic_state *, kh_##name##_t *h, khint_t new_n_buckets); \ void kh_resize_##name(pic_state *, kh_##name##_t *h, khint_t new_n_buckets); \
khint_t kh_put_##name(pic_state *, kh_##name##_t *h, khkey_t key, int *ret); \ khint_t kh_put_##name(pic_state *, kh_##name##_t *h, khkey_t key, int *ret); \
void kh_del_##name(kh_##name##_t *h, khint_t x); void kh_del_##name(kh_##name##_t *h, khint_t x);
@ -110,17 +109,6 @@ PIC_INLINE khint_t ac_Wang_hash(khint_t key)
return ac_iseither(h->flags, i)? h->n_buckets : i; \ return ac_iseither(h->flags, i)? h->n_buckets : i; \
} else return 0; \ } else return 0; \
} \ } \
khint_t kh_reverse_get_##name(const kh_##name##_t *h, khval_t val) \
{ \
if (h->n_buckets) { \
khint_t i = 0; \
while (ac_iseither(h->flags, i) || (h->vals[i] != val)) { \
i += 1; \
if (i == h->n_buckets) return -1; \
} \
return i; \
} else return -1; \
} \
void kh_resize_##name(pic_state *pic, kh_##name##_t *h, khint_t new_n_buckets) \ void kh_resize_##name(pic_state *pic, kh_##name##_t *h, khint_t new_n_buckets) \
{ /* This function uses 0.25*n_buckets bytes of working space instead of [sizeof(key_t+val_t)+.25]*n_buckets. */ \ { /* This function uses 0.25*n_buckets bytes of working space instead of [sizeof(key_t+val_t)+.25]*n_buckets. */ \
int *new_flags = 0; \ int *new_flags = 0; \
@ -245,7 +233,6 @@ PIC_INLINE khint_t ac_Wang_hash(khint_t key)
#define kh_resize(name, h, s) kh_resize_##name(pic, h, s) #define kh_resize(name, h, s) kh_resize_##name(pic, h, s)
#define kh_put(name, h, k, r) kh_put_##name(pic, h, k, r) #define kh_put(name, h, k, r) kh_put_##name(pic, h, k, r)
#define kh_get(name, h, k) kh_get_##name(h, k) #define kh_get(name, h, k) kh_get_##name(h, k)
#define kh_reverse_get(name, h, v) kh_reverse_get_##name(h, v)
#define kh_del(name, h, k) kh_del_##name(h, k) #define kh_del(name, h, k) kh_del_##name(h, k)
#define kh_exist(h, x) (!ac_iseither((h)->flags, (x))) #define kh_exist(h, x) (!ac_iseither((h)->flags, (x)))

View File

@ -35,13 +35,16 @@ void *
pic_reg_rev_ref(pic_state *pic, struct pic_reg *reg, pic_value val) pic_reg_rev_ref(pic_state *pic, struct pic_reg *reg, pic_value val)
{ {
khash_t(reg) *h = &reg->hash; khash_t(reg) *h = &reg->hash;
khiter_t it;
it = kh_reverse_get(reg, h, val); if (h->n_buckets) {
if (it == -1) { khint_t i = 0;
pic_errorf(pic, "key not found for an element: ~s", val); while ((i < h->n_buckets) && (ac_iseither(h->flags, i) || !pic_eq_p(h->vals[i], val))) {
i += 1;
}
if (i < h->n_buckets) return kh_key(h, i);
} }
return kh_key(h, it); pic_errorf(pic, "key not found for an element: ~s", val);
return NULL;
} }
void void