diff --git a/src/datastructures.c b/src/datastructures.c index 5993e457ae99d1b1377b63c6cd768580222c7691..0077d6b5716c72e60940f4b992928a699aabd978 100644 --- a/src/datastructures.c +++ b/src/datastructures.c @@ -166,6 +166,16 @@ void h_hashtable_put(HHashTable* ht, const void* key, void* value) { hte->hashval = hashval; } +void h_hashtable_update(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) { + h_hashtable_put(dst, hte->key, hte->value); + } + } +} + int h_hashtable_present(HHashTable* ht, const void* key) { HHashValue hashval = ht->hashFunc(key); #ifdef CONSISTENCY_CHECK diff --git a/src/internal.h b/src/internal.h index d4ba829b6acf6b907ff2fc5ea99ce62cb70cb5cf..2ba6b22577cb8f855eb66f9b506a028cb1045cb5 100644 --- a/src/internal.h +++ b/src/internal.h @@ -250,6 +250,7 @@ void h_slist_free(HSlist *slist); HHashTable* h_hashtable_new(HArena *arena, HEqualFunc equalFunc, HHashFunc hashFunc); void* h_hashtable_get(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); int h_hashtable_present(HHashTable* ht, const void* key); void h_hashtable_del(HHashTable* ht, const void* key); void h_hashtable_free(HHashTable* ht); @@ -258,6 +259,7 @@ static inline bool h_hashtable_empty(HHashTable* ht) { return (ht->used == 0); } typedef HHashTable HHashSet; #define h_hashset_new(a,eq,hash) h_hashtable_new(a,eq,hash) #define h_hashset_put(ht,el) h_hashtable_put(ht, el, NULL) +#define h_hashset_put_all(a,b) h_hashtable_update(a, b) #define h_hashset_present(ht,el) h_hashtable_present(ht,el) #define h_hashset_empty(ht) h_hashtable_empty(ht) #define h_hashset_del(ht,el) h_hashtable_del(ht,el)