From 3158713e0094fd32f58ee80c50ff54210c2dc411 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 20 Jan 2010 02:12:12 +0100 Subject: [PATCH] implement hashmap_replace() and hashmap_remove_value() --- hashmap.c | 43 ++++++++++++++++++++++++++++++++++++++++++- hashmap.h | 2 ++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/hashmap.c b/hashmap.c index c55a07a88..a81bcc422 100644 --- a/hashmap.c +++ b/hashmap.c @@ -139,8 +139,13 @@ int hashmap_put(Hashmap *h, const void *key, void *value) { hash = h->hash_func(key) % NBUCKETS; - if (hash_scan(h, hash, key)) + if ((e = hash_scan(h, hash, key))) { + + if (e->value == value) + return 0; + return -EEXIST; + } if (!(e = new(struct hashmap_entry, 1))) return -ENOMEM; @@ -173,6 +178,22 @@ int hashmap_put(Hashmap *h, const void *key, void *value) { return 0; } +int hashmap_replace(Hashmap *h, const void *key, void *value) { + struct hashmap_entry *e; + unsigned hash; + + assert(h); + + hash = h->hash_func(key) % NBUCKETS; + + if ((e = hash_scan(h, hash, key))) { + e->value = value; + return 0; + } + + return hashmap_put(h, key, value); +} + void* hashmap_get(Hashmap *h, const void *key) { unsigned hash; struct hashmap_entry *e; @@ -207,6 +228,26 @@ void* hashmap_remove(Hashmap *h, const void *key) { return data; } +void* hashmap_remove_value(Hashmap *h, const void *key, void *value) { + struct hashmap_entry *e; + unsigned hash; + + if (!h) + return NULL; + + hash = h->hash_func(key) % NBUCKETS; + + if (!(e = hash_scan(h, hash, key))) + return NULL; + + if (e->value != value) + return NULL; + + remove_entry(h, e); + + return value; +} + void *hashmap_iterate(Hashmap *h, void **state, const void **key) { struct hashmap_entry *e; diff --git a/hashmap.h b/hashmap.h index 91d8b46db..ae7f74bc0 100644 --- a/hashmap.h +++ b/hashmap.h @@ -26,8 +26,10 @@ void hashmap_free(Hashmap *h); Hashmap *hashmap_copy(Hashmap *h); int hashmap_put(Hashmap *h, const void *key, void *value); +int hashmap_replace(Hashmap *h, const void *key, void *value); void* hashmap_get(Hashmap *h, const void *key); void* hashmap_remove(Hashmap *h, const void *key); +void* hashmap_remove_value(Hashmap *h, const void *key, void *value); int hashmap_merge(Hashmap *h, Hashmap *other); -- 2.30.2