summaryrefslogtreecommitdiffstats
path: root/src/util
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2019-05-10 13:37:42 -0500
committerJason Ekstrand <[email protected]>2019-05-13 14:43:47 +0000
commitabb450870e8a8fc590e53b21f3ff2a4db42536dd (patch)
treeba8b324acb026e26a8f2f61a0c996232040a3f65 /src/util
parent460567eabf735003059ed24068d21b159d309896 (diff)
util/set: Add a search_and_add function
This function is identical to _mesa_set_add except that it takes an extra out parameter that lets the caller detect if a replacement happened. Reviewed-by: Eric Anholt <[email protected]> Reviewed-by: Thomas Helland <[email protected]>
Diffstat (limited to 'src/util')
-rw-r--r--src/util/set.c30
-rw-r--r--src/util/set.h6
2 files changed, 31 insertions, 5 deletions
diff --git a/src/util/set.c b/src/util/set.c
index 18f1262e3f5..2fd54a71a6f 100644
--- a/src/util/set.c
+++ b/src/util/set.c
@@ -247,7 +247,7 @@ _mesa_set_search_pre_hashed(const struct set *set, uint32_t hash,
}
static struct set_entry *
-set_add(struct set *ht, uint32_t hash, const void *key);
+set_add(struct set *ht, uint32_t hash, const void *key, bool *replaced);
static void
set_rehash(struct set *ht, unsigned new_size_index)
@@ -274,7 +274,7 @@ set_rehash(struct set *ht, unsigned new_size_index)
ht->deleted_entries = 0;
set_foreach(&old_ht, entry) {
- set_add(ht, entry->hash, entry->key);
+ set_add(ht, entry->hash, entry->key, NULL);
}
ralloc_free(old_ht.table);
@@ -287,7 +287,7 @@ set_rehash(struct set *ht, unsigned new_size_index)
* so previously found hash_entries are no longer valid after this function.
*/
static struct set_entry *
-set_add(struct set *ht, uint32_t hash, const void *key)
+set_add(struct set *ht, uint32_t hash, const void *key, bool *replaced)
{
uint32_t hash_address;
struct set_entry *available_entry = NULL;
@@ -325,6 +325,8 @@ set_add(struct set *ht, uint32_t hash, const void *key)
entry->hash == hash &&
ht->key_equals_function(key, entry->key)) {
entry->key = key;
+ if (replaced)
+ *replaced = true;
return entry;
}
@@ -339,6 +341,8 @@ set_add(struct set *ht, uint32_t hash, const void *key)
available_entry->hash = hash;
available_entry->key = key;
ht->entries++;
+ if (replaced)
+ *replaced = false;
return available_entry;
}
@@ -352,7 +356,7 @@ struct set_entry *
_mesa_set_add(struct set *set, const void *key)
{
assert(set->key_hash_function);
- return set_add(set, set->key_hash_function(key), key);
+ return set_add(set, set->key_hash_function(key), key, NULL);
}
struct set_entry *
@@ -360,7 +364,23 @@ _mesa_set_add_pre_hashed(struct set *set, uint32_t hash, const void *key)
{
assert(set->key_hash_function == NULL ||
hash == set->key_hash_function(key));
- return set_add(set, hash, key);
+ return set_add(set, hash, key, NULL);
+}
+
+struct set_entry *
+_mesa_set_search_and_add(struct set *set, const void *key, bool *replaced)
+{
+ assert(set->key_hash_function);
+ return set_add(set, set->key_hash_function(key), key, replaced);
+}
+
+struct set_entry *
+_mesa_set_search_and_add_pre_hashed(struct set *set, uint32_t hash,
+ const void *key, bool *replaced)
+{
+ assert(set->key_hash_function == NULL ||
+ hash == set->key_hash_function(key));
+ return set_add(set, hash, key, replaced);
}
/**
diff --git a/src/util/set.h b/src/util/set.h
index 307a2e46765..7d277c59f8b 100644
--- a/src/util/set.h
+++ b/src/util/set.h
@@ -79,6 +79,12 @@ struct set_entry *
_mesa_set_search_pre_hashed(const struct set *set, uint32_t hash,
const void *key);
+struct set_entry *
+_mesa_set_search_and_add(struct set *set, const void *key, bool *replaced);
+struct set_entry *
+_mesa_set_search_and_add_pre_hashed(struct set *set, uint32_t hash,
+ const void *key, bool *replaced);
+
void
_mesa_set_remove(struct set *set, struct set_entry *entry);
void