diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-08-26 13:23:37 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-08-26 13:23:37 -0400 |
| commit | 78956339691db1fb0de02e63823dc9100c0cd7e7 (patch) | |
| tree | bf8aef0abcbe2b55d19a3ba04e809c571a2c995e /test/pkbktarr.c | |
| parent | 488ee1d60e32502645d4fce9a8261b012ec1ba6a (diff) | |
pkiter: add iterator for pkarr and pkbktarr
Diffstat (limited to 'test/pkbktarr.c')
| -rw-r--r-- | test/pkbktarr.c | 133 |
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__); |
