@@ -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_
101102buffer_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
511516uint16_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
700705struct 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 )
0 commit comments