hash_table: Add new hash_table_remove function.
authorCarl Worth <cworth@cworth.org>
Tue, 20 Jul 2010 01:01:43 +0000 (18:01 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Wed, 21 Jul 2010 00:01:11 +0000 (17:01 -0700)
To allow for the removal of a single element from a hash table.

src/mesa/shader/hash_table.c
src/mesa/shader/hash_table.h

index 933e300abddf0821b76cb3df5fbd07f475cece3a..f7ef366c1a0312574c444b5adfa741761e8c2374 100644 (file)
@@ -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)
index 05526914643f6627a0cf8e3565a6743d31d90576..228ab948ff45c6dde90684e817b29accb48e724f 100644 (file)
@@ -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