diff options
Diffstat (limited to 'test/pkbktarr.cpp')
| -rw-r--r-- | test/pkbktarr.cpp | 140 |
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__); } |
