From e4d0b636dd36c5af27d806363ab7a8ed13a91a43 Mon Sep 17 00:00:00 2001 From: "Sven M. Hallberg" <pesco@khjk.org> Date: Wed, 22 May 2013 21:57:46 +0200 Subject: [PATCH] add h_hashtable_merge function --- src/datastructures.c | 19 +++++++++++++++++++ src/internal.h | 2 ++ 2 files changed, 21 insertions(+) diff --git a/src/datastructures.c b/src/datastructures.c index ccd4c1d1..9d91540b 100644 --- a/src/datastructures.c +++ b/src/datastructures.c @@ -180,6 +180,25 @@ void h_hashtable_update(HHashTable *dst, const HHashTable *src) { } } +void h_hashtable_merge(void *(*combine)(void *v1, void *v2), + HHashTable *dst, const HHashTable *src) { + size_t i; + HHashTableEntry *hte; + for(i=0; i < src->capacity; i++) { + for(hte = &src->contents[i]; hte; hte = hte->next) { + if(hte->key == NULL) + continue; + void *oldvalue = h_hashtable_get(dst, hte->key); + void *newvalue; + if(oldvalue) + newvalue = combine(oldvalue, hte->value); + else + newvalue = hte->value; + h_hashtable_put(dst, hte->key, newvalue); + } + } +} + int h_hashtable_present(const HHashTable* ht, const void* key) { HHashValue hashval = ht->hashFunc(key); #ifdef CONSISTENCY_CHECK diff --git a/src/internal.h b/src/internal.h index a48fb29e..251b2c6d 100644 --- a/src/internal.h +++ b/src/internal.h @@ -254,6 +254,8 @@ HHashTable* h_hashtable_new(HArena *arena, HEqualFunc equalFunc, HHashFunc hashF void* h_hashtable_get(const HHashTable* ht, const void* key); void h_hashtable_put(HHashTable* ht, const void* key, void* value); void h_hashtable_update(HHashTable* dst, const HHashTable *src); +void h_hashtable_merge(void *(*combine)(void *v1, void *v2), + HHashTable *dst, const HHashTable *src); int h_hashtable_present(const HHashTable* ht, const void* key); void h_hashtable_del(HHashTable* ht, const void* key); void h_hashtable_free(HHashTable* ht); -- GitLab