hashmap: add hashmap_remove2() to remove item from hashtable and return both value...
authorLennart Poettering <lennart@poettering.net>
Wed, 14 May 2014 22:43:44 +0000 (00:43 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 14 May 2014 22:43:44 +0000 (00:43 +0200)
src/shared/hashmap.c
src/shared/hashmap.h

index 65b7b74..5c3efa8 100644 (file)
@@ -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;
index 154f68e..bfad970 100644 (file)
@@ -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);