kh_resize operation never fail
This commit is contained in:
parent
2e1280ce5c
commit
d6edf41305
extlib/benz/include/picrin
|
@ -86,7 +86,7 @@ PIC_INLINE khint_t ac_Wang_hash(khint_t key)
|
||||||
void kh_destroy_##name(pic_state *, kh_##name##_t *h); \
|
void kh_destroy_##name(pic_state *, kh_##name##_t *h); \
|
||||||
void kh_clear_##name(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_get_##name(const kh_##name##_t *h, khkey_t key); \
|
||||||
int kh_resize_##name(pic_state *, kh_##name##_t *h, khint_t new_n_buckets); \
|
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); \
|
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);
|
void kh_del_##name(kh_##name##_t *h, khint_t x);
|
||||||
|
|
||||||
|
@ -123,7 +123,7 @@ PIC_INLINE khint_t ac_Wang_hash(khint_t key)
|
||||||
return ac_iseither(h->flags, i)? h->n_buckets : i; \
|
return ac_iseither(h->flags, i)? h->n_buckets : i; \
|
||||||
} else return 0; \
|
} else return 0; \
|
||||||
} \
|
} \
|
||||||
int kh_resize_##name(pic_state *pic, kh_##name##_t *h, khint_t new_n_buckets) \
|
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. */ \
|
{ /* This function uses 0.25*n_buckets bytes of working space instead of [sizeof(key_t+val_t)+.25]*n_buckets. */ \
|
||||||
khint32_t *new_flags = 0; \
|
khint32_t *new_flags = 0; \
|
||||||
khint_t j = 1; \
|
khint_t j = 1; \
|
||||||
|
@ -133,7 +133,6 @@ PIC_INLINE khint_t ac_Wang_hash(khint_t key)
|
||||||
if (h->size >= ac_hash_upper(new_n_buckets)) j = 0; /* requested size is too small */ \
|
if (h->size >= ac_hash_upper(new_n_buckets)) j = 0; /* requested size is too small */ \
|
||||||
else { /* hash table size to be changed (shrink or expand); rehash */ \
|
else { /* hash table size to be changed (shrink or expand); rehash */ \
|
||||||
new_flags = pic_malloc(pic, ac_fsize(new_n_buckets) * sizeof(khint32_t)); \
|
new_flags = pic_malloc(pic, ac_fsize(new_n_buckets) * sizeof(khint32_t)); \
|
||||||
if (!new_flags) return -1; \
|
|
||||||
memset(new_flags, 0xaa, ac_fsize(new_n_buckets) * sizeof(khint32_t)); \
|
memset(new_flags, 0xaa, ac_fsize(new_n_buckets) * sizeof(khint32_t)); \
|
||||||
if (h->n_buckets < new_n_buckets) { /* expand */ \
|
if (h->n_buckets < new_n_buckets) { /* expand */ \
|
||||||
h->keys = pic_realloc(pic, (void *)h->keys, new_n_buckets * sizeof(khkey_t)); \
|
h->keys = pic_realloc(pic, (void *)h->keys, new_n_buckets * sizeof(khkey_t)); \
|
||||||
|
@ -180,18 +179,15 @@ PIC_INLINE khint_t ac_Wang_hash(khint_t key)
|
||||||
h->n_occupied = h->size; \
|
h->n_occupied = h->size; \
|
||||||
h->upper_bound = ac_hash_upper(h->n_buckets); \
|
h->upper_bound = ac_hash_upper(h->n_buckets); \
|
||||||
} \
|
} \
|
||||||
return 0; \
|
|
||||||
} \
|
} \
|
||||||
khint_t kh_put_##name(pic_state *pic, kh_##name##_t *h, khkey_t key, int *ret) \
|
khint_t kh_put_##name(pic_state *pic, kh_##name##_t *h, khkey_t key, int *ret) \
|
||||||
{ \
|
{ \
|
||||||
khint_t x; \
|
khint_t x; \
|
||||||
if (h->n_occupied >= h->upper_bound) { /* update the hash table */ \
|
if (h->n_occupied >= h->upper_bound) { /* update the hash table */ \
|
||||||
if (h->n_buckets > (h->size<<1)) { \
|
if (h->n_buckets > (h->size<<1)) { \
|
||||||
if (kh_resize_##name(pic, h, h->n_buckets - 1) < 0) { /* clear "deleted" elements */ \
|
kh_resize_##name(pic, h, h->n_buckets - 1); /* clear "deleted" elements */ \
|
||||||
*ret = -1; return h->n_buckets; \
|
} else { \
|
||||||
} \
|
kh_resize_##name(pic, h, h->n_buckets + 1); /* expand the hash table */ \
|
||||||
} else if (kh_resize_##name(pic, h, h->n_buckets + 1) < 0) { /* expand the hash table */ \
|
|
||||||
*ret = -1; return h->n_buckets; \
|
|
||||||
} \
|
} \
|
||||||
} /* TODO: to implement automatically shrinking; resize() already support shrinking */ \
|
} /* TODO: to implement automatically shrinking; resize() already support shrinking */ \
|
||||||
{ \
|
{ \
|
||||||
|
|
Loading…
Reference in New Issue