diff options
author | Lennart Poettering <lennart@poettering.net> | 2014-05-15 00:43:44 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2014-05-15 00:43:44 +0200 |
commit | c582a3b3e8d263defbda98ecff793431a4cffa93 (patch) | |
tree | d823122851054fa8e5814f9feda02da5ad48db0c | |
parent | 4f4f70361a64957c45a2d8f40bfb04c77b454697 (diff) |
hashmap: add hashmap_remove2() to remove item from hashtable and return both value and key
-rw-r--r-- | src/shared/hashmap.c | 28 | ||||
-rw-r--r-- | src/shared/hashmap.h | 1 |
2 files changed, 29 insertions, 0 deletions
diff --git a/src/shared/hashmap.c b/src/shared/hashmap.c index 65b7b74128..5c3efa8dd3 100644 --- a/src/shared/hashmap.c +++ b/src/shared/hashmap.c @@ -582,6 +582,34 @@ void* hashmap_remove(Hashmap *h, const void *key) { return data; } +void* hashmap_remove2(Hashmap *h, const void *key, void **rkey) { + struct hashmap_entry *e; + unsigned hash; + void *data; + + if (!h) { + if (rkey) + *rkey = NULL; + return NULL; + } + + hash = bucket_hash(h, key); + e = hash_scan(h, hash, key); + if (!e) { + if (rkey) + *rkey = NULL; + return NULL; + } + + data = e->value; + if (rkey) + *rkey = (void*) e->key; + + remove_entry(h, e); + + return data; +} + int hashmap_remove_and_put(Hashmap *h, const void *old_key, const void *new_key, void *value) { struct hashmap_entry *e; unsigned old_hash, new_hash; diff --git a/src/shared/hashmap.h b/src/shared/hashmap.h index 154f68eaf0..bfad970078 100644 --- a/src/shared/hashmap.h +++ b/src/shared/hashmap.h @@ -69,6 +69,7 @@ void *hashmap_get(Hashmap *h, const void *key); void *hashmap_get2(Hashmap *h, const void *key, void **rkey); bool hashmap_contains(Hashmap *h, const void *key); void *hashmap_remove(Hashmap *h, const void *key); +void *hashmap_remove2(Hashmap *h, const void *key, void **rkey); void *hashmap_remove_value(Hashmap *h, const void *key, void *value); int hashmap_remove_and_put(Hashmap *h, const void *old_key, const void *new_key, void *value); int hashmap_remove_and_replace(Hashmap *h, const void *old_key, const void *new_key, void *value); |