diff options
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/include/hashtbl.h | 5 | ||||
-rw-r--r-- | src/common/libalgo/hashtbl.c | 13 |
2 files changed, 18 insertions, 0 deletions
diff --git a/src/common/include/hashtbl.h b/src/common/include/hashtbl.h index 818cfa0..b9c7178 100644 --- a/src/common/include/hashtbl.h +++ b/src/common/include/hashtbl.h @@ -25,6 +25,11 @@ void hashtbl_remove(hashtbl_t* ht, const void* key); void* hashtbl_find(hashtbl_t* ht, const void* key); // null when not found void hashtbl_iter(hashtbl_t* ht, kv_iter_fun_t f); +// hashtbl_change is particular : +// - it does NOT call malloc and uses the existing hashtbl cell +// - it does NOT call the on_release fun on the previous element +bool hashtbl_change(hashtbl_t* ht, void* key, void* v); + size_t hashtbl_count(hashtbl_t* ht); /* vim: set ts=4 sw=4 tw=0 noet :*/ diff --git a/src/common/libalgo/hashtbl.c b/src/common/libalgo/hashtbl.c index f490632..f34c6d4 100644 --- a/src/common/libalgo/hashtbl.c +++ b/src/common/libalgo/hashtbl.c @@ -160,4 +160,17 @@ size_t hashtbl_count(hashtbl_t* ht) { return ht->nitems; } +bool hashtbl_change(hashtbl_t* ht, void* key, void* newval) { + size_t slot = SLOT_OF_HASH(ht->hf(key), ht->size); + + for (hashtbl_item_t *i = ht->items[slot]; i != 0; i = i->next) { + if (ht->ef(i->key, key)) { + i->val = newval; + return true; + } + } + + return false; +} + /* vim: set ts=4 sw=4 tw=0 noet :*/ |