From ab7a3804e75f5fecefd46b1e89a6c86454056b2c Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Thu, 14 Apr 2022 18:15:10 +0200 Subject: [PATCH] Use void pointers for callback args --- array.c | 13 +++++++------ array.h | 7 +++---- bits/wrappers.h | 14 ++++++++------ list.c | 17 +++++++++-------- list.h | 13 ++++++------- map.c | 11 ++++++----- map.h | 11 +++++------ queue.c | 9 +++++---- queue.h | 5 ++--- refcount.c | 5 +++-- refcount.h | 5 ++--- test/test_array.c | 6 +++--- test/test_list.c | 4 ++-- test/test_refcount_map.c | 32 ++++++++++++++------------------ test/test_tree.c | 6 +++--- tree.c | 7 ++++--- tree.h | 13 ++++++------- 17 files changed, 88 insertions(+), 90 deletions(-) diff --git a/array.c b/array.c index 27cf55b..714fa4d 100644 --- a/array.c +++ b/array.c @@ -1,6 +1,7 @@ -#include // for malloc, realloc, free, qsort -#include // for memmove, memcpy +#include // for malloc, realloc, free, qsort +#include // for memmove, memcpy #include "array.h" +#include "bits/callback.h" // for Comparator void array_ini(Array *array, size_t mbs, size_t ext) { @@ -81,12 +82,12 @@ void array_clr(Array *array) array_ini(array, array->mbs, array->ext); } -void array_srt(Array *array, Comparator cmp) +void array_srt(Array *array, void *cmp) { qsort(array->ptr, array->siz, array->mbs, cmp); } -ssize_t array_fnd(Array *array, const void *ptr, size_t *idx, Comparator cmp) +ssize_t array_fnd(Array *array, const void *ptr, size_t *idx, void *cmp) { size_t low, high, mid; @@ -96,7 +97,7 @@ ssize_t array_fnd(Array *array, const void *ptr, size_t *idx, Comparator cmp) while (low < high) { mid = (low + high) / 2; - int rel = cmp(ptr, array->ptr + mid * array->mbs); + int rel = ((Comparator) cmp)(ptr, array->ptr + mid * array->mbs); if (rel == 0) return idx ? (*idx = mid) : mid; @@ -112,7 +113,7 @@ ssize_t array_fnd(Array *array, const void *ptr, size_t *idx, Comparator cmp) return -1; } -size_t array_ins(Array *array, const void *ptr, Comparator cmp) +size_t array_ins(Array *array, const void *ptr, void *cmp) { size_t n; diff --git a/array.h b/array.h index f71386b..deeea1c 100644 --- a/array.h +++ b/array.h @@ -12,7 +12,6 @@ #include // for size_t #include // for ssize_t -#include "bits/callback.h" // for Comparator #include "bits/compare.h" // for cmp_ref (not used in file) typedef struct { @@ -139,7 +138,7 @@ void array_clr(Array *array); After this, the array is empty and can be reused. */ -void array_srt(Array *array, Comparator cmp); +void array_srt(Array *array, void *cmp); /* Sorts the array using the quicksort algorithm. @@ -147,7 +146,7 @@ void array_srt(Array *array, Comparator cmp); Wraps the qsort C-library routine. Please refer to it's documentation. */ -ssize_t array_fnd(Array *array, const void *ptr, size_t *idx, Comparator cmp); +ssize_t array_fnd(Array *array, const void *ptr, size_t *idx, void *cmp); /* Searches the sorted array for the element ptr. Returns the index of the element, or -1 if it wasn't found. @@ -159,7 +158,7 @@ ssize_t array_fnd(Array *array, const void *ptr, size_t *idx, Comparator cmp); and the order has been kept and the same comparator is used. */ -size_t array_ins(Array *array, const void *ptr, Comparator cmp); +size_t array_ins(Array *array, const void *ptr, void *cmp); /* Inserts an element into a sorted array, keeping the order. Returns the index the element has been inserted at. diff --git a/bits/wrappers.h b/bits/wrappers.h index 5985519..62bce2b 100644 --- a/bits/wrappers.h +++ b/bits/wrappers.h @@ -1,26 +1,28 @@ +#include "callback.h" // for Transformer, Callback + #define WRAP_NODE_FUNCTIONS(Type, prefix) \ - bool prefix ## add(Type *self, void *dat, Comparator cmp, Transformer trans) \ + bool prefix ## add(Type *self, void *dat, void *cmp, void *trans) \ { \ Type ## Node **node = prefix ## nfd(self, dat, cmp); \ \ if (*node) \ return false; \ \ - prefix ## nmk(self, node, trans ? trans(dat) : dat); \ + prefix ## nmk(self, node, trans ? ((Transformer) trans)(dat) : dat); \ return true; \ } \ \ - void *prefix ## get(Type *self, void *key, Comparator cmp, Transformer trans) \ + void *prefix ## get(Type *self, void *key, void *cmp, void *trans) \ { \ Type ## Node **node = prefix ## nfd(self, key, cmp); \ \ if (!*node) \ return NULL; \ \ - return trans ? trans((*node)->dat) : (*node)->dat; \ + return trans ? ((Transformer) trans)((*node)->dat) : (*node)->dat; \ } \ \ - bool prefix ## del(Type *self, void *key, Comparator cmp, Callback call, void *arg, Transformer trans) \ + bool prefix ## del(Type *self, void *key, void *cmp, void *call, void *arg, void *trans) \ { \ Type ## Node **node = prefix ## nfd(self, key, cmp); \ \ @@ -28,7 +30,7 @@ return false; \ \ if (call) \ - call(trans ? trans((*node)->dat) : (*node)->dat, arg); \ + ((Callback) call)(trans ? ((Transformer) trans)((*node)->dat) : (*node)->dat, arg); \ \ prefix ## nrm(self, node); \ return true; \ diff --git a/list.c b/list.c index a4aba67..8036a2a 100644 --- a/list.c +++ b/list.c @@ -1,5 +1,6 @@ -#include // for malloc, free -#include // for strcmp +#include // for malloc, free +#include // for strcmp +#include "bits/callback.h" // for Callback, Comparator, Transformer #include "bits/wrappers.h" #include "list.h" @@ -25,12 +26,12 @@ void list_ppd(List *list, void *dat) list->fst->nxt = fst; } -ListNode **list_nfd(List *list, void *key, Comparator cmp) +ListNode **list_nfd(List *list, void *key, void *cmp) { ListNode **node; for (ITER_REFS) - if (cmp((*node)->dat, key) == 0) + if (((Comparator) cmp)((*node)->dat, key) == 0) return node; return node; @@ -57,19 +58,19 @@ void list_nrm(List *list, ListNode **node) free(old); } -void list_itr(List *list, Callback iter, void *arg, Transformer trans) +void list_itr(List *list, void *iter, void *arg, void *trans) { LIST_ITERATE(list, node) - iter(trans ? trans(node->dat) : node->dat, arg); + ((Callback) iter)(trans ? ((Transformer) trans)(node->dat) : node->dat, arg); } -void list_clr(List *list, Callback iter, void *arg, Transformer trans) +void list_clr(List *list, void *iter, void *arg, void *trans) { for (ListNode *node = list->fst; node != NULL;) { ListNode *next = node->nxt; if (iter) - iter(trans ? trans(node->dat) : node->dat, arg); + ((Callback) iter)(trans ? ((Transformer) trans)(node->dat) : node->dat, arg); free(node); node = next; diff --git a/list.h b/list.h index 16fd46b..4a7333b 100644 --- a/list.h +++ b/list.h @@ -9,7 +9,6 @@ #define _DRAGONSTD_LIST_H_ #include // for bool -#include "bits/callback.h" // for Callback, Comparator, Transformer, Callback #include "bits/compare.h" // for cmp_ref (not used in file) #define LIST_ITERATE(list, node) for (ListNode *node = (list)->fst; node != NULL; node = node->nxt) @@ -35,7 +34,7 @@ void list_ini(List *list); This function should be called before any other function is called on the list. */ -bool list_add(List *list, void *dat, Comparator cmp, Transformer trans); +bool list_add(List *list, void *dat, void *cmp, void *trans); /* Add an element to the list. @@ -43,14 +42,14 @@ bool list_add(List *list, void *dat, Comparator cmp, Transformer trans); Return whether an element has been added. */ -void *list_get(List *list, void *key, Comparator cmp, Transformer trans); +void *list_get(List *list, void *key, void *cmp, void *trans); /* Get an element from the list. The first matching element is returned, or NULL if none found. */ -bool list_del(List *list, void *key, Comparator cmp, Callback call, void *arg, Transformer trans); +bool list_del(List *list, void *key, void *cmp, void *call, void *arg, void *trans); /* Delete an element from the list if it is found. Return whether an element has been deleted. @@ -68,7 +67,7 @@ void list_ppd(List *list, void *dat); Prepend an element at the start of the list. */ -ListNode **list_nfd(List *list, void *key, Comparator cmp); +ListNode **list_nfd(List *list, void *key, void *cmp); /* Find the location of the first node matching key. @@ -86,7 +85,7 @@ void list_nrm(List *list, ListNode **node); Remove the node at the given location. */ -void list_itr(List *list, Callback iter, void *arg, Transformer trans); +void list_itr(List *list, void *iter, void *arg, void *trans); /* Iterate over the list. Calls iter on every element, with the extra argument arg. @@ -94,7 +93,7 @@ void list_itr(List *list, Callback iter, void *arg, Transformer trans); Note: the LIST_ITERATE macro can be used to do this without function calls. */ -void list_clr(List *list, Callback iter, void *arg, Transformer trans); +void list_clr(List *list, void *iter, void *arg, void *trans); /* Iterates over the list and deletes all elements. Calls iter on every element, with the extra argument arg. diff --git a/map.c b/map.c index 899d25c..81751b4 100644 --- a/map.c +++ b/map.c @@ -1,3 +1,4 @@ +#include "bits/callback.h" // for Transformer #include "map.h" static bool get_lock(Map *map, bool write) @@ -32,7 +33,7 @@ void map_dst(Map *map) pthread_rwlock_destroy(&map->clk); } -void map_cnl(Map *map, Callback iter, void *arg, Transformer trans, TreeTraversionOrder order) +void map_cnl(Map *map, void *iter, void *arg, void *trans, TreeTraversionOrder order) { pthread_rwlock_wrlock(&map->clk); map->cnl = true; @@ -45,7 +46,7 @@ void map_cnl(Map *map, Callback iter, void *arg, Transformer trans, TreeTraversi pthread_rwlock_unlock(&map->tlk); } -bool map_add(Map *map, void *dat, Comparator cmp, Transformer trans) +bool map_add(Map *map, void *dat, void *cmp, void *trans) { if (!get_lock(map, true)) return false; @@ -55,7 +56,7 @@ bool map_add(Map *map, void *dat, Comparator cmp, Transformer trans) return ret; } -void *map_get(Map *map, void *key, Comparator cmp, Transformer trans) +void *map_get(Map *map, void *key, void *cmp, void *trans) { if (!get_lock(map, false)) return NULL; @@ -65,7 +66,7 @@ void *map_get(Map *map, void *key, Comparator cmp, Transformer trans) return ret; } -bool map_del(Map *map, void *key, Comparator cmp, Callback call, void *arg, Transformer trans) +bool map_del(Map *map, void *key, void *cmp, void *call, void *arg, void *trans) { if (!get_lock(map, true)) return false; @@ -75,7 +76,7 @@ bool map_del(Map *map, void *key, Comparator cmp, Callback call, void *arg, Tran return ret; } -void map_trv(Map *map, Callback iter, void *arg, Transformer trans, TreeTraversionOrder order) +void map_trv(Map *map, void *iter, void *arg, void *trans, TreeTraversionOrder order) { if (!get_lock(map, false)) return; diff --git a/map.h b/map.h index 3733b9b..eea5f0e 100644 --- a/map.h +++ b/map.h @@ -11,7 +11,6 @@ #include // for bool #include // for pthread_rwlock_t -#include "bits/callback.h" // for Transformer, Comparator, Callback #include "tree.h" // for Tree typedef struct { @@ -38,7 +37,7 @@ void map_dst(Map *map); Make sure to cancel the map before destroying it, to avoid memory leaks. */ -void map_cnl(Map *map, Callback iter, void *arg, Transformer trans, TreeTraversionOrder order); +void map_cnl(Map *map, void *iter, void *arg, void *trans, TreeTraversionOrder order); /* [Thread Safe] Cancels and clears the map. @@ -52,7 +51,7 @@ void map_cnl(Map *map, Callback iter, void *arg, Transformer trans, TreeTraversi If no callback is given, the traversion order is irrelevant. */ -bool map_add(Map *map, void *dat, Comparator cmp, Transformer trans); +bool map_add(Map *map, void *dat, void *cmp, void *trans); /* [Thread Safe] Add an element to the map. @@ -61,20 +60,20 @@ bool map_add(Map *map, void *dat, Comparator cmp, Transformer trans); Return whether an element has been added. */ -void *map_get(Map *map, void *key, Comparator cmp, Transformer trans); +void *map_get(Map *map, void *key, void *cmp, void *trans); /* [Thread Safe] Get an element from the map, or return NULL if none found. */ -bool map_del(Map *map, void *key, Comparator cmp, Callback call, void *arg, Transformer trans); +bool map_del(Map *map, void *key, void *cmp, void *call, void *arg, void *trans); /* [Thread Safe] Delete an element from the map if it is found. Return whether an element has been deleted. */ -void map_trv(Map *map, Callback iter, void *arg, Transformer trans, TreeTraversionOrder order); +void map_trv(Map *map, void *iter, void *arg, void *trans, TreeTraversionOrder order); /* [Thread Safe] Traverse the map. diff --git a/queue.c b/queue.c index 91c2d31..98613d7 100644 --- a/queue.c +++ b/queue.c @@ -1,4 +1,5 @@ -#include +#include // for sched_yield +#include "bits/callback.h" // for Transformer #include "queue.h" void queue_ini(Queue *queue) @@ -15,7 +16,7 @@ void queue_dst(Queue *queue) pthread_mutex_destroy(&queue->mtx); } -void queue_clr(Queue *queue, Callback iter, void *arg, Transformer trans) +void queue_clr(Queue *queue, void *iter, void *arg, void *trans) { list_clr(&queue->lst, iter, arg, trans); } @@ -35,7 +36,7 @@ bool queue_enq(Queue *queue, void *dat) return success; } -void *queue_deq(Queue *queue, Transformer trans) +void *queue_deq(Queue *queue, void *trans) { void *dat = NULL; @@ -47,7 +48,7 @@ void *queue_deq(Queue *queue, Transformer trans) list_nrm(&queue->lst, node); if (trans) - dat = trans(dat); + dat = ((Transformer) trans)(dat); } else { pthread_cond_wait(&queue->cnd, &queue->mtx); } diff --git a/queue.h b/queue.h index 96fdcfc..cb4ad42 100644 --- a/queue.h +++ b/queue.h @@ -11,7 +11,6 @@ #include // for pthread_cond_t, pthread_mutex_t #include // for bool -#include "bits/callback.h" // for Transformer #include "list.h" // for List typedef struct { @@ -40,7 +39,7 @@ void queue_dst(Queue *queue); list is cleared before calling this function. */ -void queue_clr(Queue *queue, Callback iter, void *arg, Transformer trans); +void queue_clr(Queue *queue, void *iter, void *arg, void *trans); /* Clears the queue. @@ -58,7 +57,7 @@ bool queue_enq(Queue *queue, void *dat); Notifies waiting consumer threads. */ -void *queue_deq(Queue *queue, Transformer trans); +void *queue_deq(Queue *queue, void *trans); /* [Thread Safe] Dequeue an element. diff --git a/refcount.c b/refcount.c index 3b36ac7..95d896b 100644 --- a/refcount.c +++ b/refcount.c @@ -1,6 +1,7 @@ +#include "bits/callback.h" // for SingleCallback #include "refcount.h" -void refcount_ini(Refcount *refcount, void *obj, SingleCallback del) +void refcount_ini(Refcount *refcount, void *obj, void *del) { refcount->obj = obj; refcount->del = del; @@ -33,7 +34,7 @@ void refcount_drp(Refcount *refcount) pthread_mutex_unlock(&refcount->mtx); if (!count) - refcount->del(refcount->obj); + ((SingleCallback) refcount->del)(refcount->obj); } void *refcount_obj(Refcount *refcount) diff --git a/refcount.h b/refcount.h index 0efab56..d3d7bd7 100644 --- a/refcount.h +++ b/refcount.h @@ -14,17 +14,16 @@ #define _DRAGONSTD_REFCOUNT_H_ #include // for pthread_mutex_t -#include "bits/callback.h" // for Callback typedef struct { /* private */ void *obj; - SingleCallback del; + void *del; unsigned short cnt; // counter pthread_mutex_t mtx; // lock to protect count } Refcount; -void refcount_ini(Refcount *refcount, void *obj, SingleCallback del); +void refcount_ini(Refcount *refcount, void *obj, void *del); /* Initializes the refcount. diff --git a/test/test_array.c b/test/test_array.c index 94e78c7..a6c8e19 100644 --- a/test/test_array.c +++ b/test/test_array.c @@ -114,14 +114,14 @@ int main() assert(arr.cap == 8); printf("testing srt\n"); - array_srt(&arr, (void *) &cmp_int); + array_srt(&arr, &cmp_int); printf("testing order: exp: (sorted) got: "); dump(&arr); printf("\n"); assert_in_order(&arr); for (size_t j = 0; j < arr.siz; j++) { i = ((int *) arr.ptr)[j]; - ssize_t s = array_fnd(&arr, &i, NULL, (void *) &cmp_int); + ssize_t s = array_fnd(&arr, &i, NULL, &cmp_int); printf("testing fnd at index %lu: exp: >=0 got: %ld\n", j, s); assert(s >= 0); @@ -134,7 +134,7 @@ int main() printf("testing ins\n"); for (int j = 0; j < 10; j++) { - i = rand() % 100; array_ins(&arr, &i, (void *) &cmp_int); + i = rand() % 100; array_ins(&arr, &i, &cmp_int); } printf("testing order: exp: (sorted) got: "); dump(&arr); printf("\n"); diff --git a/test/test_list.c b/test/test_list.c index 5dba6d2..3645c04 100644 --- a/test/test_list.c +++ b/test/test_list.c @@ -2,9 +2,9 @@ #include #include "../list.h" -int cmp_int(const void *ia, const void *ib) +int cmp_int(const int *ia, const int *ib) { - return *(const int *) ia - *(const int *) ib; + return *ia - *ib; } int main() diff --git a/test/test_refcount_map.c b/test/test_refcount_map.c index 9d717c1..fc3b5e4 100644 --- a/test/test_refcount_map.c +++ b/test/test_refcount_map.c @@ -16,29 +16,25 @@ typedef struct { Refcount rc; } DataObject; -void data_object_delete(DataObject *obj) +int rand_id() { - refcount_dst(&obj->rc); - free(obj); + return rand() % 1000; } -int rand_id() +void delete_obj(DataObject *obj) { - return rand() % 1000; + refcount_dst(&obj->rc); + free(obj); } -int data_object_compare(const void *pa, const void *pb) +int cmp_obj(const Refcount *rc, const int *id) { - return - ((DataObject *) ((const Refcount *) pa)->obj)->id - - ((DataObject *) ((const Refcount *) pb)->obj)->id; + return ((DataObject *) rc->obj)->id - *id; } -int data_object_compare_id(const void *pa, const void *pb) +int cmp_obj_sym(const Refcount *rc1, const Refcount *rc2) { - return - ((DataObject *) ((const Refcount *) pa)->obj)->id - - *(const int *) pb; + return cmp_obj(rc1, &((DataObject *) rc2->obj)->id); } static void *thread_create(unsigned int *result) @@ -47,9 +43,9 @@ static void *thread_create(unsigned int *result) DataObject *obj = malloc(sizeof *obj); obj->id = rand_id(); - refcount_ini(&obj->rc, obj, (void *) &data_object_delete); + refcount_ini(&obj->rc, obj, &delete_obj); - if (map_add(&map, &obj->rc, &data_object_compare, (void *) &refcount_inc)) + if (map_add(&map, &obj->rc, &cmp_obj_sym, &refcount_inc)) (*result)++; refcount_drp(&obj->rc); @@ -74,7 +70,7 @@ static void *thread_access(unsigned int *result) while (!objs[i] && !cancel) { int id = rand_id(); - objs[i] = map_get(&map, &id, &data_object_compare_id, (void *) &refcount_grb); + objs[i] = map_get(&map, &id, &cmp_obj, &refcount_grb); } if (objs[i]) @@ -95,7 +91,7 @@ static void *thread_delete(unsigned int *result) while (!cancel) { unsigned int id = rand_id(); - if (map_del(&map, &id, &data_object_compare_id, (void *) &refcount_drp, NULL, NULL)) + if (map_del(&map, &id, &cmp_obj, &refcount_drp, NULL, NULL)) (*result)++; } @@ -136,7 +132,7 @@ int main() results[i][0] += results[i][j]; } - map_cnl(&map, (void *) &refcount_drp, NULL, NULL, 0); + map_cnl(&map, &refcount_drp, NULL, NULL, 0); map_dst(&map); printf("Time: 1 second\n"); diff --git a/test/test_tree.c b/test/test_tree.c index dbe9899..005814b 100644 --- a/test/test_tree.c +++ b/test/test_tree.c @@ -6,9 +6,9 @@ #define NUM_ELEMENTS 1e5 -int cmp_int(const void *ia, const void *ib) +int cmp_int(const int *ia, const int *ib) { - return *(const int *) ia - *(const int *) ib; + return *ia - *ib; } void clear_callback(int *ia, int *ib) @@ -68,5 +68,5 @@ int main() } int last = -1; - tree_clr(&tree, (void *) &clear_callback, &last, NULL, TRAVERSION_INORDER); + tree_clr(&tree, &clear_callback, &last, NULL, TRAVERSION_INORDER); } diff --git a/tree.c b/tree.c index 42ac277..a857789 100644 --- a/tree.c +++ b/tree.c @@ -1,4 +1,5 @@ #include // for malloc, free +#include "bits/callback.h" // for Callback, Comparator, Transformer #include "bits/wrappers.h" #include "tree.h" @@ -39,7 +40,7 @@ void tree_ini(Tree *tree) WRAP_NODE_FUNCTIONS(Tree, tree_) -TreeNode **tree_nfd(Tree *tree, void *key, Comparator cmp) +TreeNode **tree_nfd(Tree *tree, void *key, void *cmp) { return search(&tree->rot, key, cmp); } @@ -68,12 +69,12 @@ void tree_nrm(__attribute__((unused)) Tree *tree, TreeNode **node) free(old); } -void tree_trv(Tree *tree, Callback iter, void *arg, Transformer trans, TreeTraversionOrder order) +void tree_trv(Tree *tree, void *iter, void *arg, void *trans, TreeTraversionOrder order) { traverse(tree->rot, iter, arg, trans, order, 0); } -void tree_clr(Tree *tree, Callback iter, void *arg, Transformer trans, TreeTraversionOrder order) +void tree_clr(Tree *tree, void *iter, void *arg, void *trans, TreeTraversionOrder order) { traverse(tree->rot, iter, arg, trans, order, 1); tree_ini(tree); diff --git a/tree.h b/tree.h index 2ce1b11..5c27105 100644 --- a/tree.h +++ b/tree.h @@ -15,7 +15,6 @@ #define _DRAGONSTD_TREE_H_ #include // for bool -#include "bits/callback.h" // for Callback, Comparator, Transformer, Callback #include "bits/compare.h" // for cmp_ref (not used in file) typedef struct TreeNode { @@ -45,7 +44,7 @@ void tree_ini(Tree *tree); This function should be called before any other function is called on the tree. */ -bool tree_add(Tree *tree, void *dat, Comparator cmp, Transformer trans); +bool tree_add(Tree *tree, void *dat, void *cmp, void *trans); /* Add an element to the tree. @@ -53,18 +52,18 @@ bool tree_add(Tree *tree, void *dat, Comparator cmp, Transformer trans); Return whether an element has been added. */ -void *tree_get(Tree *tree, void *key, Comparator cmp, Transformer trans); +void *tree_get(Tree *tree, void *key, void *cmp, void *trans); /* Get an element from the tree, or return NULL if none found. */ -bool tree_del(Tree *tree, void *key, Comparator cmp, Callback call, void *arg, Transformer trans); +bool tree_del(Tree *tree, void *key, void *cmp, void *call, void *arg, void *trans); /* Delete an element from the tree if it is found. Return whether an element has been deleted. */ -TreeNode **tree_nfd(Tree *tree, void *key, Comparator cmp); +TreeNode **tree_nfd(Tree *tree, void *key, void *cmp); /* Find the location of a node matching key. @@ -82,13 +81,13 @@ void tree_nrm(Tree *tree, TreeNode **node); Remove the node at the given location. */ -void tree_trv(Tree *tree, Callback iter, void *arg, Transformer trans, TreeTraversionOrder order); +void tree_trv(Tree *tree, void *iter, void *arg, void *trans, TreeTraversionOrder order); /* Traverse the tree. Calls iter on every element, with the extra argument arg. */ -void tree_clr(Tree *tree, Callback iter, void *arg, Transformer trans, TreeTraversionOrder order); +void tree_clr(Tree *tree, void *iter, void *arg, void *trans, TreeTraversionOrder order); /* Traverses the tree and deletes all elements. Calls iter on every element, with the extra argument arg. -- 2.44.0