diff --git a/include/hashmap.h b/include/hashmap.h index f81664f0..e1b99d3b 100644 --- a/include/hashmap.h +++ b/include/hashmap.h @@ -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 diff --git a/src/hashmap.c b/src/hashmap.c index a45cd449..02f64d4e 100644 --- a/src/hashmap.c +++ b/src/hashmap.c @@ -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; - return true; - } - ptr = ptr->next; + if (node) { + *node = element; + return true; + } else { + return false; } - 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++) {