summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/util/set.c9
-rw-r--r--src/util/set.h2
-rw-r--r--src/util/tests/set/set_test.cpp28
3 files changed, 39 insertions, 0 deletions
diff --git a/src/util/set.c b/src/util/set.c
index b2aa5ba13d5..feef96d16ea 100644
--- a/src/util/set.c
+++ b/src/util/set.c
@@ -384,6 +384,15 @@ _mesa_set_remove(struct set *ht, struct set_entry *entry)
}
/**
+ * Removes the entry with the corresponding key, if exists.
+ */
+void
+_mesa_set_remove_key(struct set *set, const void *key)
+{
+ _mesa_set_remove(set, _mesa_set_search(set, key));
+}
+
+/**
* This function is an iterator over the hash table.
*
* Pass in NULL for the first entry, as in the start of a for loop. Note that
diff --git a/src/util/set.h b/src/util/set.h
index 4db070a6f10..ffd19a798bd 100644
--- a/src/util/set.h
+++ b/src/util/set.h
@@ -81,6 +81,8 @@ _mesa_set_search_pre_hashed(const struct set *set, uint32_t hash,
void
_mesa_set_remove(struct set *set, struct set_entry *entry);
+void
+_mesa_set_remove_key(struct set *set, const void *key);
struct set_entry *
_mesa_set_next_entry(const struct set *set, struct set_entry *entry);
diff --git a/src/util/tests/set/set_test.cpp b/src/util/tests/set/set_test.cpp
index c0998560b50..a1eef0b3d98 100644
--- a/src/util/tests/set/set_test.cpp
+++ b/src/util/tests/set/set_test.cpp
@@ -85,3 +85,31 @@ TEST(set, clone)
_mesa_set_destroy(s, NULL);
_mesa_set_destroy(clone, NULL);
}
+
+TEST(set, remove_key)
+{
+ struct set *s = _mesa_set_create(NULL, _mesa_hash_pointer,
+ _mesa_key_pointer_equal);
+
+ const void *a = (const void *)10;
+ const void *b = (const void *)20;
+ const void *c = (const void *)30;
+
+ _mesa_set_add(s, a);
+ _mesa_set_add(s, b);
+ EXPECT_EQ(s->entries, 2);
+
+ /* Remove existing key. */
+ _mesa_set_remove_key(s, a);
+ EXPECT_EQ(s->entries, 1);
+ EXPECT_FALSE(_mesa_set_search(s, a));
+ EXPECT_TRUE(_mesa_set_search(s, b));
+
+ /* Remove non-existing key. */
+ _mesa_set_remove_key(s, c);
+ EXPECT_EQ(s->entries, 1);
+ EXPECT_FALSE(_mesa_set_search(s, a));
+ EXPECT_TRUE(_mesa_set_search(s, b));
+
+ _mesa_set_destroy(s, NULL);
+}