summaryrefslogtreecommitdiff
path: root/test/pkbktarr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/pkbktarr.cpp')
-rw-r--r--test/pkbktarr.cpp140
1 files changed, 140 insertions, 0 deletions
diff --git a/test/pkbktarr.cpp b/test/pkbktarr.cpp
index 23a7132..db30e56 100644
--- a/test/pkbktarr.cpp
+++ b/test/pkbktarr.cpp
@@ -1,6 +1,7 @@
#include "../pkmem.h"
#include "../pktmpln.h"
+#define PK_IMPL_ITER
#define PK_IMPL_MEM
#define PK_IMPL_BKTARR
#include "../pkbktarr.h"
@@ -135,4 +136,143 @@ int main(int argc, char *argv[])
if (bkt_data->alloc_count != 0) exit(1);
}
test_teardown(&bkt_buckets, &bkt_data);
+
+ // test pointers
+ test_spinup(&bkt_buckets, &bkt_data);
+ {
+ assert(bkt_buckets != nullptr);
+ assert(bkt_data != nullptr);
+ const int base_array_len = 16;
+ int i;
+ struct pk_bkt_arr_t<int *> arr(pk_bkt_arr_handle_MAX_constexpr, bkt_buckets, bkt_data);
+
+ for (i = 0; i < base_array_len; ++i) {
+ auto handle = pk_bkt_arr_new_handle(&arr);
+ arr[handle] = new int{i};
+ }
+
+ pk_bkt_arr_t<int*>::FN_Iter cb_wrapper{};
+ i = 0;
+ cb_wrapper.func = [&i](int **lhs)
+ {
+ int *val_ptr = *lhs;
+ int val = *val_ptr;
+ if (val != i) {
+ fprintf(stderr, "[pkbktarr.cpp] int pointer did not match, expected: %i, got: %i", i, val);
+ exit(1);
+ }
+ i += 1;
+ return;
+ };
+ pk_bkt_arr_iterate(&arr, &pk_bkt_arr_t<int>::FN_Iter::invoke, &cb_wrapper);
+
+ arr.~pk_bkt_arr_t<int*>();
+ if (bkt_buckets->alloc_count != 0) exit(1);
+ if (bkt_data->alloc_count != 0) exit(1);
+ }
+ 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, uu;
+ bool b;
+ struct pk_bkt_arr_handle h;
+ struct pk_bkt_arr_handle limits;
+ limits.b = 2;
+ limits.i = 5;
+ struct pk_bkt_arr_t<uint8_t> arr(limits, bkt_buckets, bkt_data);
+
+ for (u = 0; u < limits.b; ++u) {
+ for (uu = 0; uu < limits.i; ++uu) {
+ h = pk_bkt_arr_new_handle(&arr);
+ arr[h] = uu;
+ }
+ }
+
+ h.b = 0;
+ h.i = 2;
+ pk_bkt_arr_free_handle(&arr, h);
+ h.b = 1;
+ pk_bkt_arr_free_handle(&arr, h);
+
+ struct pk_iter_t<uint8_t> it;
+
+ for (u = 0; u < limits.b; ++u) {
+ for (uu = 0; uu < limits.i; ++uu) {
+ if (uu == 2) continue;
+ if (u == 0 && uu == 0) {
+ b = pk_bkt_arr_iter_begin(&arr, &it);
+ } else {
+ b = pk_bkt_arr_iter_increment(&arr, &it);
+ }
+ if (b == false) exit(1);
+ fprintf(stdout, "it.data: %p, val: %i\n", it.data, *(uint8_t*)it.data);
+ if (it.id.bkt.b != u) exit(1);
+ if (it.id.bkt.i != uu) exit(1);
+ if (it != uu) exit(1);
+ }
+ }
+
+ 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, uu;
+ bool b;
+ struct pk_bkt_arr_handle h;
+ struct pk_bkt_arr_handle limits;
+ limits.b = 2;
+ limits.i = 5;
+ pk_bkt_arr_t<uint8_t> arr(limits, bkt_buckets, bkt_data);
+
+ for (u = 0; u < 5; ++u) {
+ for (uu = 0; uu < 5; ++uu) {
+ h = pk_bkt_arr_new_handle(&arr);
+ arr[h] = uu;
+ }
+ }
+
+ h.b = 0;
+ h.i = 2;
+ pk_bkt_arr_free_handle(&arr, h);
+ h.b = 1;
+ pk_bkt_arr_free_handle(&arr, h);
+
+ struct pk_iter_t<uint8_t> it;
+
+ for (u = limits.b; u > 0; --u) {
+ for (uu = limits.i; uu > 0; --uu) {
+ if (uu-1 == 2) continue;
+ if (u == limits.b && uu == limits.i) {
+ b = pk_bkt_arr_iter_end(&arr, &it);
+ } else {
+ b = pk_bkt_arr_iter_decrement(&arr, &it);
+ }
+ if (b == false) exit(1);
+ fprintf(stdout, "it.data: %p, val: %i\n", it.data, *(uint8_t*)it.data);
+ if (it.id.bkt.b != u-1) exit(1);
+ if (it.id.bkt.i != uu-1) exit(1);
+ if (it != uu-1) exit(1);
+ }
+ }
+
+ 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__);
}