#include "../pkmem.h" #include "../pktmpln.h" #define PK_IMPL_MEM #define PK_IMPL_BKTARR #include "../pkbktarr.h" void test_spinup(struct pk_membucket **bkt_buckets, struct pk_membucket **bkt_data) { *bkt_buckets = pk_bucket_create("buckets", 1 << 16, false); *bkt_data = pk_bucket_create("data", 1 << 16, false); } void test_teardown(struct pk_membucket **bkt_buckets, struct pk_membucket **bkt_data) { // reverse order pk_bucket_destroy(*bkt_data); pk_bucket_destroy(*bkt_buckets); *bkt_buckets = nullptr; *bkt_data = nullptr; } int main(int argc, char *argv[]) { (void)argc; (void)argv; struct pk_membucket *bkt_buckets = nullptr; struct pk_membucket *bkt_data = nullptr; // test it works test_spinup(&bkt_buckets, &bkt_data); { assert(bkt_buckets != nullptr); assert(bkt_data != nullptr); struct pk_bkt_arr_t arr(pk_bkt_arr_handle_MAX_constexpr, bkt_buckets, bkt_data); struct pk_bkt_arr_handle h = pk_bkt_arr_new_handle(&arr); arr[h] = 128; if (h.b != 0) exit(1); if (h.i != 0) exit(1); if (arr.head_l.b != 0) exit(1); if (arr.head_l.i != 1) exit(1); if (arr.head_r.b != 0) exit(1); if (arr.head_r.i != 1) exit(1); if (arr.idx_unused[0] != 0xFFFFFFFFFFFFFFFE) exit(1); if (bkt_buckets->allocs != 2) exit(1); if (bkt_data->allocs != 1) exit(1); if (arr[h] != 128) exit(1); pk_bkt_arr_free_handle(&arr, h); if (arr.head_l.b != 0) exit(1); if (arr.head_l.i != 0) exit(1); if (arr.head_r.b != 0) exit(1); if (arr.head_r.i != 1) exit(1); if (arr.idx_unused[0] != 0xFFFFFFFFFFFFFFFF) exit(1); if (bkt_buckets->allocs != 2) exit(1); if (bkt_data->allocs != 1) exit(1); arr.~pk_bkt_arr_t(); if (bkt_buckets->allocs != 0) exit(1); if (bkt_data->allocs != 0) exit(1); } test_teardown(&bkt_buckets, &bkt_data); // test typed find first index test_spinup(&bkt_buckets, &bkt_data); { assert(bkt_buckets != nullptr); assert(bkt_data != nullptr); struct pk_bkt_arr_t arr(pk_bkt_arr_handle_MAX_constexpr, bkt_buckets, bkt_data); int val = 128; struct pk_bkt_arr_handle h = pk_bkt_arr_new_handle(&arr); arr[h] = val; if (h.b != 0) exit(1); if (h.i != 0) exit(1); if (arr.head_l.b != 0) exit(1); if (arr.head_l.i != 1) exit(1); if (arr.head_r.b != 0) exit(1); if (arr.head_r.i != 1) exit(1); if (arr.idx_unused[0] != 0xFFFFFFFFFFFFFFFE) exit(1); if (bkt_buckets->allocs != 2) exit(1); if (bkt_data->allocs != 1) exit(1); if (arr[h] != val) exit(1); using CompCbWrapper = pk_tmpln_2; CompCbWrapper cb_wrapper{}; cb_wrapper.func = [](const int *lhs, const int *rhs) { return *lhs == *rhs; }; pk_bkt_arr_handle found_h = pk_bkt_arr_find_first_handle(&arr, &CompCbWrapper::invoke, &cb_wrapper, &val); if (pk_bkt_arr_handle_compare(found_h, h) != 0) exit(1); arr.~pk_bkt_arr_t(); if (bkt_buckets->allocs != 0) exit(1); if (bkt_data->allocs != 0) exit(1); } test_teardown(&bkt_buckets, &bkt_data); // test iter test_spinup(&bkt_buckets, &bkt_data); { assert(bkt_buckets != nullptr); assert(bkt_data != nullptr); struct pk_bkt_arr_t arr(pk_bkt_arr_handle_MAX_constexpr, bkt_buckets, bkt_data); int val = 128; struct pk_bkt_arr_handle h = pk_bkt_arr_new_handle(&arr); arr[h] = val; if (h.b != 0) exit(1); if (h.i != 0) exit(1); if (arr.head_l.b != 0) exit(1); if (arr.head_l.i != 1) exit(1); if (arr.head_r.b != 0) exit(1); if (arr.head_r.i != 1) exit(1); if (arr.idx_unused[0] != 0xFFFFFFFFFFFFFFFE) exit(1); if (bkt_buckets->allocs != 2) exit(1); if (bkt_data->allocs != 1) exit(1); if (arr[h] != val) exit(1); int some_counter = 0; using IterCbWrapper = pk_tmpln_1; IterCbWrapper cb_wrapper{}; cb_wrapper.func = [&some_counter](int *lhs) { (void)lhs; some_counter += 1; return; }; pk_bkt_arr_iterate(&arr, &IterCbWrapper::invoke, &cb_wrapper); if (some_counter != 1) exit(1); arr.~pk_bkt_arr_t(); if (bkt_buckets->allocs != 0) exit(1); if (bkt_data->allocs != 0) exit(1); } test_teardown(&bkt_buckets, &bkt_data); }