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