From fa0c19d17b9b6308fdca01f609c167b3ea1e68ae Mon Sep 17 00:00:00 2001 From: Caio Marcelo de Oliveira Filho Date: Mon, 25 Jun 2018 13:42:22 -0700 Subject: [PATCH] util/set: helper to remove entry by key v2: Add unit test. (Eric Anholt) Reviewed-by: Eric Anholt --- src/util/set.c | 9 +++++++++ src/util/set.h | 2 ++ src/util/tests/set/set_test.cpp | 28 ++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/src/util/set.c b/src/util/set.c index b2aa5ba..feef96d 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 4db070a..ffd19a7 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 c099856..a1eef0b 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); +} -- 2.7.4