hashmap: add hash_GetNode

This commit is contained in:
Jakub Kądziołka
2021-04-16 13:08:14 +02:00
committed by Eldred Habert
parent 08bdbd1949
commit f97663aa37
2 changed files with 23 additions and 12 deletions

View File

@@ -51,6 +51,14 @@ bool hash_ReplaceElement(HashMap const map, char const *key, void *element);
*/
bool hash_RemoveElement(HashMap map, char const *key);
/**
* Finds an element in a hashmap, and returns a pointer to its value field.
* @param map The map to consider the elements of
* @param key The key to search an element for
* @return A pointer to the pointer to the element, or NULL if not found.
*/
void **hash_GetNode(HashMap const map, char const *key);
/**
* Finds an element in a hashmap.
* @param map The map to consider the elements of

View File

@@ -66,18 +66,14 @@ bool hash_AddElement(HashMap map, char const *key, void *element)
bool hash_ReplaceElement(HashMap const map, char const *key, void *element)
{
HashType hashedKey = hash(key);
struct HashMapEntry *ptr = map[(HalfHashType)hashedKey];
void **node = hash_GetNode(map, key);
while (ptr) {
if (hashedKey >> HALF_HASH_NB_BITS == ptr->hash
&& !strcmp(ptr->key, key)) {
ptr->content = element;
if (node) {
*node = element;
return true;
}
ptr = ptr->next;
}
} else {
return false;
}
}
bool hash_RemoveElement(HashMap map, char const *key)
@@ -99,7 +95,7 @@ bool hash_RemoveElement(HashMap map, char const *key)
return false;
}
void *hash_GetElement(HashMap const map, char const *key)
void **hash_GetNode(HashMap const map, char const *key)
{
HashType hashedKey = hash(key);
struct HashMapEntry *ptr = map[(HalfHashType)hashedKey];
@@ -107,13 +103,20 @@ void *hash_GetElement(HashMap const map, char const *key)
while (ptr) {
if (hashedKey >> HALF_HASH_NB_BITS == ptr->hash
&& !strcmp(ptr->key, key)) {
return ptr->content;
return &ptr->content;
}
ptr = ptr->next;
}
return NULL;
}
void *hash_GetElement(HashMap const map, char const *key)
{
void **node = hash_GetNode(map, key);
return node ? *node : NULL;
}
void hash_ForEach(HashMap const map, void (*func)(void *, void *), void *arg)
{
for (size_t i = 0; i < HASHMAP_NB_BUCKETS; i++) {