From b061b5ffb055c64ffc45e506bad877f47942ba01 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Wed, 23 Mar 2011 12:05:56 -0700 Subject: [PATCH] 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 --- src/mesa/program/hash_table.c | 19 +++++++++++++++++++ src/mesa/program/hash_table.h | 7 +++++++ 2 files changed, 26 insertions(+) diff --git a/src/mesa/program/hash_table.c b/src/mesa/program/hash_table.c index f7ef366..877a9e2 100644 --- a/src/mesa/program/hash_table.c +++ b/src/mesa/program/hash_table.c @@ -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) { diff --git a/src/mesa/program/hash_table.h b/src/mesa/program/hash_table.h index f1c4fdc..e715bb1 100644 --- a/src/mesa/program/hash_table.h +++ b/src/mesa/program/hash_table.h @@ -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 -- 2.7.4