diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-04-10 16:57:20 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-04-10 16:57:20 +0900 |
| commit | 847b7c5e19b649bbf8c3a86e7ebd6eef06e490eb (patch) | |
| tree | f9fe2e2f2a81d89f7092db0d1a6ed4680d4e448f | |
| parent | 93491caec90ac4935dc14ae318d45ac50ea177c2 (diff) | |
| parent | 93904fee21446d54881de2d4155a08b7030e13d3 (diff) | |
| download | mruby-847b7c5e19b649bbf8c3a86e7ebd6eef06e490eb.tar.gz mruby-847b7c5e19b649bbf8c3a86e7ebd6eef06e490eb.zip | |
Merge pull request #2038 from ksss/khash-refactoring
Refactoring for kh_put
| -rw-r--r-- | include/mruby/khash.h | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/include/mruby/khash.h b/include/mruby/khash.h index 77a0e3b0f..cad3bc5d3 100644 --- a/include/mruby/khash.h +++ b/include/mruby/khash.h @@ -168,34 +168,30 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len) } \ khint_t kh_put_##name(mrb_state *mrb, kh_##name##_t *h, khkey_t key) \ { \ - khint_t kk, k, seen_del = 0; \ + khint_t k, del_k; \ if (h->n_occupied >= khash_upper_bound(h)) { \ kh_resize_##name(mrb, h, h->n_buckets*2); \ } \ - kk = k = __hash_func(mrb,key) & khash_mask(h); \ + k = __hash_func(mrb,key) & khash_mask(h); \ + del_k = kh_end(h); \ while (!__ac_isempty(h->ed_flags, k)) { \ if (!__ac_isdel(h->ed_flags, k)) { \ if (__hash_equal(mrb,h->keys[k], key)) { \ - seen_del = 0; \ - break; \ + return k; \ } \ } \ else { \ - seen_del = 1; \ + del_k = k; \ } \ - k = (k+khash_inc(h)) & khash_mask(h); \ + k = (k+khash_inc(h)) & khash_mask(h); \ } \ - if (seen_del) { \ - k = kk; \ - while (!__ac_isdel(h->ed_flags, k)) { \ - k = (k+khash_inc(h)) % h->n_buckets; \ - } \ + if (del_k != kh_end(h)) { \ /* put at del */ \ - h->keys[k] = key; \ + h->keys[del_k] = key; \ h->ed_flags[k/4] &= ~__m_del[k%4]; \ h->size++; \ } \ - else if (__ac_isempty(h->ed_flags, k)) { \ + else { \ /* put at empty */ \ h->keys[k] = key; \ h->ed_flags[k/4] &= ~__m_empty[k%4]; \ |
