implement hashmap_replace() and hashmap_remove_value()

This commit is contained in:
Lennart Poettering 2010-01-20 02:12:12 +01:00
parent 11dd41ce4b
commit 3158713e00
2 changed files with 44 additions and 1 deletions

View file

@ -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;

View file

@ -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);