From 947b06566a58b888ded37026f95cc53874adede1 Mon Sep 17 00:00:00 2001 From: Carson Fleming Date: Sun, 1 Feb 2026 13:03:23 -0500 Subject: distinguish read-only vs readwrite foreach --- map.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) (limited to 'map.c') diff --git a/map.c b/map.c index 42882d0..41ab5ed 100644 --- a/map.c +++ b/map.c @@ -163,8 +163,8 @@ void* map_remove(map_t* map, const void* key) { return rv; } -void map_foreach(map_t* map, foreach_func_t foreach_func, void* data) { - for (size_t i = 0; i < map->__num_buckets; i++) { +void map_foreach_readonly(map_t* map, foreach_func_t foreach_func, void* data) { + for (size_t i = 0; i < map->size; i++) { struct __map_entry* entry = &map->__buckets[i]; while (entry->next != NULL) { foreach_func(entry->key, entry->value, data); @@ -172,3 +172,29 @@ void map_foreach(map_t* map, foreach_func_t foreach_func, void* data) { } } } + +void map_foreach_readwrite( + map_t* map, + foreach_func_t foreach_func, + void* data +) { + void** keys = malloc(map->size * sizeof(void*)); + void** vals = malloc(map->size * sizeof(void*)); + size_t idx = 0; + + for (size_t i = 0; i < map->__num_buckets; i++) { + struct __map_entry* entry = &map->__buckets[i]; + while (entry->next != NULL) { + keys[idx] = entry->key; + vals[idx++] = entry->value; + entry = entry->next; + } + } + + for (size_t i = 0; i < idx; i++) { + foreach_func(keys[i], vals[i], data); + } + + free(keys); + free(vals); +} -- cgit v1.2.3