diff options
Diffstat (limited to 'map.c')
| -rw-r--r-- | map.c | 30 |
1 files changed, 28 insertions, 2 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); +} |
