summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-05-28 12:48:28 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-05-28 12:48:28 -0400
commit5de82baf576996a85c9adc808f14d0c9f9cff3b3 (patch)
tree6105a0217b804cef0303a9145f75ffa98265ba3b
parent3612806d5ea470f5dd2fb5a6e7f5be9de716a67e (diff)
pkbktarr: change cb signatures to make use of pktmpln
-rw-r--r--pkbktarr.h17
-rw-r--r--test/pkbktarr.c14
-rw-r--r--test/pkbktarr.cpp82
3 files changed, 99 insertions, 14 deletions
diff --git a/pkbktarr.h b/pkbktarr.h
index a263f61..b041edc 100644
--- a/pkbktarr.h
+++ b/pkbktarr.h
@@ -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);
}