From 17d731228abfb63a7dde03cd377843a22a52b9dc Mon Sep 17 00:00:00 2001 From: Doug Currie Date: Sun, 27 Dec 2015 10:11:47 -0500 Subject: [PATCH] Use pic_eq_p to compare pic_values; move reverse lookup out of khash.h --- extlib/benz/include/picrin/khash.h | 13 ------------- extlib/benz/reg.c | 13 ++++++++----- 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/extlib/benz/include/picrin/khash.h b/extlib/benz/include/picrin/khash.h index e762ae21..3d8d2ed9 100644 --- a/extlib/benz/include/picrin/khash.h +++ b/extlib/benz/include/picrin/khash.h @@ -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_clear_##name(kh_##name##_t *h); \ 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); \ 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); @@ -110,17 +109,6 @@ PIC_INLINE khint_t ac_Wang_hash(khint_t key) return ac_iseither(h->flags, i)? h->n_buckets : i; \ } 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) \ { /* 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; \ @@ -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_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_reverse_get(name, h, v) kh_reverse_get_##name(h, v) #define kh_del(name, h, k) kh_del_##name(h, k) #define kh_exist(h, x) (!ac_iseither((h)->flags, (x))) diff --git a/extlib/benz/reg.c b/extlib/benz/reg.c index 9d1282d4..a589b8ea 100644 --- a/extlib/benz/reg.c +++ b/extlib/benz/reg.c @@ -35,13 +35,16 @@ void * pic_reg_rev_ref(pic_state *pic, struct pic_reg *reg, pic_value val) { khash_t(reg) *h = ®->hash; - khiter_t it; - it = kh_reverse_get(reg, h, val); - if (it == -1) { - pic_errorf(pic, "key not found for an element: ~s", val); + if (h->n_buckets) { + khint_t i = 0; + 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