]> git.lizzy.rs Git - dragonstd.git/commitdiff
Use void pointers for callback args
authorElias Fleckenstein <eliasfleckenstein@web.de>
Thu, 14 Apr 2022 16:15:10 +0000 (18:15 +0200)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Thu, 14 Apr 2022 16:15:10 +0000 (18:15 +0200)
17 files changed:
array.c
array.h
bits/wrappers.h
list.c
list.h
map.c
map.h
queue.c
queue.h
refcount.c
refcount.h
test/test_array.c
test/test_list.c
test/test_refcount_map.c
test/test_tree.c
tree.c
tree.h

diff --git a/array.c b/array.c
index 27cf55b181e459e482c4ad37ff7e47e4a0d34aee..714fa4dc78c122ac7bfda61d7b9899155593a4d8 100644 (file)
--- a/array.c
+++ b/array.c
@@ -1,6 +1,7 @@
-#include <stdlib.h> // for malloc, realloc, free, qsort
-#include <string.h> // for memmove, memcpy
+#include <stdlib.h>        // for malloc, realloc, free, qsort
+#include <string.h>        // 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 f71386b32c012a6d23d68ec383532ea9e152a337..deeea1cdb76e47ee40bb5ddc37b487455a39d25e 100644 (file)
--- a/array.h
+++ b/array.h
@@ -12,7 +12,6 @@
 
 #include <stddef.h>        // for size_t
 #include <sys/types.h>     // 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.
index 59855193c487bfe1320f9f77e427e8b024b1db88..62bce2b7f67f6ed2cc2b54b5044e4b5e736f7c02 100644 (file)
@@ -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 a4aba67a5772ffc89f52da814a32ea25424fc87b..8036a2ac74868d41c85381c9d366fa938425e0a5 100644 (file)
--- a/list.c
+++ b/list.c
@@ -1,5 +1,6 @@
-#include <stdlib.h> // for malloc, free
-#include <string.h> // for strcmp
+#include <stdlib.h>        // for malloc, free
+#include <string.h>        // 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 16fd46b94029bf9b81ce1d5203b4f8fb5e1a551f..4a7333b26a8e62a9be1450997506cd9bfca73d3a 100644 (file)
--- a/list.h
+++ b/list.h
@@ -9,7 +9,6 @@
 #define _DRAGONSTD_LIST_H_
 
 #include <stdbool.h>       // 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 899d25c3486511ebe312ce28382e3a880ea68f6b..81751b481f149f50d26449965bc02cd09afc087c 100644 (file)
--- 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 3733b9bd31292a7d3630bb66f94a0508b2c862c8..eea5f0ef4abbe46ac9821ec300bcc73c390031a9 100644 (file)
--- a/map.h
+++ b/map.h
@@ -11,7 +11,6 @@
 
 #include <stdbool.h>       // for bool
 #include <pthread.h>       // 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 91c2d314dd346e3db039593c17790fe880600220..98613d74da08742d63fa3c29eedb1fd29a2241fb 100644 (file)
--- a/queue.c
+++ b/queue.c
@@ -1,4 +1,5 @@
-#include <sched.h>
+#include <sched.h>         // 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 96fdcfc9d65e7ba10536e89d319b13564a4f87e0..cb4ad42964a45052b73a3bf99d86c54600a7a5df 100644 (file)
--- a/queue.h
+++ b/queue.h
@@ -11,7 +11,6 @@
 
 #include <pthread.h>       // for pthread_cond_t, pthread_mutex_t
 #include <stdbool.h>       // 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.
index 3b36ac7ca71812e65023d7e34f3b16b5e157dc09..95d896b3d10c545b570c5e381224b402b787c349 100644 (file)
@@ -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)
index 0efab562d2bc80207a4a87c9ea47940f2c22a072..d3d7bd7923fe47106eff94e28980a8e7c6840315 100644 (file)
 #define _DRAGONSTD_REFCOUNT_H_
 
 #include <pthread.h>       // 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.
 
index 94e78c79ba83665dfac6a6ee7ca9648388a52d0d..a6c8e19fa87fe345e6e6c7a5b3761791937eb6de 100644 (file)
@@ -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");
index 5dba6d2d7689bc4f9a9e23f7564295cf0e481fc9..3645c048a200dc48eafb29fafad3da1332b521b7 100644 (file)
@@ -2,9 +2,9 @@
 #include <stdio.h>
 #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()
index 9d717c184f81aab1c8ec8175689872319d0c6c8b..fc3b5e4596cc63d9a5537380c06a0b26db63b551 100644 (file)
@@ -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");
index dbe98998d09861ddd0fabd6f467a42c098cae043..005814b64de29d3c7501d1db1ed49b4be7f8f0d6 100644 (file)
@@ -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 42ac27702af795564bf984a396253f8d3ffe3aba..a857789b8d6b42ace504c2325628f2cbbca07fa3 100644 (file)
--- a/tree.c
+++ b/tree.c
@@ -1,4 +1,5 @@
 #include <stdlib.h>  // 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 2ce1b116bc57655cadf5b0a65d9028fea10c9411..5c27105c79b87b164b49aec57a9203561685237c 100644 (file)
--- a/tree.h
+++ b/tree.h
@@ -15,7 +15,6 @@
 #define _DRAGONSTD_TREE_H_
 
 #include <stdbool.h>       // 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.