aboutsummaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/common')
-rw-r--r--src/common/include/hashtbl.h5
-rw-r--r--src/common/libalgo/hashtbl.c13
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 :*/