diff options
author | Carl Worth <[email protected]> | 2010-07-19 18:01:43 -0700 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2010-07-20 17:01:11 -0700 |
commit | d4f239de6e988a59d4ba3783ea325aa1552c3f5a (patch) | |
tree | e9233dd40523eda4615dc0f0f493a1d54c4d4e5b /src | |
parent | d1500f8a195b7afe871cd768a5d33ecfecad5f31 (diff) |
hash_table: Add new hash_table_remove function.
To allow for the removal of a single element from a hash table.
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/shader/hash_table.c | 17 | ||||
-rw-r--r-- | src/mesa/shader/hash_table.h | 4 |
2 files changed, 21 insertions, 0 deletions
diff --git a/src/mesa/shader/hash_table.c b/src/mesa/shader/hash_table.c index 933e300abdd..f7ef366c1a0 100644 --- a/src/mesa/shader/hash_table.c +++ b/src/mesa/shader/hash_table.c @@ -142,6 +142,23 @@ hash_table_insert(struct hash_table *ht, void *data, const void *key) insert_at_head(& ht->buckets[bucket], & node->link); } +void +hash_table_remove(struct hash_table *ht, const void *key) +{ + const unsigned hash_value = (*ht->hash)(key); + const unsigned bucket = hash_value % ht->num_buckets; + struct node *node; + + foreach(node, & ht->buckets[bucket]) { + struct hash_node *hn = (struct hash_node *) node; + + if ((*ht->compare)(hn->key, key) == 0) { + remove_from_list(node); + free(node); + return; + } + } +} unsigned hash_table_string_hash(const void *key) diff --git a/src/mesa/shader/hash_table.h b/src/mesa/shader/hash_table.h index 05526914643..228ab948ff4 100644 --- a/src/mesa/shader/hash_table.h +++ b/src/mesa/shader/hash_table.h @@ -94,6 +94,10 @@ extern void *hash_table_find(struct hash_table *ht, const void *key); extern void hash_table_insert(struct hash_table *ht, void *data, const void *key); +/** + * Remove a specific element from a hash table. + */ +extern void hash_table_remove(struct hash_table *ht, const void *key); /** * Compute hash value of a string |