mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-08 21:30:23 +01:00
mesa: Add hash_table_replace
hash_table_replace doesn't use get_node to avoid having to hash the key twice. Signed-off-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
parent
b7fa0d0727
commit
acd834fde2
2 changed files with 40 additions and 0 deletions
|
|
@ -149,6 +149,31 @@ hash_table_insert(struct hash_table *ht, void *data, const void *key)
|
|||
insert_at_head(& ht->buckets[bucket], & node->link);
|
||||
}
|
||||
|
||||
void
|
||||
hash_table_replace(struct hash_table *ht, void *data, const void *key)
|
||||
{
|
||||
const unsigned hash_value = (*ht->hash)(key);
|
||||
const unsigned bucket = hash_value % ht->num_buckets;
|
||||
struct node *node;
|
||||
struct hash_node *hn;
|
||||
|
||||
foreach(node, & ht->buckets[bucket]) {
|
||||
hn = (struct hash_node *) node;
|
||||
|
||||
if ((*ht->compare)(hn->key, key) == 0) {
|
||||
hn->data = data;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
hn = calloc(1, sizeof(*hn));
|
||||
|
||||
hn->data = data;
|
||||
hn->key = key;
|
||||
|
||||
insert_at_head(& ht->buckets[bucket], & hn->link);
|
||||
}
|
||||
|
||||
void
|
||||
hash_table_remove(struct hash_table *ht, const void *key)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -93,10 +93,25 @@ extern void *hash_table_find(struct hash_table *ht, const void *key);
|
|||
* If \c key is already in the hash table, it will be added again. Future
|
||||
* calls to \c hash_table_find and \c hash_table_remove will return or remove,
|
||||
* repsectively, the most recently added instance of \c key.
|
||||
*
|
||||
* \sa hash_table_replace
|
||||
*/
|
||||
extern void hash_table_insert(struct hash_table *ht, void *data,
|
||||
const void *key);
|
||||
|
||||
/**
|
||||
* Add an element to a hash table with replacement
|
||||
*
|
||||
* \warning
|
||||
* If \c key is already in the hash table, \c data will \b replace the most
|
||||
* recently inserted \c data (see the warning in \c hash_table_insert) for
|
||||
* that key.
|
||||
*
|
||||
* \sa hash_table_insert
|
||||
*/
|
||||
extern void hash_table_replace(struct hash_table *ht, void *data,
|
||||
const void *key);
|
||||
|
||||
/**
|
||||
* Remove a specific element from a hash table.
|
||||
*/
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue