mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
add kh_push2() to check if entry is added
This commit is contained in:
@@ -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 ; i<old_n_buckets ; i++) { \
|
||||
if (!__ac_iseither(old_ed_flags, i)) { \
|
||||
khint_t k = kh_put_##name(mrb, h, old_keys[i]); \
|
||||
khint_t k = kh_put_##name(mrb, h, old_keys[i], NULL); \
|
||||
if (kh_is_map) kh_value(h,k) = old_vals[i]; \
|
||||
} \
|
||||
} \
|
||||
mrb_free(mrb, old_keys); \
|
||||
} \
|
||||
} \
|
||||
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) \
|
||||
{ \
|
||||
khint_t k, del_k; \
|
||||
if (h->n_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)
|
||||
|
||||
Reference in New Issue
Block a user