util/set: Add a _mesa_set_search_or_add() function
[mesa.git] / src / util / tests / set / set_test.cpp
index a1eef0b3d98acf28301b7803d05636ad76783b79..0b4355af12871bd8e104062f44df007e9036e962 100644 (file)
@@ -113,3 +113,36 @@ TEST(set, remove_key)
 
    _mesa_set_destroy(s, NULL);
 }
+
+static uint32_t hash_int(const void *p)
+{
+   int i = *(const int *)p;
+   return i;
+}
+
+static bool cmp_int(const void *p1, const void *p2)
+{
+   int i1 = *(const int *)p1, i2 = *(const int *)p2;
+   return i1 == i2;
+}
+
+TEST(set, search_or_add)
+{
+   struct set *s = _mesa_set_create(NULL, hash_int, cmp_int);
+
+   int a = 10, b = 20, c = 20, d = 30;
+
+   _mesa_set_add(s, &a);
+   _mesa_set_add(s, &b);
+   EXPECT_EQ(s->entries, 2);
+
+   struct set_entry *entry = _mesa_set_search_or_add(s, &c);
+   EXPECT_EQ(entry->key, (void *)&b);
+   EXPECT_EQ(s->entries, 2);
+
+   struct set_entry *entry3 = _mesa_set_search_or_add(s, &d);
+   EXPECT_EQ(entry3->key, &d);
+   EXPECT_EQ(s->entries, 3);
+
+   _mesa_set_destroy(s, NULL);
+}