Showing
2 changed files
with
30 additions
and
30 deletions
| ... | ... | @@ -32,14 +32,12 @@ |
| 32 | 32 | #define TR_TREE_CHILD(node) \ |
| 33 | 33 | (NULL==TR_TREE_RIGHT((node))?TR_TREE_LEFT((node)):TR_TREE_RIGHT((node))) |
| 34 | 34 | |
| 35 | -#define TR_TREE_SIBLING(node) \ | |
| 36 | - (NULL!=TR_TREE_PARENT((node))? \ | |
| 37 | - ((node)==TR_TREE_PARENT((node))->left? \ | |
| 38 | - TR_TREE_PARENT((node))->right: \ | |
| 39 | - TR_TREE_PARENT((node))->left): \ | |
| 40 | - NULL) | |
| 41 | - | |
| 42 | -#define TR_TREE_GRANDPARENT(node) (TR_TREE_PARENT((node))->parent) | |
| 35 | +#define TR_TREE_SIBLING(node) \ | |
| 36 | + (NULL!=(node)->parent? \ | |
| 37 | + ((node)==(node)->parent->left? \ | |
| 38 | + (node)->parent->right: \ | |
| 39 | + (node)->parent->left): \ | |
| 40 | + NULL) | |
| 43 | 41 | |
| 44 | 42 | #define TR_TREE_UNCLE(node) \ |
| 45 | 43 | ((node)->parent == (node)->parent->parent->left \ |
| ... | ... | @@ -110,31 +108,31 @@ typedef enum {rbBlack=1, rbRed=2} TR_rbColor; |
| 110 | 108 | * it before using this macro. |
| 111 | 109 | * Also be aware that found needs to be a valid lvalue and an integer. |
| 112 | 110 | */ |
| 113 | -#define TR_TREE_FIND(node, search, found, comp) \ | |
| 114 | - (found) = -1; \ | |
| 115 | - if ((node)) { \ | |
| 116 | - while(1) { \ | |
| 117 | - (found) = (comp)((node)->data, (search)); \ | |
| 118 | - if (0 != (found)) { \ | |
| 119 | - if (0 < (found)) { \ | |
| 120 | - if (! (node)->left) break; \ | |
| 121 | - (node) = (node)->left; \ | |
| 122 | - } else { \ | |
| 123 | - if (! (node)->right) break; \ | |
| 124 | - (node) = (node)->right; \ | |
| 125 | - } \ | |
| 126 | - } else { \ | |
| 127 | - break; \ | |
| 128 | - } \ | |
| 129 | - } \ | |
| 111 | +#define TR_TREE_FIND(node, search, found, comp) \ | |
| 112 | + (found) = -1; \ | |
| 113 | + if ((node)) { \ | |
| 114 | + while (1) { \ | |
| 115 | + (found) = (comp)((node)->data, (search)); \ | |
| 116 | + if (0 != (found)) { \ | |
| 117 | + if (0 < (found)) { \ | |
| 118 | + if (! (node)->left) break; \ | |
| 119 | + (node) = (node)->left; \ | |
| 120 | + } else { \ | |
| 121 | + if (! (node)->right) break; \ | |
| 122 | + (node) = (node)->right; \ | |
| 123 | + } \ | |
| 124 | + } else { \ | |
| 125 | + break; \ | |
| 126 | + } \ | |
| 127 | + } \ | |
| 130 | 128 | } |
| 131 | 129 | |
| 132 | 130 | #define TR_TREE_BALANCE_DELETE_CASE1(node) \ |
| 133 | - if (NULL == TR_TREE_PARENT((node))) { \ | |
| 134 | - break; \ | |
| 131 | + if (NULL == (node)->parent) { \ | |
| 132 | + break; \ | |
| 135 | 133 | } |
| 136 | 134 | |
| 137 | -#define TR_TREE_BALANCE_DELETE_CASE2(root, node, sibling) \ | |
| 135 | +#define TR_TREE_BALANCE_DELETE_CASE2(root, node, sibling) \ | |
| 138 | 136 | if (NULL != (sibling) && rbRed == (sibling)->color) { \ |
| 139 | 137 | (node)->parent->color = rbRed; \ |
| 140 | 138 | (sibling)->color = rbBlack; \ |
| ... | ... | @@ -216,6 +214,7 @@ typedef enum {rbBlack=1, rbRed=2} TR_rbColor; |
| 216 | 214 | #define TR_TREE_BALANCE_DELETE(root, node, sibling) \ |
| 217 | 215 | while(1) { \ |
| 218 | 216 | TR_TREE_BALANCE_DELETE_CASE1((node)) \ |
| 217 | + sibling = TR_TREE_SIBLING(node); \ | |
| 219 | 218 | TR_TREE_BALANCE_DELETE_CASE2((root), (node), (sibling)) \ |
| 220 | 219 | TR_TREE_BALANCE_DELETE_CASE34((root), (node), (sibling)) \ |
| 221 | 220 | TR_TREE_BALANCE_DELETE_CASE5((root), (node), (sibling)) \ |
| ... | ... | @@ -224,7 +223,7 @@ typedef enum {rbBlack=1, rbRed=2} TR_rbColor; |
| 224 | 223 | } |
| 225 | 224 | |
| 226 | 225 | #define TR_TREE_BALANCE_INSERT_CASE1(node) \ |
| 227 | - if (NULL == TR_TREE_PARENT((node))) { \ | |
| 226 | + if (NULL == (node)->parent) { \ | |
| 228 | 227 | (node)->color = rbBlack; \ |
| 229 | 228 | break; \ |
| 230 | 229 | } | ... | ... |
| ... | ... | @@ -98,6 +98,7 @@ newElement(size_t size) |
| 98 | 98 | return element; |
| 99 | 99 | } |
| 100 | 100 | |
| 101 | +#ifdef MEM_OPT | |
| 101 | 102 | static |
| 102 | 103 | int |
| 103 | 104 | _memSegmentFindCompare(const void * a, const void * b) |
| ... | ... | @@ -290,7 +291,6 @@ deleteElement(struct memSegment ** tree, size_t size) |
| 290 | 291 | return del_node; |
| 291 | 292 | } |
| 292 | 293 | |
| 293 | - s = TR_TREE_SIBLING(node); | |
| 294 | 294 | TR_TREE_BALANCE_DELETE(tree, node, s); |
| 295 | 295 | |
| 296 | 296 | return del_node; |
| ... | ... | @@ -365,6 +365,7 @@ segmentFree(struct memSegment * segment, int depth) |
| 365 | 365 | segment = next; |
| 366 | 366 | } |
| 367 | 367 | } |
| 368 | +#endif | |
| 368 | 369 | |
| 369 | 370 | void * |
| 370 | 371 | TR_reference(void * mem) | ... | ... |
Please
register
or
login
to post a comment