let h_hashtable_merge's combine function decide what to do on NULL dst values

This commit is contained in:
Sven M. Hallberg 2013-05-24 22:29:33 +02:00
parent e4984fe60c
commit 3047fd223b
2 changed files with 5 additions and 9 deletions

View file

@ -200,7 +200,7 @@ void h_hashtable_update(HHashTable *dst, const HHashTable *src) {
} }
} }
void h_hashtable_merge(void *(*combine)(void *v1, void *v2), void h_hashtable_merge(void *(*combine)(void *v1, const void *v2),
HHashTable *dst, const HHashTable *src) { HHashTable *dst, const HHashTable *src) {
size_t i; size_t i;
HHashTableEntry *hte; HHashTableEntry *hte;
@ -208,13 +208,9 @@ void h_hashtable_merge(void *(*combine)(void *v1, void *v2),
for(hte = &src->contents[i]; hte; hte = hte->next) { for(hte = &src->contents[i]; hte; hte = hte->next) {
if(hte->key == NULL) if(hte->key == NULL)
continue; continue;
void *oldvalue = h_hashtable_get(dst, hte->key); void *dstvalue = h_hashtable_get(dst, hte->key);
void *newvalue; void *srcvalue = hte->value;
if(oldvalue) h_hashtable_put(dst, hte->key, combine(dstvalue, srcvalue));
newvalue = combine(oldvalue, hte->value);
else
newvalue = hte->value;
h_hashtable_put(dst, hte->key, newvalue);
} }
} }
} }

View file

@ -255,7 +255,7 @@ HHashTable* h_hashtable_new(HArena *arena, HEqualFunc equalFunc, HHashFunc hashF
void* h_hashtable_get(const HHashTable* ht, const void* key); void* h_hashtable_get(const HHashTable* ht, const void* key);
void h_hashtable_put(HHashTable* ht, const void* key, void* value); void h_hashtable_put(HHashTable* ht, const void* key, void* value);
void h_hashtable_update(HHashTable* dst, const HHashTable *src); void h_hashtable_update(HHashTable* dst, const HHashTable *src);
void h_hashtable_merge(void *(*combine)(void *v1, void *v2), void h_hashtable_merge(void *(*combine)(void *v1, const void *v2),
HHashTable *dst, const HHashTable *src); HHashTable *dst, const HHashTable *src);
int h_hashtable_present(const HHashTable* ht, const void* key); int h_hashtable_present(const HHashTable* ht, const void* key);
void h_hashtable_del(HHashTable* ht, const void* key); void h_hashtable_del(HHashTable* ht, const void* key);