Lines Matching full:hash
21 static NEOERR *_hash_resize(NE_HASH *hash);
22 static NE_HASHNODE **_hash_lookup_node (NE_HASH *hash, void *key, UINT32 *hashv);
24 NEOERR *ne_hash_init (NE_HASH **hash, NE_HASH_FUNC hash_func, NE_COMP_FUNC comp_func)
44 *hash = my_hash;
49 void ne_hash_destroy (NE_HASH **hash)
55 if (hash == NULL || *hash == NULL)
58 my_hash = *hash;
73 *hash = NULL;
76 NEOERR *ne_hash_insert(NE_HASH *hash, void *key, void *value)
81 node = _hash_lookup_node(hash, key, &hashv);
98 hash->num++;
100 return _hash_resize(hash);
103 void *ne_hash_lookup(NE_HASH *hash, void *key)
107 node = *_hash_lookup_node(hash, key, NULL);
112 void *ne_hash_remove(NE_HASH *hash, void *key)
117 node = _hash_lookup_node(hash, key, NULL);
124 hash->num--;
129 int ne_hash_has_key(NE_HASH *hash, void *key)
133 node = *_hash_lookup_node(hash, key, NULL);
139 void *ne_hash_next(NE_HASH *hash, void **key)
146 node = _hash_lookup_node(hash, key, NULL);
150 bucket = (*node)->hashv & (hash->size - 1);
154 hashv = hash->hash_func(*key);
155 bucket = hashv & (hash->size - 1);
173 while (bucket < hash->size)
175 if (hash->nodes[bucket])
177 *key = hash->nodes[bucket]->key;
178 return hash->nodes[bucket]->value;
186 static NE_HASHNODE **_hash_lookup_node (NE_HASH *hash, void *key, UINT32 *o_hashv)
191 hashv = hash->hash_func(key);
193 bucket = hashv & (hash->size - 1);
196 node = &(hash->nodes[bucket]);
198 if (hash->comp_func)
200 while (*node && !(hash->comp_func((*node)->key, key)))
215 static NEOERR *_hash_resize(NE_HASH *hash)
220 int orig_size = hash->size;
223 if (hash->size > hash->num)
227 new_nodes = (NE_HASHNODE **) realloc (hash->nodes, (hash->size*2) * sizeof(NE_HASHNODE));
231 hash->nodes = new_nodes;
232 orig_size = hash->size;
233 hash->size = hash->size*2;
236 for (x = orig_size; x < hash->size; x++)
238 hash->nodes[x] = NULL;
241 hash_mask = hash->size - 1;
247 for (entry = hash->nodes[x];
249 entry = prev ? prev->next : hash->nodes[x])
259 hash->nodes[x] = entry->next;
261 entry->next = hash->nodes[next_bucket];
262 hash->nodes[next_bucket] = entry;