Commit eacc711dbf23da7361be9383000ee79f18e72534

Authored by Georg Hopp
1 parent 07cb2069

moved tree macros to trbase library, as they are also used in the memory managem…

…ent. Some small fixes
@@ -23,104 +23,9 @@ @@ -23,104 +23,9 @@
23 #ifndef __TR_TREE_H__ 23 #ifndef __TR_TREE_H__
24 #define __TR_TREE_H__ 24 #define __TR_TREE_H__
25 25
  26 +#include "tr/tree_macros.h"
26 #include "trbase.h" 27 #include "trbase.h"
27 28
28 -#define TR_TREE_RIGHT(node) (NULL!=(node)?(node)->right:NULL)  
29 -#define TR_TREE_LEFT(node) (NULL!=(node)?(node)->left:NULL)  
30 -#define TR_TREE_PARENT(node) (NULL!=(node)?(node)->parent:NULL)  
31 -  
32 -/*  
33 - * Find data in a tree.  
34 - * Attention: This will change node, so normally you need to copy  
35 - * it before using this macro.  
36 - * Also be aware that found needs to be a valid lvalue and an integer.  
37 - */  
38 -#define TR_TREE_FIND(node, search, found, comp) \  
39 - (found) = -1; \  
40 - while((node) && ((node)->left || (node)->right)) { \  
41 - (found) = (comp)((node)->data, (search)); \  
42 - if (0 != (found)) { \  
43 - if (0 < (found)) { \  
44 - (node) = (node)->left; \  
45 - } else { \  
46 - (node) = (node)->right; \  
47 - } \  
48 - } else { \  
49 - break; \  
50 - } \  
51 - }  
52 -  
53 -#define TR_TREE_CHILD(node) \  
54 - (NULL==TR_TREE_RIGHT((node))?TR_TREE_LEFT((node)):TR_TREE_RIGHT((node)))  
55 -  
56 -#define TR_TREE_SIBLING(node) \  
57 - (NULL!=TR_TREE_PARENT((node))? \  
58 - ((node)==TR_TREE_PARENT((node))->left? \  
59 - TR_TREE_PARENT((node))->right: \  
60 - TR_TREE_PARENT((node))->left): \  
61 - NULL)  
62 -  
63 -#define TR_TREE_GRANDPARENT(node) (TR_TREE_PARENT((node))->parent)  
64 -  
65 -#define TR_TREE_UNCLE(node) \  
66 - ((node)->parent == (node)->parent->parent->left? \  
67 - (node)->parent->parent->right: \  
68 - (node)->parent->parent->left)  
69 -  
70 -#define TR_TREE_REPLACE_NODE(root, node1, node2) \  
71 - if (NULL != (node1)->parent) { \  
72 - if ((node1) == (node1)->parent->left) { \  
73 - (node1)->parent->left = (node2); \  
74 - } else { \  
75 - (node1)->parent->right = (node2); \  
76 - } \  
77 - } else { \  
78 - *(root) = (node2); \  
79 - } \  
80 - if (NULL != (node2)) { \  
81 - (node2)->parent = (node1)->parent; \  
82 - }  
83 -  
84 -#define TR_TREE_ROT_RCLD_right(node) ((node)->left)  
85 -#define TR_TREE_ROT_RCLD_left(node) ((node)->right)  
86 -  
87 -#define TR_TREE_ROTATE(lr, root, node) \  
88 - if (NULL != (node)) { \  
89 - void * stPar = node->parent; \  
90 - void * relCld = TR_TREE_ROT_RCLD_##lr(node); \  
91 - void * relCCld = TR_TREE_ROT_RCLD_##lr(node)->lr; \  
92 - void * nLeft_p = &TR_TREE_ROT_RCLD_##lr(node); \  
93 - if (NULL != relCCld) { \  
94 - TR_TREE_ROT_RCLD_##lr(node)->lr->parent = node; \  
95 - } \  
96 - TR_TREE_ROT_RCLD_##lr(node)->lr = node; \  
97 - if (NULL != node->parent) { \  
98 - if (node->parent->left == node) { \  
99 - node->parent->left = relCld; \  
100 - } else { \  
101 - node->parent->right = relCld; \  
102 - } \  
103 - } else { \  
104 - *(root) = relCld; \  
105 - } \  
106 - node->parent = relCld; \  
107 - TR_TREE_ROT_RCLD_##lr(node)->parent = stPar; \  
108 - *(void**)nLeft_p = relCCld; \  
109 - }  
110 -  
111 -typedef enum {rbBlack=1, rbRed=2} TR_rbColor;  
112 -  
113 -#define TR_TREE_NODE_BLACK(node) (NULL == (node) || rbBlack == (node)->color)  
114 -#define TR_TREE_NODE_RED(node) (NULL == (node) || rbRed == (node)->color)  
115 -#define TR_TREE_NODE_STRICT_BLACK(node) (NULL != (node) && rbBlack == (node)->color)  
116 -#define TR_TREE_NODE_STRICT_RED(node) (NULL != (node) && rbRed == (node)->color)  
117 -  
118 -#define TR_TREE_INORDER_SUCC(node, succ) \  
119 - succ = (node)->right; \  
120 - while (NULL != succ->left) { \  
121 - succ = succ->left; \  
122 - }  
123 -  
124 TR_CLASS(TR_Tree) { 29 TR_CLASS(TR_Tree) {
125 void * data; 30 void * data;
126 31
@@ -26,9 +26,9 @@ @@ -26,9 +26,9 @@
26 void * 26 void *
27 TR_treeDelete(TR_Tree * this, const void * search, TR_TreeComp comp) 27 TR_treeDelete(TR_Tree * this, const void * search, TR_TreeComp comp)
28 { 28 {
29 - TR_Tree node = *this;  
30 - TR_Tree del_node;  
31 - int found; 29 + TR_Tree node = *this;
  30 + TR_Tree del_node;
  31 + int found;
32 32
33 void * data; 33 void * data;
34 34
@@ -25,12 +25,11 @@ @@ -25,12 +25,11 @@
25 void * 25 void *
26 TR_treeFind(TR_Tree this, const void * search, TR_TreeComp comp) 26 TR_treeFind(TR_Tree this, const void * search, TR_TreeComp comp)
27 { 27 {
28 - TR_Tree node = this;  
29 - int found; 28 + int found;
30 29
31 - TR_TREE_FIND(node, search, found, comp); 30 + TR_TREE_FIND(this, search, found, comp);
32 31
33 - return found == 0 ? node->data : NULL; 32 + return found == 0 ? this->data : NULL;
34 } 33 }
35 34
36 // vim: set ts=4 sw=4: 35 // vim: set ts=4 sw=4:
Please register or login to post a comment