7 #define RB_NODE_IS_BLACK(Node) (ncBlack == (Node)->Color) 8 #define RB_NODE_IS_RED(Node) (ncRed == (Node)->Color) 37 if (&Tree->Nil != y->
Left)
44 if (&Tree->Nil == x->
Parent)
88 if (&Tree->Nil != y->
Right)
95 if (&Tree->Nil == x->
Parent)
356 if (Node1->Parent == &Tree->Nil)
362 if (Node1 == Node1->Parent->Left)
364 Node1->Parent->Left = Node2;
368 Node1->Parent->Right = Node2;
372 Node2->Parent = Node1->Parent;
397 if (NULL == NodeFree)
402 if (NULL == NodeCompare)
407 Tree->Root = &Tree->Nil;
408 Tree->Nil.Left = Tree->Nil.Right = Tree->Nil.Parent = &Tree->Nil;
410 Tree->NodeFree = NodeFree;
411 Tree->NodeCompare = NodeCompare;
426 stack[0] = Tree->Root;
427 while (Tree->NodeCount > 1)
430 if (&Tree->Nil != stack[level]->
Left)
434 stack[level] = stack[level - 1]->
Left;
439 if (&Tree->Nil != stack[level]->
Right)
443 stack[level] = stack[level - 1]->
Right;
452 if (stack[level - 1]->Left == stack[level])
455 stack[level - 1]->
Left = &Tree->Nil;
460 stack[level - 1]->
Right = &Tree->Nil;
463 Tree->NodeFree(stack[level]);
464 Tree->NodeCount -= 1;
468 if (Tree->Root != &Tree->Nil)
470 Tree->NodeFree(Tree->Root);
472 Tree->Root = &Tree->Nil;
484 RBNODE *node = Tree->Root;
485 *Parent = &Tree->Nil;
487 while (&Tree->Nil != node)
489 int cmp = Tree->NodeCompare(node, NodeToSearch);
507 if (node == &Tree->Nil)
530 if (NULL == NodeToSearch)
535 if (NULL == NodeFound)
540 *NodeFound =
RbSearch(Tree, NodeToSearch, &parent);
542 if (NULL == *NodeFound)
566 if (NULL == NodeFound)
573 while (&Tree->Nil != node)
575 int cmp = CompareFunc(node, Key);
592 if (node == &Tree->Nil)
641 if (NULL == Node || &Tree->Nil == Node)
649 auxNode =
RbSearch(Tree, Node, &parentNode);
660 Node->Parent = parentNode;
661 if (&Tree->Nil == parentNode)
668 cmp = Tree->NodeCompare(Node, parentNode);
671 parentNode->
Left = Node;
675 parentNode->
Right = Node;
679 Node->
Left = &Tree->Nil;
680 Node->
Right = &Tree->Nil;
697 if (&Tree->Nil == Node->Left)
744 if (&Tree->Nil == z->
Left)
751 if (&Tree->Nil == z->
Right)
759 yOrigColor = y->
Color;
798 #if defined(INT_COMPILER_GNUC) || (defined(INT_UNIX) && defined(INT_COMPILER_CLANG)) 799 _Pragma(
"GCC diagnostic push");
800 _Pragma(
"GCC diagnostic ignored \"-Wstrict-overflow\"")
828 if (Tree->Root == &Tree->Nil)
841 switch (stack[level])
846 if (node->
Left != &Tree->Nil)
859 res = Callback(node, WalkContext);
873 if (node->
Right != &Tree->Nil)
893 #if defined(INT_COMPILER_GNUC) || (defined(INT_UNIX) && defined(INT_COMPILER_CLANG)) 894 _Pragma(
"GCC diagnostic pop");
void RbUninit(RBTREE *Tree)
INTSTATUS RbInit(RBTREE *Tree, PFUNC_RbTreeNodeFree NodeFree, PFUNC_RbTreeNodeCompare NodeCompare)
FUNC_RbTreeNodeCompare * PFUNC_RbTreeNodeCompare
#define INT_STATUS_SUCCESS
#define INT_STATUS_DATA_NOT_FOUND
static void RbpDeleteFixup(RBTREE *Tree, RBNODE *Node)
#define RB_NODE_IS_RED(Node)
#define RBTREE_MAXIMUM_LEVEL
void RbDeleteNode(RBTREE *Tree, RBNODE *Node)
void RbPreinit(RBTREE *Tree)
INTSTATUS RbInsertNode(RBTREE *Tree, RBNODE *Node)
int INTSTATUS
The status data type.
#define INT_STATUS_BUFFER_OVERFLOW
INTSTATUS RbWalkInorderTree(RBTREE *Tree, PFUNC_RbTreeWalkCallback Callback, void *WalkContext)
#define RB_NODE_IS_BLACK(Node)
RBNODE * RbSearch(RBTREE *Tree, RBNODE *NodeToSearch, RBNODE **Parent)
#define INT_STATUS_KEY_ALREADY_EXISTS
static void RbpTransplant(RBTREE *Tree, RBNODE *Node1, RBNODE *Node2)
INTSTATUS RbLookupNode(RBTREE *Tree, RBNODE *NodeToSearch, RBNODE **NodeFound)
FUNC_RbTreeWalkCallback * PFUNC_RbTreeWalkCallback
static void RbpInsertFixup(RBTREE *Tree, RBNODE *Node)
static void RbpRightRotate(RBTREE *Tree, RBNODE *Node)
INTSTATUS RbLookupNodeCustomCompare(RBTREE *Tree, PFUNC_RbTreeNodeCustomCompare CompareFunc, void *Key, RBNODE **NodeFound)
FUNC_RbTreeNodeFree * PFUNC_RbTreeNodeFree
#define INT_STATUS_INVALID_PARAMETER_1
enum _RbNodeColor RbNodeColor
RBNODE * RbTreeMinimum(RBTREE *Tree, RBNODE *Node)
static void RbpLeftRotate(RBTREE *Tree, RBNODE *Node)
#define INT_STATUS_INVALID_PARAMETER_2
FUNC_RbTreeNodeCustomCompare * PFUNC_RbTreeNodeCustomCompare
#define INT_STATUS_INVALID_PARAMETER_3