summaryrefslogtreecommitdiff
path: root/src/runtime/c/gu
diff options
context:
space:
mode:
authorkrangelov <kr.angelov@gmail.com>2019-08-30 13:31:19 +0200
committerkrangelov <kr.angelov@gmail.com>2019-08-30 13:31:19 +0200
commit59a6e3cfdd855df7c239a2ec13cd70c24dd1d0a2 (patch)
treea42af85811a217bfcde9dd809c8e5e7610c27a6a /src/runtime/c/gu
parent1e8d684f9af9bab29461ace0f015ceb06fdee04e (diff)
fix gu_map_next
Diffstat (limited to 'src/runtime/c/gu')
-rw-r--r--src/runtime/c/gu/map.c20
-rw-r--r--src/runtime/c/gu/map.h2
2 files changed, 13 insertions, 9 deletions
diff --git a/src/runtime/c/gu/map.c b/src/runtime/c/gu/map.c
index be7228b74..dc19bc932 100644
--- a/src/runtime/c/gu/map.c
+++ b/src/runtime/c/gu/map.c
@@ -322,21 +322,25 @@ gu_map_iter(GuMap* map, GuMapItor* itor, GuExn* err)
}
GU_API bool
-gu_map_next(GuMap* map, size_t i, const void** pkey, void** pvalue)
+gu_map_next(GuMap* map, size_t* pi, void** pkey, void* pvalue)
{
- while (i < map->data.n_entries) {
- if (gu_map_entry_is_free(map, &map->data, i)) {
- i++;
+ while (*pi < map->data.n_entries) {
+ if (gu_map_entry_is_free(map, &map->data, *pi)) {
+ (*pi)++;
continue;
}
- *pkey = &map->data.keys[i * map->key_size];
- *pvalue = &map->data.values[i * map->cell_size];
+ *pkey = &map->data.keys[*pi * map->key_size];
if (map->hasher == gu_addr_hasher) {
- *pkey = *(const void* const*) *pkey;
+ *pkey = *(void**) *pkey;
} else if (map->hasher == gu_string_hasher) {
- *pkey = *(GuString*) *pkey;
+ *pkey = *(void**) *pkey;
}
+
+ memcpy(pvalue, &map->data.values[*pi * map->cell_size],
+ map->value_size);
+
+ (*pi)++;
return true;
}
diff --git a/src/runtime/c/gu/map.h b/src/runtime/c/gu/map.h
index b0fc17303..cc91a27f7 100644
--- a/src/runtime/c/gu/map.h
+++ b/src/runtime/c/gu/map.h
@@ -75,7 +75,7 @@ GU_API_DECL void
gu_map_iter(GuMap* ht, GuMapItor* itor, GuExn* err);
GU_API bool
-gu_map_next(GuMap* ht, size_t i, const void** pkey, void** pvalue);
+gu_map_next(GuMap* map, size_t* pi, void** pkey, void* pvalue);
typedef GuMap GuIntMap;