From 6d6ae570cb63ad33cf27f88b89ad6754bf6b027c Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Sun, 13 Apr 2014 18:20:37 +0900 Subject: add kh_push2() to check if entry is added --- include/mruby/khash.h | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'include') diff --git a/include/mruby/khash.h b/include/mruby/khash.h index 3a4315db0..9d86b26a6 100644 --- a/include/mruby/khash.h +++ b/include/mruby/khash.h @@ -70,7 +70,7 @@ static const uint8_t __m_either[] = {0x03, 0x0c, 0x30, 0xc0}; void kh_destroy_##name(mrb_state *mrb, kh_##name##_t *h); \ void kh_clear_##name(mrb_state *mrb, kh_##name##_t *h); \ khint_t kh_get_##name(mrb_state *mrb, kh_##name##_t *h, khkey_t key); \ - khint_t kh_put_##name(mrb_state *mrb, kh_##name##_t *h, khkey_t key); \ + khint_t kh_put_##name(mrb_state *mrb, kh_##name##_t *h, khkey_t key, int *ret); \ void kh_resize_##name(mrb_state *mrb, kh_##name##_t *h, khint_t new_n_buckets); \ void kh_del_##name(mrb_state *mrb, kh_##name##_t *h, khint_t x); \ kh_##name##_t *kh_copy_##name(mrb_state *mrb, kh_##name##_t *h); @@ -159,14 +159,14 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len) /* relocate */ \ for (i=0 ; in_occupied >= khash_upper_bound(h)) { \ @@ -177,6 +177,7 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len) while (!__ac_isempty(h->ed_flags, k)) { \ if (!__ac_isdel(h->ed_flags, k)) { \ if (__hash_equal(mrb,h->keys[k], key)) { \ + if (ret) *ret = 0; \ return k; \ } \ } \ @@ -190,6 +191,7 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len) h->keys[del_k] = key; \ h->ed_flags[del_k/4] &= ~__m_del[del_k%4]; \ h->size++; \ + if (ret) *ret = 2; \ return del_k; \ } \ else { \ @@ -198,6 +200,7 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len) h->ed_flags[k/4] &= ~__m_empty[k%4]; \ h->size++; \ h->n_occupied++; \ + if (ret) *ret = 1; \ return k; \ } \ } \ @@ -216,7 +219,7 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len) h2 = kh_init_##name(mrb); \ for (k = kh_begin(h); k != kh_end(h); k++) { \ if (kh_exist(h, k)) { \ - k2 = kh_put_##name(mrb, h2, kh_key(h, k)); \ + k2 = kh_put_##name(mrb, h2, kh_key(h, k), NULL); \ if (kh_is_map) kh_value(h2, k2) = kh_value(h, k); \ } \ } \ @@ -231,7 +234,8 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len) #define kh_destroy(name, mrb, h) kh_destroy_##name(mrb, h) #define kh_clear(name, mrb, h) kh_clear_##name(mrb, h) #define kh_resize(name, mrb, h, s) kh_resize_##name(mrb, h, s) -#define kh_put(name, mrb, h, k) kh_put_##name(mrb, h, k) +#define kh_put(name, mrb, h, k) kh_put_##name(mrb, h, k, NULL) +#define kh_put2(name, mrb, h, k, r) kh_put_##name(mrb, h, k, r) #define kh_get(name, mrb, h, k) kh_get_##name(mrb, h, k) #define kh_del(name, mrb, h, k) kh_del_##name(mrb, h, k) #define kh_copy(name, mrb, h) kh_copy_##name(mrb, h) -- cgit v1.2.3