74#define RBNODE_OPPOSITE(direction) ((rbnode_direction_t)(1 - (direction)))
82#define RBNODE_FROM_PARENT(node) \
83 ((rbnode_direction_t)((node)->parent->children[RBNODE_RIGHT] == (node) ? RBNODE_RIGHT : RBNODE_LEFT))
104#define RBNODE_CREATE \
107 .parent = NULL, .children = {NULL, NULL}, .color = RBNODE_RED \
259#define RBTREE_FOR_EACH(elem, tree, member) \
261 ((tree)->root != NULL ? CONTAINER_OF(rbtree_find_min((tree)->root), typeof(*(elem)), member) : NULL); \
262 (elem) != NULL; (elem) = (rbtree_next(&(elem)->member) != NULL \
263 ? CONTAINER_OF(rbtree_next(&(elem)->member), typeof(*(elem)), member) \
272#define RBTREE_FOR_EACH_REVERSE(elem, tree, member) \
274 ((tree)->root != NULL ? CONTAINER_OF(rbtree_find_max((tree)->root), typeof(*(elem)), member) : NULL); \
275 (elem) != NULL; (elem) = (rbtree_prev(&(elem)->member) != NULL \
276 ? CONTAINER_OF(rbtree_prev(&(elem)->member), typeof(*(elem)), member) \
void(* rbnode_update_t)(rbnode_t *node)
Update function for Red-Black Tree nodes.
rbnode_t * rbtree_next(const rbnode_t *node)
Get the next node in the tree, in predecessor order.
int64_t(* rbnode_compare_t)(const rbnode_t *a, const rbnode_t *b)
Comparison function for Red-Black Tree nodes.
void rbtree_swap(rbtree_t *tree, rbnode_t *a, rbnode_t *b)
Swap two nodes in the Red-Black Tree.
rbnode_t * rbtree_find_min(rbnode_t *node)
Find the minimum node in a subtree.
rbnode_color_t
Red-Black Tree Node Colors.
rbnode_direction_t
Red-Black Tree Node Directions.
rbnode_t * rbtree_rotate(rbtree_t *tree, rbnode_t *node, rbnode_direction_t direction)
Rotate a node in the Red-Black Tree.
void rbtree_init(rbtree_t *tree, rbnode_compare_t compare, rbnode_update_t update)
Initialize a Red-Black Tree.
rbnode_t * rbtree_prev(const rbnode_t *node)
Get the previous node in the tree, in predecessor order.
void rbtree_remove(rbtree_t *tree, rbnode_t *node)
Remove a node from the Red-Black Tree.
void rbtree_insert(rbtree_t *tree, rbnode_t *node)
Insert a node into the Red-Black Tree.
rbnode_t * rbtree_find_max(rbnode_t *node)
Find the maximum node in a subtree.
void rbtree_fix(rbtree_t *tree, rbnode_t *node)
Move the node to its correct position in the Red-Black Tree.
bool rbtree_is_empty(const rbtree_t *tree)
Check if the Red-Black Tree is empty.