diff --git a/include/ucore/rbtree.h b/include/ucore/rbtree.h index bde88ef..edc271d 100644 --- a/include/ucore/rbtree.h +++ b/include/ucore/rbtree.h @@ -23,7 +23,7 @@ struct RBNode { typedef struct RBTree RBTree; struct RBTree { RBNode *node; - int (*compare)(const void *a, const void *b); + int (*compare)(const RBNode *a, const RBNode *b); }; /** Remove a node from the tree. @@ -35,14 +35,16 @@ void uc_rb_remove(RBTree *root, RBNode *node); /** Find a node in the tree. * - * The value to find will be in a node->data pointer, the compare + * The value to find must be of the same type as the + * other nodes inserted into a tree. This will normally + * be a user defined struct with the RBNode as one of its members * function of the tree is used to find the matching item. * * @param root Root of the tree * @param val The value to find. * @return the found node */ -RBNode *uc_rb_find(RBTree *root, const void *val); +RBNode *uc_rb_find(RBTree *root, const RBNode *val); /** insert a new node * diff --git a/src/rbtree.c b/src/rbtree.c index 5522e4d..ebd1b71 100644 --- a/src/rbtree.c +++ b/src/rbtree.c @@ -251,11 +251,11 @@ uc_rb_remove(RBTree *root, RBNode *node) } RBNode* -uc_rb_find(RBTree *root, const void *val) +uc_rb_find(RBTree *root, const RBNode *val) { RBNode *n = root->node; while (n) { - int d = root->compare(val,n->data); + int d = root->compare(val,n); if (d < 0) n = n->left; else if (d > 0) @@ -274,7 +274,7 @@ uc_rb_insert(RBTree *root, RBNode *child) int d; while (*p) { parent = *p; - d = root->compare(child->data, parent->data); + d = root->compare(child, parent); if (d < 0) p = &(*p)->left; else if (d > 0) diff --git a/src/timers.c b/src/timers.c index 0aca525..b89381b 100644 --- a/src/timers.c +++ b/src/timers.c @@ -1,12 +1,13 @@ #include #include "ucore/timers.h" #include "ucore/clock.h" +#include "ucore/utils.h" -static int timers_cmp(const void *a_, const void *b_) +static int timers_cmp(const RBNode *a_, const RBNode *b_) { - const struct UCTimer *a = a_; - const struct UCTimer *b = b_; + const struct UCTimer *a = CONST_CONTAINER_OF(a_, struct UCTimer, rb_node); + const struct UCTimer *b = CONST_CONTAINER_OF(b_, struct UCTimer, rb_node); if (timercmp(&a->timeout, &b->timeout, <)) { return -1;