summaryrefslogtreecommitdiff
path: root/map.c
diff options
context:
space:
mode:
authorCarson Fleming <[email protected]>2026-02-01 13:03:23 -0500
committerCarson Fleming <[email protected]>2026-02-01 13:03:23 -0500
commit947b06566a58b888ded37026f95cc53874adede1 (patch)
tree92470e833d3ce858d5bdfa2644618c32e91e95ac /map.c
parentbc002b326f3b2024ebb46ee195f00a6c46453f2e (diff)
downloadsafec-947b06566a58b888ded37026f95cc53874adede1.tar.gz
distinguish read-only vs readwrite foreach
Diffstat (limited to 'map.c')
-rw-r--r--map.c30
1 files changed, 28 insertions, 2 deletions
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);
+}