summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--map.c30
-rw-r--r--map.h9
2 files changed, 33 insertions, 6 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);
+}
diff --git a/map.h b/map.h
index 466ed25..4cc0194 100644
--- a/map.h
+++ b/map.h
@@ -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