summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-09-09 15:45:56 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-09-09 15:45:56 -0400
commit848247d0aedc1ed971b5ee20920cbc32f7e62ecb (patch)
treed956b319fa3c004f112dfdc14c33098da36a12db
parent69fe8825407835b595537a17bf6c66dfc18b7b63 (diff)
pkbktarr: find first valid iter key on _begin
-rw-r--r--pkbktarr.h5
-rw-r--r--test/pkbktarr.c13
2 files changed, 9 insertions, 9 deletions
diff --git a/pkbktarr.h b/pkbktarr.h
index a833f87..a437e79 100644
--- a/pkbktarr.h
+++ b/pkbktarr.h
@@ -339,8 +339,11 @@ bool pk_bkt_arr_iter_begin(struct pk_bkt_arr *arr, struct pk_iter *it) {
it->data = nullptr;
it->id.bkt.b = 0;
it->id.bkt.i = 0;
+ if (arr->head_l.b == 0 && arr->head_l.i == 0 && (arr->head_l.b != arr->head_r.b || arr->head_l.i != arr->head_r.i)) {
+ return pk_bkt_arr_iter_increment(arr, it);
+ }
if ((arr->idx_unused[it->id.bkt.b] & (1ull << it->id.bkt.i)) != 0) return false;
- it->data = arr->bucketed_data[0];
+ it->data = (char*)(arr->bucketed_data[it->id.bkt.b]) + (arr->stride * it->id.bkt.i);
return true;
}
diff --git a/test/pkbktarr.c b/test/pkbktarr.c
index 012bc90..1b89b53 100644
--- a/test/pkbktarr.c
+++ b/test/pkbktarr.c
@@ -492,6 +492,11 @@ int main(int argc, char *argv[])
typed_arr[h.i] = u;
}
+ // remvoe first element
+ h.b = 0;
+ h.i = 0;
+ pk_bkt_arr_free_handle(&arr, h);
+
h.b = 0;
h.i = 2;
pk_bkt_arr_free_handle(&arr, h);
@@ -501,14 +506,6 @@ int main(int argc, char *argv[])
if (b == false) exit(1);
if (it.data == nullptr) exit(1);
if (it.id.bkt.b != 0) exit(1);
- if (it.id.bkt.i != 0) exit(1);
- if (*(uint8_t*)it.data != 0) exit(1);
- fprintf(stdout, "it.data: %p, val: %i\n", it.data, *(uint8_t*)it.data);
-
- b = pk_bkt_arr_iter_increment(&arr, &it);
- if (b == false) exit(1);
- if (it.data == nullptr) exit(1);
- if (it.id.bkt.b != 0) exit(1);
if (it.id.bkt.i != 1) exit(1);
if (*(uint8_t*)it.data != 1) exit(1);
fprintf(stdout, "it.data: %p, val: %i\n", it.data, *(uint8_t*)it.data);