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);
}
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;
}
}
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);
{
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;
+}
/**
- * 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);
/**
* 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,