summaryrefslogtreecommitdiff
path: root/src/shared
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2014-05-15 00:43:44 +0200
committerLennart Poettering <lennart@poettering.net>2014-05-15 00:43:44 +0200
commitc582a3b3e8d263defbda98ecff793431a4cffa93 (patch)
treed823122851054fa8e5814f9feda02da5ad48db0c /src/shared
parent4f4f70361a64957c45a2d8f40bfb04c77b454697 (diff)
hashmap: add hashmap_remove2() to remove item from hashtable and return both value and key
Diffstat (limited to 'src/shared')
-rw-r--r--src/shared/hashmap.c28
-rw-r--r--src/shared/hashmap.h1
2 files changed, 29 insertions, 0 deletions
diff --git a/src/shared/hashmap.c b/src/shared/hashmap.c
index 65b7b7412..5c3efa8dd 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 154f68eaf..bfad97007 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);