From 78956339691db1fb0de02e63823dc9100c0cd7e7 Mon Sep 17 00:00:00 2001 From: Jonathan Bradley Date: Tue, 26 Aug 2025 13:23:37 -0400 Subject: pkiter: add iterator for pkarr and pkbktarr --- test/pkarr.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 99 insertions(+), 2 deletions(-) (limited to 'test/pkarr.c') diff --git a/test/pkarr.c b/test/pkarr.c index 74ff27d..25ae171 100644 --- a/test/pkarr.c +++ b/test/pkarr.c @@ -1,6 +1,7 @@ // NOTE: only intended for performance testing // TODO: move flag to compiler and run tests more than once for full coverage +#define PK_IMPL_ITER #define PK_ARR_MOVE_IN_PLACE #define PK_IMPL_MEM #define PK_IMPL_ARR @@ -13,8 +14,8 @@ * When compiling with `-O3`, one (or maybe more?) of the tests fails * The issue is resolved now; leaving this for testing purposes. */ -#undef PK_LOGV_INF -#define PK_LOGV_INF(str, ...) (void)str +// #undef PK_LOGV_INF +// #define PK_LOGV_INF(str, ...) (void)str struct some_complex_struct { char uhh; @@ -307,5 +308,101 @@ int main(int argc, char *argv[]) } PK_LOGV_INF("%s", "[init via append, soft clear] end\n\n"); + PK_LOGV_INF("%s", "[iter forward] begin\n"); + { + bool res; + test_spinup(&arr, &bkt); + arr.stride = sizeof(uint8_t); + arr.alignment = alignof(uint8_t); + + for (i = 4; i > 0; --i) { + uint8_t u = (uint8_t)i - 1; + pk_arr_append(&arr, &u); + } + + struct pk_iter it; + res = pk_arr_iter_begin(&arr, &it); + if (res == false) exit(1); + if (it.data == nullptr) exit(1); + if (it.id.arr.i != 0) exit(1); + if (*(uint8_t*)it.data != 3) exit(1); + PK_LOGV_INF("iter.data: %p iter.val: %i\n", it.data, *(uint8_t*)it.data); + + res = pk_arr_iter_increment(&arr, &it); + if (res == false) exit(1); + if (it.data == nullptr) exit(1); + if (it.id.arr.i != 1) exit(1); + if (*(uint8_t*)it.data != 2) exit(1); + PK_LOGV_INF("iter.data: %p iter.val: %i\n", it.data, *(uint8_t*)it.data); + + res = pk_arr_iter_increment(&arr, &it); + if (res == false) exit(1); + if (it.data == nullptr) exit(1); + if (it.id.arr.i != 2) exit(1); + if (*(uint8_t*)it.data != 1) exit(1); + PK_LOGV_INF("iter.data: %p iter.val: %i\n", it.data, *(uint8_t*)it.data); + + res = pk_arr_iter_increment(&arr, &it); + if (res == false) exit(1); + if (it.data == nullptr) exit(1); + if (it.id.arr.i != 3) exit(1); + if (*(uint8_t*)it.data != 0) exit(1); + PK_LOGV_INF("iter.data: %p iter.val: %i\n", it.data, *(uint8_t*)it.data); + + res = pk_arr_iter_increment(&arr, &it); + if (res == true) exit(1); + + test_teardown(&arr, &bkt); + } + PK_LOGV_INF("%s", "[iter forward] end\n\n"); + + PK_LOGV_INF("%s", "[iter reverse] begin\n"); + { + bool res; + test_spinup(&arr, &bkt); + arr.stride = sizeof(uint8_t); + arr.alignment = alignof(uint8_t); + + for (i = 4; i > 0; --i) { + uint8_t u = (uint8_t)i - 1; + pk_arr_append(&arr, &u); + } + + struct pk_iter it; + res = pk_arr_iter_end(&arr, &it); + if (res == false) exit(1); + if (it.data == nullptr) exit(1); + if (it.id.arr.i != 3) exit(1); + if (*(uint8_t*)it.data != 0) exit(1); + PK_LOGV_INF("iter.data: %p iter.val: %i\n", it.data, *(uint8_t*)it.data); + + res = pk_arr_iter_decrement(&arr, &it); + if (res == false) exit(1); + if (it.data == nullptr) exit(1); + if (it.id.arr.i != 2) exit(1); + if (*(uint8_t*)it.data != 1) exit(1); + PK_LOGV_INF("iter.data: %p iter.val: %i\n", it.data, *(uint8_t*)it.data); + + res = pk_arr_iter_decrement(&arr, &it); + if (res == false) exit(1); + if (it.data == nullptr) exit(1); + if (it.id.arr.i != 1) exit(1); + if (*(uint8_t*)it.data != 2) exit(1); + PK_LOGV_INF("iter.data: %p iter.val: %i\n", it.data, *(uint8_t*)it.data); + + res = pk_arr_iter_decrement(&arr, &it); + if (res == false) exit(1); + if (it.data == nullptr) exit(1); + if (it.id.arr.i != 0) exit(1); + if (*(uint8_t*)it.data != 3) exit(1); + PK_LOGV_INF("iter.data: %p iter.val: %i\n", it.data, *(uint8_t*)it.data); + + res = pk_arr_iter_decrement(&arr, &it); + if (res == true) exit(1); + + test_teardown(&arr, &bkt); + } + PK_LOGV_INF("%s", "[iter reverse] end\n\n"); + return 0; } -- cgit v1.2.3