mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Merge pull request #2038 from ksss/khash-refactoring
Refactoring for kh_put
This commit is contained in:
+9
-13
@@ -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]; \
|
||||
|
||||
Reference in New Issue
Block a user