diff options
author | Lennart Poettering <lennart@poettering.net> | 2010-01-18 23:49:49 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2010-01-18 23:49:49 +0100 |
commit | 91cdde8a7a08c6797995cc67f4b55ac43780cdd8 (patch) | |
tree | e6bcc2d96a186a47b3076e0a95f495933dc5d9bd /hashmap.c | |
parent | 3efd4195676c3880771b9f5e3b3bd9ff35c5ad4b (diff) |
implement hashmap_copy() and hashmap_merge()
Diffstat (limited to 'hashmap.c')
-rw-r--r-- | hashmap.c | 36 |
1 files changed, 35 insertions, 1 deletions
@@ -18,7 +18,6 @@ struct hashmap_entry { const void *key; void *value; - struct hashmap_entry *bucket_next, *bucket_previous; struct hashmap_entry *iterate_next, *iterate_previous; }; @@ -323,3 +322,38 @@ bool hashmap_isempty(Hashmap *h) { return h->n_entries == 0; } + +int hashmap_merge(Hashmap *h, Hashmap *other) { + struct hashmap_entry *e; + + assert(h); + + if (!other) + return 0; + + for (e = other->iterate_list_head; e; e = e->iterate_next) { + int r; + + if ((r = hashmap_put(h, e->key, e->value)) < 0) + if (r != -EEXIST) + return r; + } + + return 0; +} + +Hashmap *hashmap_copy(Hashmap *h) { + Hashmap *copy; + + assert(h); + + if (!(copy = hashmap_new(h->hash_func, h->compare_func))) + return NULL; + + if (hashmap_merge(copy, h) < 0) { + hashmap_free(copy); + return NULL; + } + + return copy; +} |