aboutsummaryrefslogtreecommitdiff
path: root/src/hashmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/hashmap.c')
-rw-r--r--src/hashmap.c47
1 files changed, 24 insertions, 23 deletions
diff --git a/src/hashmap.c b/src/hashmap.c
index 2787435..6b51d3e 100644
--- a/src/hashmap.c
+++ b/src/hashmap.c
@@ -215,37 +215,38 @@ hashmap_remove(struct hashmap *hm, const char *key)
return NULL;
}
+#define HASHMAP_WALK(hm, ...) \
+ struct node *node; \
+ struct node *next; \
+ for (size_t i = 0; i < hm->cur_cap; i++) { \
+ node = hm->buckets[i]; \
+ while (node) { \
+ next = node->next; \
+ __VA_ARGS__; \
+ node = next; \
+ } \
+ }
+
void
-hashmap_walk(struct hashmap *hm, void (*fn)(const void *key, void *value))
+hashmap_walk(struct hashmap *hm, hashmap_cb cb)
{
- struct node *node;
- struct node *next;
+ HASHMAP_WALK(hm, cb(node->key, node->value));
+}
- for (int i=0; i < hm->cur_cap; i++) {
- node = hm->buckets[i];
- while (node) {
- next = node->next;
- fn(node->key, node->value);
- node = next;
- }
- }
+void
+hashmap_destroy(struct hashmap *hm, hashmap_cb cb)
+{
+ HASHMAP_WALK(hm, cb(node->key, node->value), free(node));
+
+ free(hm->buckets);
+ free(hm);
}
void
hashmap_free(struct hashmap *hm)
{
- struct node *node;
- struct node *next;
-
- for (int i=0; i < hm->cur_cap; i++) {
- node = hm->buckets[i];
- while (node) {
- next = node->next;
- free(node);
- node = next;
- }
- }
+ HASHMAP_WALK(hm, free(node));
free(hm->buckets);
- free(hm);
+ free(hm);
}