aboutsummaryrefslogtreecommitdiff
path: root/src/njs_flathsh.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/njs_flathsh.c')
-rw-r--r--src/njs_flathsh.c43
1 files changed, 16 insertions, 27 deletions
diff --git a/src/njs_flathsh.c b/src/njs_flathsh.c
index a9ef6e69..7e374c62 100644
--- a/src/njs_flathsh.c
+++ b/src/njs_flathsh.c
@@ -210,13 +210,14 @@ njs_flathsh_add_elt(njs_flathsh_t *fh, njs_flathsh_query_t *fhq)
elts = njs_hash_elts(h);
elt = &elts[h->elts_count++];
- elt->value = fhq->value;
elt->key_hash = fhq->key_hash;
cell_num = fhq->key_hash & h->hash_mask;
elt->next_elt = njs_hash_cells_end(h)[-cell_num - 1];
njs_hash_cells_end(h)[-cell_num - 1] = h->elts_count;
+ elt->type = NJS_PROPERTY;
+
return elt;
}
@@ -269,7 +270,7 @@ njs_expand_elts(njs_flathsh_query_t *fhq, njs_flathsh_descr_t *h)
njs_memzero(chunk, sizeof(uint32_t) * new_hash_size);
for (i = 0, elt = njs_hash_elts(h); i < h->elts_count; i++, elt++) {
- if (elt->value != NULL) {
+ if (elt->type != NJS_FREE_FLATHSH_ELEMENT) {
cell_num = elt->key_hash & new_hash_mask;
elt->next_elt = njs_hash_cells_end(h)[-cell_num - 1];
njs_hash_cells_end(h)[-cell_num - 1] = i + 1;
@@ -331,7 +332,7 @@ njs_flathsh_find(const njs_flathsh_t *fh, njs_flathsh_query_t *fhq)
if (e->key_hash == fhq->key_hash &&
fhq->proto->test(fhq, e->value) == NJS_OK)
{
- fhq->value = e->value;
+ fhq->value = e;
return NJS_OK;
}
@@ -362,7 +363,7 @@ njs_flathsh_unique_find(const njs_flathsh_t *fh, njs_flathsh_query_t *fhq)
e = &elts[elt_num - 1];
if (e->key_hash == fhq->key_hash) {
- fhq->value = e->value;
+ fhq->value = e;
return NJS_OK;
}
@@ -376,7 +377,6 @@ njs_flathsh_unique_find(const njs_flathsh_t *fh, njs_flathsh_query_t *fhq)
njs_int_t
njs_flathsh_insert(njs_flathsh_t *fh, njs_flathsh_query_t *fhq)
{
- void *tmp;
njs_int_t cell_num, elt_num;
njs_flathsh_elt_t *elt, *elts;
njs_flathsh_descr_t *h;
@@ -403,15 +403,10 @@ njs_flathsh_insert(njs_flathsh_t *fh, njs_flathsh_query_t *fhq)
fhq->proto->test(fhq, elt->value) == NJS_OK)
{
if (fhq->replace) {
- tmp = fhq->value;
- fhq->value = elt->value;
- elt->value = tmp;
-
+ fhq->value = elt;
return NJS_OK;
} else {
- fhq->value = elt->value;
-
return NJS_DECLINED;
}
}
@@ -424,7 +419,7 @@ njs_flathsh_insert(njs_flathsh_t *fh, njs_flathsh_query_t *fhq)
return NJS_ERROR;
}
- elt->value = fhq->value;
+ fhq->value = elt;
return NJS_OK;
}
@@ -433,7 +428,6 @@ njs_flathsh_insert(njs_flathsh_t *fh, njs_flathsh_query_t *fhq)
njs_int_t
njs_flathsh_unique_insert(njs_flathsh_t *fh, njs_flathsh_query_t *fhq)
{
- void *tmp;
njs_int_t cell_num, elt_num;
njs_flathsh_elt_t *elt, *elts;
njs_flathsh_descr_t *h;
@@ -458,15 +452,10 @@ njs_flathsh_unique_insert(njs_flathsh_t *fh, njs_flathsh_query_t *fhq)
if (elt->key_hash == fhq->key_hash) {
if (fhq->replace) {
- tmp = fhq->value;
- fhq->value = elt->value;
- elt->value = tmp;
-
+ fhq->value = elt;
return NJS_OK;
} else {
- fhq->value = elt->value;
-
return NJS_DECLINED;
}
}
@@ -479,7 +468,7 @@ njs_flathsh_unique_insert(njs_flathsh_t *fh, njs_flathsh_query_t *fhq)
return NJS_ERROR;
}
- elt->value = fhq->value;
+ fhq->value = elt;
return NJS_OK;
}
@@ -521,8 +510,8 @@ njs_shrink_elts(njs_flathsh_query_t *fhq, njs_flathsh_descr_t *h)
elt_src = njs_hash_elts(h_src);
for (i = 0, j = 0, elt = njs_hash_elts(h); i < h->elts_count; i++) {
- if (elt_src->value != NULL) {
- elt->value = elt_src->value;
+ if (elt_src->type != NJS_FREE_FLATHSH_ELEMENT) {
+ *elt = *elt_src;
elt->key_hash = elt_src->key_hash;
cell_num = elt_src->key_hash & new_hash_mask;
@@ -572,7 +561,7 @@ njs_flathsh_delete(njs_flathsh_t *fh, njs_flathsh_query_t *fhq)
if (elt->key_hash == fhq->key_hash &&
fhq->proto->test(fhq, elt->value) == NJS_OK)
{
- fhq->value = elt->value;
+ fhq->value = elt;
if (elt_prev != NULL) {
elt_prev->next_elt = elt->next_elt;
@@ -583,7 +572,7 @@ njs_flathsh_delete(njs_flathsh_t *fh, njs_flathsh_query_t *fhq)
h->elts_deleted_count++;
- elt->value = NULL;
+ elt->type = NJS_FREE_FLATHSH_ELEMENT;
/* Shrink elts if elts_deleted_count is eligible. */
@@ -637,7 +626,7 @@ njs_flathsh_unique_delete(njs_flathsh_t *fh, njs_flathsh_query_t *fhq)
elt = &elts[elt_num - 1];
if (elt->key_hash == fhq->key_hash) {
- fhq->value = elt->value;
+ fhq->value = elt;
if (elt_prev != NULL) {
elt_prev->next_elt = elt->next_elt;
@@ -648,7 +637,7 @@ njs_flathsh_unique_delete(njs_flathsh_t *fh, njs_flathsh_query_t *fhq)
h->elts_deleted_count++;
- elt->value = NULL;
+ elt->type = NJS_FREE_FLATHSH_ELEMENT;
/* Shrink elts if elts_deleted_count is eligible. */
@@ -695,7 +684,7 @@ njs_flathsh_each(const njs_flathsh_t *fh, njs_flathsh_each_t *fhe)
while (fhe->cp < h->elts_count) {
e = &elt[fhe->cp++];
- if (e->value != NULL) {
+ if (e->type != NJS_FREE_FLATHSH_ELEMENT) {
return e;
}
}