X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Fhashmap.c;h=be37a3659d17a1d73bd4084d1f7af685c7050d41;hb=e627440b41bb0284e4892f7aa9d84c77972487e2;hp=5d1e63208a64648c8b8e11b8bd380874d607dfb0;hpb=5430f7f2bc7330f3088b894166bf3524a067e3d8;p=elogind.git diff --git a/src/shared/hashmap.c b/src/shared/hashmap.c index 5d1e63208..be37a3659 100644 --- a/src/shared/hashmap.c +++ b/src/shared/hashmap.c @@ -277,11 +277,10 @@ void hashmap_free(Hashmap*h) { } void hashmap_free_free(Hashmap *h) { - void *p; - - while ((p = hashmap_steal_first(h))) - free(p); + if (!h) + return; + hashmap_clear_free(h); hashmap_free(h); } @@ -293,6 +292,16 @@ void hashmap_clear(Hashmap *h) { remove_entry(h, h->iterate_list_head); } +void hashmap_clear_free(Hashmap *h) { + void *p; + + if (!h) + return; + + while ((p = hashmap_steal_first(h))) + free(p); +} + static struct hashmap_entry *hash_scan(Hashmap *h, unsigned hash, const void *key) { struct hashmap_entry *e; assert(h); @@ -369,6 +378,21 @@ void* hashmap_get(Hashmap *h, const void *key) { return e->value; } +bool hashmap_contains(Hashmap *h, const void *key) { + unsigned hash; + struct hashmap_entry *e; + + if (!h) + return false; + + hash = h->hash_func(key) % NBUCKETS; + + if (!(e = hash_scan(h, hash, key))) + return false; + + return true; +} + void* hashmap_remove(Hashmap *h, const void *key) { struct hashmap_entry *e; unsigned hash;