summaryrefslogtreecommitdiff
path: root/test/pkbktarr.c
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-08-26 13:23:37 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-08-26 13:23:37 -0400
commit78956339691db1fb0de02e63823dc9100c0cd7e7 (patch)
treebf8aef0abcbe2b55d19a3ba04e809c571a2c995e /test/pkbktarr.c
parent488ee1d60e32502645d4fce9a8261b012ec1ba6a (diff)
pkiter: add iterator for pkarr and pkbktarr
Diffstat (limited to 'test/pkbktarr.c')
-rw-r--r--test/pkbktarr.c133
1 files changed, 133 insertions, 0 deletions
diff --git a/test/pkbktarr.c b/test/pkbktarr.c
index 6767cbc..012bc90 100644
--- a/test/pkbktarr.c
+++ b/test/pkbktarr.c
@@ -1,5 +1,6 @@
#include "../pkmem.h"
+#define PK_IMPL_ITER
#define PK_IMPL_MEM
#define PK_IMPL_BKTARR
#include "../pkbktarr.h"
@@ -470,6 +471,138 @@ int main(int argc, char *argv[])
while (false);
test_teardown(&bkt_buckets, &bkt_data);
+ fprintf(stdout, "[%s] test iter forwards w/ empty slot begin\n", __FILE__);
+ test_spinup(&bkt_buckets, &bkt_data);
+ {
+ assert(bkt_buckets != nullptr);
+ assert(bkt_data != nullptr);
+ uint8_t u;
+ bool b;
+ struct pk_bkt_arr arr = {0};
+ struct pk_bkt_arr_handle h;
+ struct pk_bkt_arr_handle limits;
+ limits.b = 1;
+ limits.i = 5;
+
+ pk_bkt_arr_init(&arr, sizeof(uint8_t), alignof(uint8_t), limits, bkt_buckets, bkt_data);
+
+ for (u = 0; u < 5; ++u) {
+ h = pk_bkt_arr_new_handle(&arr);
+ uint8_t *typed_arr = (uint8_t*)arr.bucketed_data[h.b];
+ typed_arr[h.i] = u;
+ }
+
+ h.b = 0;
+ h.i = 2;
+ pk_bkt_arr_free_handle(&arr, h);
+
+ struct pk_iter it;
+ b = pk_bkt_arr_iter_begin(&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 != 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);
+
+ 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 != 3) exit(1);
+ if (*(uint8_t*)it.data != 3) 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 != 4) exit(1);
+ if (*(uint8_t*)it.data != 4) 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 == true) exit(1);
+
+ pk_bkt_arr_teardown(&arr);
+ }
+ fprintf(stdout, "[%s] test iter forwards w/ empty slot end\n\n", __FILE__);
+ test_teardown(&bkt_buckets, &bkt_data);
+
+ fprintf(stdout, "[%s] test iter reverse w/ empty slot begin\n", __FILE__);
+ test_spinup(&bkt_buckets, &bkt_data);
+ {
+ assert(bkt_buckets != nullptr);
+ assert(bkt_data != nullptr);
+ uint8_t u;
+ bool b;
+ struct pk_bkt_arr arr = {0};
+ struct pk_bkt_arr_handle h;
+ struct pk_bkt_arr_handle limits;
+ limits.b = 1;
+ limits.i = 5;
+
+ pk_bkt_arr_init(&arr, sizeof(uint8_t), alignof(uint8_t), limits, bkt_buckets, bkt_data);
+
+ for (u = 0; u < 5; ++u) {
+ h = pk_bkt_arr_new_handle(&arr);
+ uint8_t *typed_arr = (uint8_t*)arr.bucketed_data[h.b];
+ typed_arr[h.i] = u;
+ }
+
+ h.b = 0;
+ h.i = 2;
+ pk_bkt_arr_free_handle(&arr, h);
+
+ struct pk_iter it;
+ b = pk_bkt_arr_iter_end(&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 != 4) exit(1);
+ if (*(uint8_t*)it.data != 4) exit(1);
+ fprintf(stdout, "it.data: %p, val: %i\n", it.data, *(uint8_t*)it.data);
+
+ b = pk_bkt_arr_iter_decrement(&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 != 3) exit(1);
+ if (*(uint8_t*)it.data != 3) exit(1);
+ fprintf(stdout, "it.data: %p, val: %i\n", it.data, *(uint8_t*)it.data);
+
+ b = pk_bkt_arr_iter_decrement(&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);
+
+ b = pk_bkt_arr_iter_decrement(&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 != 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_decrement(&arr, &it);
+ if (b == true) exit(1);
+
+ pk_bkt_arr_teardown(&arr);
+ }
+ test_teardown(&bkt_buckets, &bkt_data);
+ fprintf(stdout, "[%s] test iter reverse w/ empty slot end\n\n", __FILE__);
+
return 0;
uncaught_err:
PK_LOGV_ERR("%s: failed to catch err.\n", __FILE__);