hash_table: Add an iterator for doing things like cleanup of the HT.

Without this, consumers often have to keep linked lists of the
entries, at additional malloc cost.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Eric Anholt
2011-03-23 12:05:56 -07:00
parent b943b9b1a6
commit b061b5ffb0
2 changed files with 26 additions and 0 deletions
+19
View File
@@ -160,6 +160,25 @@ hash_table_remove(struct hash_table *ht, const void *key)
}
}
void
hash_table_call_foreach(struct hash_table *ht,
void (*callback)(const void *key,
void *data,
void *closure),
void *closure)
{
int bucket;
for (bucket = 0; bucket < ht->num_buckets; bucket++) {
struct node *node, *temp;
foreach_s(node, temp, &ht->buckets[bucket]) {
struct hash_node *hn = (struct hash_node *) node;
callback(hn->key, hn->data, closure);
}
}
}
unsigned
hash_table_string_hash(const void *key)
{
+7
View File
@@ -144,6 +144,13 @@ hash_table_pointer_hash(const void *key);
int
hash_table_pointer_compare(const void *key1, const void *key2);
void
hash_table_call_foreach(struct hash_table *ht,
void (*callback)(const void *key,
void *data,
void *closure),
void *closure);
#ifdef __cplusplus
}
#endif