diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-05-28 12:48:28 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-05-28 12:48:28 -0400 |
| commit | 5de82baf576996a85c9adc808f14d0c9f9cff3b3 (patch) | |
| tree | 6105a0217b804cef0303a9145f75ffa98265ba3b | |
| parent | 3612806d5ea470f5dd2fb5a6e7f5be9de716a67e (diff) | |
pkbktarr: change cb signatures to make use of pktmpln
| -rw-r--r-- | pkbktarr.h | 17 | ||||
| -rw-r--r-- | test/pkbktarr.c | 14 | ||||
| -rw-r--r-- | test/pkbktarr.cpp | 82 |
3 files changed, 99 insertions, 14 deletions
@@ -10,8 +10,8 @@ #define PK_BKT_ARR_HANDLE_B_MAX 0xFFFFFF #define PK_BKT_ARR_HANDLE_I_MAX 64 -typedef bool (pk_bkt_arr_compare_fn)(void *user_data, void *obj_data); -typedef void (pk_bkt_arr_iterate_fn)(void *obj_data); +typedef bool (pk_bkt_arr_compare_fn)(void *user_data, const void *user_obj_data, const void *arr_obj_data); +typedef void (pk_bkt_arr_iterate_fn)(void *user_data, void *arr_obj_data); struct pk_bkt_arr_handle { unsigned int b : 24; @@ -41,8 +41,8 @@ enum PK_BKT_ARR_HANDLE_VALIDATION pk_bkt_arr_handle_validate(struct pk_bkt_arr * void pk_bkt_arr_init(struct pk_bkt_arr *bkt_arr, unsigned long stride, unsigned long alignment, struct pk_bkt_arr_handle limits, struct pk_membucket *bkt_buckets, struct pk_membucket *bkt_data); void pk_bkt_arr_clear(struct pk_bkt_arr *bkt_arr); -struct pk_bkt_arr_handle pk_bkt_arr_find_first_handle(struct pk_bkt_arr *bkt_arr, void *user_data, pk_bkt_arr_compare_fn fn); -void pk_bkt_arr_iterate(struct pk_bkt_arr *bkt_arr, pk_bkt_arr_iterate_fn fn); +struct pk_bkt_arr_handle pk_bkt_arr_find_first_handle(struct pk_bkt_arr *bkt_arr, pk_bkt_arr_compare_fn fn, void *user_data, const void *user_obj_data); +void pk_bkt_arr_iterate(struct pk_bkt_arr *bkt_arr, pk_bkt_arr_iterate_fn fn, void *user_data); void pk_bkt_arr_teardown(struct pk_bkt_arr *bkt_arr); struct pk_bkt_arr_handle pk_bkt_arr_new_handle(struct pk_bkt_arr *bkt_arr); void pk_bkt_arr_free_handle(struct pk_bkt_arr *bkt_arr, struct pk_bkt_arr_handle handle); @@ -52,6 +52,7 @@ struct pk_bkt_arr_handle pk_bkt_arr_handle_decrement(struct pk_bkt_arr *arr, str #if defined (__cplusplus) #include <assert.h> +#include <future> template<typename T> struct pk_bkt_arr_t : public pk_bkt_arr { pk_bkt_arr_t(); @@ -136,7 +137,7 @@ void pk_bkt_arr_clear(struct pk_bkt_arr *bkt_arr) { } } -struct pk_bkt_arr_handle pk_bkt_arr_find_first_handle(struct pk_bkt_arr *bkt_arr, void *user_data, pk_bkt_arr_compare_fn fn) { +struct pk_bkt_arr_handle pk_bkt_arr_find_first_handle(struct pk_bkt_arr *bkt_arr, pk_bkt_arr_compare_fn fn, void *user_data, const void *user_obj_data) { assert(bkt_arr != NULL); assert(fn != NULL); struct pk_bkt_arr_handle ret; @@ -150,7 +151,7 @@ struct pk_bkt_arr_handle pk_bkt_arr_find_first_handle(struct pk_bkt_arr *bkt_arr if (PK_HAS_FLAG(bkt_arr->idx_unused[b], 1ull << i)) { continue; } - if (fn(user_data, arr+(bkt_arr->stride * i))) { + if (fn(user_data, user_obj_data, arr+(bkt_arr->stride * i))) { ret.b = b; ret.i = i; return ret; @@ -160,7 +161,7 @@ struct pk_bkt_arr_handle pk_bkt_arr_find_first_handle(struct pk_bkt_arr *bkt_arr return ret; } -void pk_bkt_arr_iterate(struct pk_bkt_arr *bkt_arr, pk_bkt_arr_iterate_fn fn) { +void pk_bkt_arr_iterate(struct pk_bkt_arr *bkt_arr, pk_bkt_arr_iterate_fn fn, void *user_data) { assert(bkt_arr != NULL); assert(fn != NULL); unsigned int b, i, ii; @@ -171,7 +172,7 @@ void pk_bkt_arr_iterate(struct pk_bkt_arr *bkt_arr, pk_bkt_arr_iterate_fn fn) { if (PK_HAS_FLAG(bkt_arr->idx_unused[b], 1ull << i)) { continue; } - fn(arr+(bkt_arr->stride * i)); + fn(user_data, arr+(bkt_arr->stride * i)); } } } diff --git a/test/pkbktarr.c b/test/pkbktarr.c index 55cf3df..9a93b4c 100644 --- a/test/pkbktarr.c +++ b/test/pkbktarr.c @@ -23,14 +23,16 @@ exit(int code) } } -bool find_int_val(void *user_data, void *arr_item) { - int lhs = *((int*)user_data); - int rhs = *((int*)arr_item); +bool find_int_val(void *user_data, const void *user_obj_data, const void *arr_obj_data) { + (void)user_data; + int lhs = *((int*)user_obj_data); + int rhs = *((int*)arr_obj_data); return lhs == rhs; } static int global_counter = 0; -void iter(void *arr_item) { +void iter(void *user_data, void *arr_item) { + (void)user_data; (void)arr_item; global_counter += 1; } @@ -206,7 +208,7 @@ int main(int argc, char *argv[]) int val = 69; ((int**)arr.bucketed_data)[h.b][h.i] = val; - struct pk_bkt_arr_handle found_h = pk_bkt_arr_find_first_handle(&arr, &val, find_int_val); + struct pk_bkt_arr_handle found_h = pk_bkt_arr_find_first_handle(&arr, find_int_val, NULL, &val); if (pk_bkt_arr_handle_compare(h, found_h) != 0) exit(1); pk_bkt_arr_teardown(&arr); @@ -236,7 +238,7 @@ int main(int argc, char *argv[]) if (bkt_buckets->allocs != 2) exit(1); if (bkt_data->allocs != 1) exit(1); - pk_bkt_arr_iterate(&arr, iter); + pk_bkt_arr_iterate(&arr, iter, NULL); if (global_counter != 1) exit(1); pk_bkt_arr_teardown(&arr); diff --git a/test/pkbktarr.cpp b/test/pkbktarr.cpp index 8d691eb..2069c8b 100644 --- a/test/pkbktarr.cpp +++ b/test/pkbktarr.cpp @@ -1,5 +1,6 @@ #include "../pkmem.h" +#include "../pktmpln.h" #define PK_IMPL_MEM #define PK_IMPL_BKTARR #include "../pkbktarr.h" @@ -63,4 +64,85 @@ int main(int argc, char *argv[]) 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_handle limits; + limits.b = PK_BKT_ARR_HANDLE_B_MAX; + limits.i = PK_BKT_ARR_HANDLE_I_MAX; + struct pk_bkt_arr_t<int> arr(limits, 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<bool, const int*, const int*, const void*, const void*>; + 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<int>(); + 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_handle limits; + limits.b = PK_BKT_ARR_HANDLE_B_MAX; + limits.i = PK_BKT_ARR_HANDLE_I_MAX; + struct pk_bkt_arr_t<int> arr(limits, 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<void, int*, void*>; + 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<int>(); + if (bkt_buckets->allocs != 0) exit(1); + if (bkt_data->allocs != 0) exit(1); + } + test_teardown(&bkt_buckets, &bkt_data); } |
