Fix copying hashmaps
- len == 0 wasn't handled propery - Incorrect source k/v address - New object was never returned m(
This commit is contained in:
parent
ce37113f93
commit
2684f1e61e
1 changed files with 13 additions and 7 deletions
|
|
@ -341,6 +341,10 @@ apfl_hashmap_copy(apfl_hashmap src)
|
|||
struct bucket *dstbucket = &dst->buckets[i];
|
||||
size_t len = srcbucket->len;
|
||||
|
||||
if (len == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
dstbucket->keys = malloc(keysize * len);
|
||||
dstbucket->values = malloc(valsize * len);
|
||||
if (dstbucket->keys == NULL || dstbucket->values == NULL) {
|
||||
|
|
@ -354,23 +358,25 @@ apfl_hashmap_copy(apfl_hashmap src)
|
|||
|
||||
dstbucket->cap = len;
|
||||
|
||||
for (; dstbucket->len < len; dstbucket->len++) {
|
||||
void *keyaddr = KVADDR(dstbucket->keys, keysize, dstbucket->len);
|
||||
|
||||
for (size_t j = 0; j < len; j++) {
|
||||
copy_key(
|
||||
dst,
|
||||
keyaddr,
|
||||
KVADDR(srcbucket->keys, keysize, srcbucket->len)
|
||||
KVADDR(dstbucket->keys, keysize, j),
|
||||
KVADDR(srcbucket->keys, keysize, j)
|
||||
);
|
||||
|
||||
copy_value(
|
||||
dst,
|
||||
KVADDR(dstbucket->values, valsize, dstbucket->len),
|
||||
KVADDR(srcbucket->values, valsize, srcbucket->len)
|
||||
KVADDR(dstbucket->values, valsize, j),
|
||||
KVADDR(srcbucket->values, valsize, j)
|
||||
);
|
||||
|
||||
dstbucket->len++;
|
||||
}
|
||||
}
|
||||
|
||||
return dst;
|
||||
|
||||
fail:
|
||||
apfl_hashmap_destroy(dst);
|
||||
return NULL;
|
||||
|
|
|
|||
Loading…
Reference in a new issue