add a way of removing an exact iterator from the hash
This commit is contained in:
@@ -99,7 +99,7 @@ static void *cso_data_allocate_node(struct cso_hash_data *hash)
|
||||
return MALLOC(hash->nodeSize);
|
||||
}
|
||||
|
||||
static void cso_data_free_node(struct cso_node *node)
|
||||
static void cso_free_node(struct cso_node *node)
|
||||
{
|
||||
FREE(node);
|
||||
}
|
||||
@@ -248,7 +248,7 @@ void cso_hash_delete(struct cso_hash *hash)
|
||||
struct cso_node *cur = *bucket++;
|
||||
while (cur != e_for_x) {
|
||||
struct cso_node *next = cur->next;
|
||||
cso_data_free_node(cur);
|
||||
cso_free_node(cur);
|
||||
cur = next;
|
||||
}
|
||||
}
|
||||
@@ -367,7 +367,7 @@ void * cso_hash_take(struct cso_hash *hash,
|
||||
if (*node != hash->data.e) {
|
||||
void *t = (*node)->value;
|
||||
struct cso_node *next = (*node)->next;
|
||||
cso_data_free_node(*node);
|
||||
cso_free_node(*node);
|
||||
*node = next;
|
||||
--hash->data.d->size;
|
||||
cso_data_has_shrunk(hash->data.d);
|
||||
@@ -393,3 +393,22 @@ int cso_hash_size(struct cso_hash *hash)
|
||||
{
|
||||
return hash->data.d->size;
|
||||
}
|
||||
|
||||
struct cso_hash_iter cso_hash_erase(struct cso_hash *hash, struct cso_hash_iter iter)
|
||||
{
|
||||
struct cso_hash_iter ret = iter;
|
||||
struct cso_node *node = iter.node;
|
||||
struct cso_node **node_ptr;
|
||||
|
||||
if (node == hash->data.e)
|
||||
return iter;
|
||||
|
||||
ret = cso_hash_iter_next(ret);
|
||||
node_ptr = (struct cso_node**)(&hash->data.d->buckets[node->key % hash->data.d->numBuckets]);
|
||||
while (*node_ptr != node)
|
||||
node_ptr = &(*node_ptr)->next;
|
||||
*node_ptr = node->next;
|
||||
cso_free_node(node);
|
||||
--hash->data.d->size;
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -68,14 +68,26 @@ int cso_hash_size(struct cso_hash *hash);
|
||||
|
||||
|
||||
/**
|
||||
* Create a list of objects and just add entry with the same key to the list.
|
||||
* Adds a data with the given key to the hash. If entry with the given
|
||||
* key is already in the hash, this current entry is instered before it
|
||||
* in the collision list.
|
||||
* Function returns iterator pointing to the inserted item in the hash.
|
||||
*/
|
||||
struct cso_hash_iter cso_hash_insert(struct cso_hash *hash, unsigned key,
|
||||
void *data);
|
||||
/**
|
||||
* Removes the item pointed to by the current iterator from the hash.
|
||||
* Note that the data itself is not erased and if it was a malloc'ed pointer
|
||||
* it will have to be freed after calling this function by the callee.
|
||||
* Function returns iterator pointing to the item after the removed one in
|
||||
* the hash.
|
||||
*/
|
||||
struct cso_hash_iter cso_hash_erase(struct cso_hash *hash, struct cso_hash_iter iter);
|
||||
|
||||
void *cso_hash_take(struct cso_hash *hash, unsigned key);
|
||||
|
||||
|
||||
|
||||
struct cso_hash_iter cso_hash_first_node(struct cso_hash *hash);
|
||||
|
||||
/**
|
||||
@@ -97,7 +109,7 @@ struct cso_hash_iter cso_hash_iter_prev(struct cso_hash_iter iter);
|
||||
* Convenience routine to iterate over the collision list while doing a memory
|
||||
* comparison to see which entry in the list is a direct copy of our template
|
||||
* and returns that entry.
|
||||
*/
|
||||
*/
|
||||
void *cso_hash_find_data_from_template( struct cso_hash *hash,
|
||||
unsigned hash_key,
|
||||
void *templ,
|
||||
|
||||
Reference in New Issue
Block a user