summaryrefslogtreecommitdiff
path: root/test/pkbktarr.cpp
blob: 23a7132213e31bb728d7865e1caf7a0bbd581637 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138

#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_mem_bucket_create("buckets", 1 << 16, PK_MEMBUCKET_FLAG_NONE);
	*bkt_data = pk_mem_bucket_create("data", 1 << 16, PK_MEMBUCKET_FLAG_NONE);
}

void test_teardown(struct pk_membucket **bkt_buckets, struct pk_membucket **bkt_data)
{
	// reverse order
	pk_mem_bucket_destroy(*bkt_data);
	pk_mem_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<int> 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->alloc_count != 2) exit(1);
		if (bkt_data->alloc_count != 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->alloc_count != 2) exit(1);
		if (bkt_data->alloc_count != 1) exit(1);

		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);

	// test typed find first index
	test_spinup(&bkt_buckets, &bkt_data);
	{
		assert(bkt_buckets != nullptr);
		assert(bkt_data != nullptr);
		struct pk_bkt_arr_t<int> 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->alloc_count != 2) exit(1);
		if (bkt_data->alloc_count != 1) exit(1);
		if (arr[h] != val) exit(1);

		pk_bkt_arr_t<int>::FN_Find 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, &pk_bkt_arr_t<int>::FN_Find::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->alloc_count != 0) exit(1);
		if (bkt_data->alloc_count != 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<int> 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->alloc_count != 2) exit(1);
		if (bkt_data->alloc_count != 1) exit(1);
		if (arr[h] != val) exit(1);

		int some_counter = 0;
		pk_bkt_arr_t<int>::FN_Iter cb_wrapper{};
		cb_wrapper.func = [&some_counter](int *lhs)
		{
			(void)lhs;
			some_counter += 1;
			return;
		};
		pk_bkt_arr_iterate(&arr, &pk_bkt_arr_t<int>::FN_Iter::invoke, &cb_wrapper);
		if (some_counter != 1) exit(1);

		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);
}