diff options
| author | Carson Fleming <[email protected]> | 2026-02-01 13:03:23 -0500 |
|---|---|---|
| committer | Carson Fleming <[email protected]> | 2026-02-01 13:03:23 -0500 |
| commit | 947b06566a58b888ded37026f95cc53874adede1 (patch) | |
| tree | 92470e833d3ce858d5bdfa2644618c32e91e95ac | |
| parent | bc002b326f3b2024ebb46ee195f00a6c46453f2e (diff) | |
| download | safec-947b06566a58b888ded37026f95cc53874adede1.tar.gz | |
distinguish read-only vs readwrite foreach
| -rw-r--r-- | map.c | 30 | ||||
| -rw-r--r-- | map.h | 9 |
2 files changed, 33 insertions, 6 deletions
@@ -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); +} @@ -3,9 +3,9 @@ size_t hash_bytes(const void* start, size_t size); -typedef size_t (*hash_func_t)(const void*); -typedef bool (*eq_func_t)(const void*, const void*); -typedef void (*foreach_func_t)(const void*, void*, void*); +typedef size_t (*hash_func_t)(const void* key); +typedef bool (*eq_func_t)(const void* key1, const void* key2); +typedef void (*foreach_func_t)(void* key, void* val, void* data); struct __map_entry { void* key; @@ -43,6 +43,7 @@ void* map_get_or_default(const map_t* map, const void* key, void* default_val); void* map_compute_if_absent(map_t* map, void* key, void* default_val); void map_put(map_t* map, void* key, void* val); void* map_remove(map_t* map, const void* key); -void map_foreach(map_t* map, foreach_func_t foreach_func, void* data); +void map_foreach_readonly(map_t* map, foreach_func_t foreach_func, void* data); +void map_foreach_readwrite(map_t* map, foreach_func_t foreach_func, void* data); #endif |
