Skip to content

Commit a69325b

Browse files
committed
Add thunk argument to the compare function.
1 parent 5e3f28e commit a69325b

12 files changed

Lines changed: 47 additions & 29 deletions

File tree

include/buffer_set/buffer_set.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ typedef struct buffer_set_s buffer_set_t;
4141
buffer_set_t * buffer_set_create(
4242
size_t value_size,
4343
uint16_t initial_capacity,
44-
int (*compar)(const void * v1, const void * v2)
44+
int (*compar)(const void * v1, const void * v2, void * thunk),
45+
void * compar_thunk
4546
);
4647

4748
/**

src/buffer_set.c

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ struct buffer_set_s
4444
{
4545
size_t value_size;
4646
size_t node_size;
47-
int (*compar)(const void * v1, const void * v2);
47+
int (*compar)(const void * v1, const void * v2, void * thunk);
48+
void * compar_thunk;
4849
uint16_t capacity;
4950
uint16_t size;
5051
uint16_t root;
@@ -73,7 +74,7 @@ static inline struct free_node_s * _get_free_node(struct buffer_set_s * buffer_s
7374
return (struct free_node_s*) ptr;
7475
}
7576

76-
static inline void * _get_node_value(struct node_s * node)
77+
static inline void * _node_get_value(struct node_s * node)
7778
{
7879
return ((char*)node) + _round(sizeof(struct node_s));
7980
}
@@ -101,7 +102,8 @@ static uint16_t _make_free_list(void * buffer, size_t node_size, uint16_t first_
101102
buffer_set_t * buffer_set_create(
102103
size_t value_size,
103104
uint16_t initial_capacity,
104-
int (*compar)(const void * v1, const void * v2)
105+
int (*compar)(const void * v1, const void * v2, void * thunk),
106+
void * compar_thunk
105107
) {
106108
if (initial_capacity > MAX_CAPACITY)
107109
{
@@ -121,6 +123,7 @@ buffer_set_t * buffer_set_create(
121123
buffer_set->value_size = value_size;
122124
buffer_set->node_size = node_size;
123125
buffer_set->compar = compar;
126+
buffer_set->compar_thunk = compar_thunk;
124127
buffer_set->capacity = initial_capacity;
125128
buffer_set->size = 0;
126129
buffer_set->root = NULL_IDX;
@@ -209,7 +212,7 @@ static struct rebalance_result_s _balance_left(
209212
const uint16_t nr_idx = _rotate_right(buffer_set, idx, node);
210213
struct node_s * nr = _get_node(buffer_set, nr_idx);
211214
assert((nr->balance >= -1) && (nr->balance <= 1));
212-
/*
215+
#if defined(USE_REFERENCE_CODE)
213216
if (nr->balance == -1)
214217
{
215218
left->balance = 0;
@@ -227,10 +230,11 @@ static struct rebalance_result_s _balance_left(
227230
node->balance = 0;
228231
nr->balance = 0;
229232
}
230-
*/
233+
#else
231234
left->balance = (nr->balance == 1) ? -1 : 0;
232235
node->balance = (nr->balance == -1) ? 1 : 0;
233236
nr->balance = 0;
237+
#endif
234238
return _make_rebalance_result(nr_idx, 0);
235239
}
236240
else
@@ -266,7 +270,7 @@ static struct rebalance_result_s _balance_right(
266270
const uint16_t nr_idx = _rotate_left(buffer_set, idx, node);
267271
struct node_s * nr = _get_node(buffer_set, nr_idx);
268272
assert((nr->balance >= -1) && (nr->balance <= 1));
269-
/*
273+
#if defined(USE_REFERENCE_CODE)
270274
if (nr->balance == 1)
271275
{
272276
right->balance = 0;
@@ -284,10 +288,11 @@ static struct rebalance_result_s _balance_right(
284288
node->balance = 0;
285289
nr->balance = 0;
286290
}
287-
*/
291+
#else
288292
right->balance = (nr->balance == -1) ? 1 : 0;
289293
node->balance = (nr->balance == 1) ? -1 : 0;
290294
nr->balance = 0;
295+
#endif
291296
return _make_rebalance_result(nr_idx, 0);
292297
}
293298
else
@@ -433,7 +438,7 @@ static struct insert_result_s _buffer_set_insert(
433438
else
434439
{
435440
struct node_s * node = _get_node(buffer_set, idx);
436-
int cmp = buffer_set->compar(value, _get_node_value(node));
441+
int cmp = buffer_set->compar(value, _node_get_value(node), buffer_set->compar_thunk);
437442
if (cmp < 0)
438443
{
439444
const struct insert_result_s insert_result = _buffer_set_insert(buffer_set, value, node->left, value_node);
@@ -505,7 +510,7 @@ void * buffer_set_insert(
505510
*inserted = value_node.inserted;
506511

507512
struct node_s * node = _get_node(buffer_set, value_node.idx);
508-
return _get_node_value(node);
513+
return _node_get_value(node);
509514
}
510515

511516
uint16_t buffer_set_get_size(buffer_set_t * buffer_set)
@@ -523,13 +528,13 @@ void * buffer_set_get(
523528
if (idx == NULL_IDX)
524529
return NULL;
525530
struct node_s * node = _get_node(buffer_set, idx);
526-
const int cmp = buffer_set->compar(value, _get_node_value(node));
531+
const int cmp = buffer_set->compar(value, _node_get_value(node), buffer_set->compar_thunk);
527532
if (cmp < 0)
528533
idx = node->left;
529534
else if (cmp > 0)
530535
idx = node->right;
531536
else
532-
return _get_node_value(node);
537+
return _node_get_value(node);
533538
}
534539
}
535540

@@ -558,7 +563,7 @@ static struct erase_result_s _erase(
558563
}
559564

560565
struct node_s * node = _get_node(buffer_set, idx);
561-
const int cmp = buffer_set->compar(value, _get_node_value(node));
566+
const int cmp = buffer_set->compar(value, _node_get_value(node), buffer_set->compar_thunk);
562567
if (cmp < 0)
563568
{
564569
const struct erase_result_s erase_result = _erase(buffer_set, value, node->left, erased_idx);
@@ -642,7 +647,7 @@ static struct erase_result_s _erase(
642647
tmp = _get_node(buffer_set, tmp_idx);
643648
}
644649

645-
const struct erase_result_s erase_result = _erase(buffer_set, _get_node_value(tmp), node->right, erased_idx);
650+
const struct erase_result_s erase_result = _erase(buffer_set, _node_get_value(tmp), node->right, erased_idx);
646651
assert(*erased_idx == tmp_idx);
647652
*erased_idx = idx;
648653

@@ -694,7 +699,7 @@ const void * buffer_set_erase(
694699
free_node->next = buffer_set->free_list;
695700
buffer_set->free_list = erased_idx;
696701

697-
return _get_node_value(node);
702+
return _node_get_value(node);
698703
}
699704

700705
struct walk_context_s
@@ -719,7 +724,7 @@ static int _buffer_set_walk(
719724
return rc;
720725
}
721726

722-
rc = context->func(_get_node_value(node), context->arg);
727+
rc = context->func(_node_get_value(node), context->arg);
723728
if (rc)
724729
return rc;
725730

@@ -750,7 +755,7 @@ static void _print_debug(
750755
) {
751756
struct node_s * node = _get_node(buffer_set, idx);
752757
fprintf(file, " %hu[", idx);
753-
value_printer(file, _get_node_value(node));
758+
value_printer(file, _node_get_value(node));
754759

755760
fprintf(file, "]: left=");
756761
if (node->left == NULL_IDX)

tests/clear.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
int clear()
2222
{
23-
buffer_set_t * buffer_set = buffer_set_create(sizeof(int), 16, int_cmp);
23+
buffer_set_t * buffer_set = buffer_set_create(sizeof(int), 16, &int_cmp, NULL);
2424
if (buffer_set == NULL)
2525
{
2626
printf("buffer_set_create() failed");

tests/insert.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
int insert()
2222
{
23-
buffer_set_t * buffer_set = buffer_set_create(sizeof(int), 0, int_cmp);
23+
buffer_set_t * buffer_set = buffer_set_create(sizeof(int), 0, &int_cmp, NULL);
2424
if (buffer_set == NULL)
2525
{
2626
printf("buffer_set_create() failed");

tests/insert_perf.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ static unsigned int test_stdlib()
7676

7777
#endif
7878

79-
static int buffer_set_cmp(const void * pv1, const void * pv2)
79+
static int buffer_set_cmp(const void * pv1, const void * pv2, void * thunk)
8080
{
8181
const int v1 = *((const int*) pv1);
8282
const int v2 = *((const int*) pv2);
@@ -90,7 +90,7 @@ static int buffer_set_cmp(const void * pv1, const void * pv2)
9090

9191
static unsigned int test_buffer_set()
9292
{
93-
buffer_set_t * buffer_set = buffer_set_create(sizeof(int), COUNT, buffer_set_cmp);
93+
buffer_set_t * buffer_set = buffer_set_create(sizeof(int), COUNT, &buffer_set_cmp, NULL);
9494
if (buffer_set == NULL)
9595
{
9696
printf("not enough memory");

tests/main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
#include <stdlib.h>
1818
#include "test.h"
1919

20-
int int_cmp(const void * pv1, const void * pv2)
20+
int int_cmp(const void * pv1, const void * pv2, void * thunk)
2121
{
2222
const int v1 = *((const int*) pv1);
2323
const int v2 = *((const int*) pv2);

tests/max_capacity.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
int max_capacity()
2222
{
23-
buffer_set_t * buffer_set = buffer_set_create(sizeof(int), 0, int_cmp);
23+
buffer_set_t * buffer_set = buffer_set_create(sizeof(int), 0, &int_cmp, NULL);
2424
if (buffer_set == NULL)
2525
{
2626
printf("buffer_set_create() failed");

tests/print_debug.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ static void value_printer(FILE * file, const void * value)
2525

2626
int print_debug()
2727
{
28-
buffer_set_t * buffer_set = buffer_set_create(sizeof(int), 0, int_cmp);
28+
buffer_set_t * buffer_set = buffer_set_create(sizeof(int), 0, &int_cmp, NULL);
2929
if (buffer_set == NULL)
3030
{
3131
printf("buffer_set_create() failed");

tests/random_op.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,18 @@ struct golden_set_s
3030
int * data;
3131
};
3232

33+
static int bsearch_int_cmp(const void * pv1, const void * pv2)
34+
{
35+
const int v1 = *((const int*) pv1);
36+
const int v2 = *((const int*) pv2);
37+
if (v1 < v2)
38+
return -1;
39+
else if (v2 < v1)
40+
return 1;
41+
else
42+
return 0;
43+
}
44+
3345
static int golden_set_init(struct golden_set_s * golden_set, size_t capacity)
3446
{
3547
golden_set->capacity = capacity;
@@ -199,7 +211,7 @@ int random_op()
199211
return -1;
200212
}
201213

202-
buffer_set_t * buffer_set = buffer_set_create(sizeof(int), (uint16_t) MAX_ELEMENTS/2, int_cmp);
214+
buffer_set_t * buffer_set = buffer_set_create(sizeof(int), (uint16_t) MAX_ELEMENTS/4, &int_cmp, NULL);
203215
int ret = 0;
204216

205217
srand((unsigned int) time(NULL));
@@ -217,7 +229,7 @@ int random_op()
217229
int value = rand();
218230
for (;;)
219231
{
220-
const void * ptr = bsearch(&value, golden_set.data, golden_set.size, sizeof(int), int_cmp);
232+
const void * ptr = bsearch(&value, golden_set.data, golden_set.size, sizeof(int), &bsearch_int_cmp);
221233
if (!ptr)
222234
break;
223235
value = rand();

tests/reg.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ static const struct operation_s operations[] =
2727

2828
int reg()
2929
{
30-
buffer_set_t * buffer_set = buffer_set_create(sizeof(int), 16, int_cmp);
30+
buffer_set_t * buffer_set = buffer_set_create(sizeof(int), 16, &int_cmp, NULL);
3131
if (!buffer_set)
3232
{
3333
printf("buffer_set_create() failed");

0 commit comments

Comments
 (0)