summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Worth <cworth@cworth.org>2010-07-19 18:01:43 -0700
committerIan Romanick <ian.d.romanick@intel.com>2010-07-20 17:01:11 -0700
commitd4f239de6e988a59d4ba3783ea325aa1552c3f5a (patch)
treee9233dd40523eda4615dc0f0f493a1d54c4d4e5b
parentd1500f8a195b7afe871cd768a5d33ecfecad5f31 (diff)
hash_table: Add new hash_table_remove function.
To allow for the removal of a single element from a hash table.
-rw-r--r--src/mesa/shader/hash_table.c17
-rw-r--r--src/mesa/shader/hash_table.h4
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