Commit da3ff3416821d277d925802fd56802b9e6964070

Authored by Georg Hopp
1 parent 5e1c8f73

use tree macros in memory management tree

Showing 1 changed file with 34 additions and 183 deletions
@@ -54,8 +54,7 @@ @@ -54,8 +54,7 @@
54 #include <unistd.h> 54 #include <unistd.h>
55 55
56 #include "tr/memory.h" 56 #include "tr/memory.h"
57 -  
58 -enum rbColor {rbBlack=1, rbRed=2}; 57 +#include "tr/tree_macros.h"
59 58
60 59
61 struct memSegment 60 struct memSegment
@@ -64,7 +63,9 @@ struct memSegment @@ -64,7 +63,9 @@ struct memSegment
64 size_t size; 63 size_t size;
65 void * ptr; 64 void * ptr;
66 65
67 - enum rbColor color; 66 + TR_rbColor color;
  67 +
  68 + struct memSegment * data;
68 69
69 struct memSegment * next; 70 struct memSegment * next;
70 struct memSegment * last; 71 struct memSegment * last;
@@ -84,6 +85,8 @@ newElement(size_t size) @@ -84,6 +85,8 @@ newElement(size_t size)
84 element->size = size; 85 element->size = size;
85 element->ptr = (void*)element + sizeof(struct memSegment); 86 element->ptr = (void*)element + sizeof(struct memSegment);
86 87
  88 + element->data = element;
  89 +
87 element->next = NULL; 90 element->next = NULL;
88 element->last = NULL; 91 element->last = NULL;
89 92
@@ -121,133 +124,6 @@ findElement(struct memSegment * tree, size_t size) @@ -121,133 +124,6 @@ findElement(struct memSegment * tree, size_t size)
121 return fitting; 124 return fitting;
122 } 125 }
123 126
124 -/*  
125 - * function to get specific elements needed for  
126 - * rb handling, grandparent, uncle and sibbling  
127 - */  
128 -static  
129 -struct memSegment *  
130 -grandparent(struct memSegment * node)  
131 -{  
132 - if (NULL != node && NULL != node->parent) {  
133 - return node->parent->parent;  
134 - }  
135 -  
136 - return NULL;  
137 -}  
138 -  
139 -static  
140 -struct memSegment *  
141 -uncle(struct memSegment * node)  
142 -{  
143 - struct memSegment * gp = grandparent(node);  
144 -  
145 - if (NULL == gp) {  
146 - return NULL;  
147 - }  
148 -  
149 - if (node->parent == gp->left) {  
150 - return gp->right;  
151 - }  
152 -  
153 - return gp->left;  
154 -}  
155 -  
156 -static  
157 -struct memSegment *  
158 -sibling(struct memSegment * node)  
159 -{  
160 - if (NULL == node) {  
161 - return NULL;  
162 - }  
163 -  
164 - if (NULL == node->parent->left || node == node->parent->left) {  
165 - return node->parent->right;  
166 - } else {  
167 - return node->parent->left;  
168 - }  
169 -}  
170 -  
171 -/*  
172 - * tree modifications...needed for rb handling.  
173 - */  
174 -static  
175 -void  
176 -rotateLeft(struct memSegment ** tree, struct memSegment * node)  
177 -{  
178 - struct memSegment * rightChild = node->right;  
179 - struct memSegment * rcLeftSub = node->right->left;  
180 -  
181 - rightChild->left = node;  
182 - rightChild->parent = node->parent;  
183 - node->right = rcLeftSub;  
184 - if (NULL != rcLeftSub) {  
185 - rcLeftSub->parent = node;  
186 - }  
187 -  
188 - if (node->parent) {  
189 - if (node->parent->left == node) {  
190 - node->parent->left = rightChild;  
191 - } else {  
192 - node->parent->right = rightChild;  
193 - }  
194 - } else {  
195 - *tree = rightChild;  
196 - }  
197 -  
198 - node->parent = rightChild;  
199 -}  
200 -  
201 -static  
202 -void  
203 -rotateRight(struct memSegment ** tree, struct memSegment * node)  
204 -{  
205 - struct memSegment * leftChild = node->left;  
206 - struct memSegment * lcRightSub = node->left->right;  
207 -  
208 - leftChild->right = node;  
209 - leftChild->parent = node->parent;  
210 - node->left = lcRightSub;  
211 - if (NULL != lcRightSub) {  
212 - lcRightSub->parent = node;  
213 - }  
214 -  
215 - if (node->parent) {  
216 - if (node->parent->left == node) {  
217 - node->parent->left = leftChild;  
218 - } else {  
219 - node->parent->right = leftChild;  
220 - }  
221 - } else {  
222 - *tree = leftChild;  
223 - }  
224 -  
225 - node->parent = leftChild;  
226 -}  
227 -  
228 -static  
229 -void  
230 -replaceNode(  
231 - struct memSegment ** tree,  
232 - struct memSegment * node1,  
233 - struct memSegment * node2)  
234 -{  
235 - if (NULL != node1->parent) {  
236 - if (node1 == node1->parent->left) {  
237 - node1->parent->left = node2;  
238 - } else {  
239 - node1->parent->right = node2;  
240 - }  
241 - } else {  
242 - *tree = node2;  
243 - }  
244 -  
245 - if (NULL != node2) {  
246 - node2->parent = node1->parent;  
247 - }  
248 -}  
249 -  
250 -  
251 /** 127 /**
252 * insert element in tree 128 * insert element in tree
253 */ 129 */
@@ -324,8 +200,8 @@ insertElement(struct memSegment ** tree, struct memSegment * element) @@ -324,8 +200,8 @@ insertElement(struct memSegment ** tree, struct memSegment * element)
324 } 200 }
325 201
326 // case 3 202 // case 3
327 - u = uncle(node);  
328 - g = grandparent(node); 203 + u = TR_TREE_UNCLE(node);
  204 + g = TR_TREE_GRANDPARENT(node);
329 205
330 if (u != NULL && u->color == rbRed) { 206 if (u != NULL && u->color == rbRed) {
331 node->parent->color = rbBlack; 207 node->parent->color = rbBlack;
@@ -338,24 +214,24 @@ insertElement(struct memSegment ** tree, struct memSegment * element) @@ -338,24 +214,24 @@ insertElement(struct memSegment ** tree, struct memSegment * element)
338 214
339 // case 4 215 // case 4
340 if (node == node->parent->right && node->parent == g->left) { 216 if (node == node->parent->right && node->parent == g->left) {
341 - rotateLeft(tree, node->parent); 217 + TR_TREE_ROTATE(left, tree, node->parent);
342 node = node->left; 218 node = node->left;
343 } else if (node == node->parent->left && node->parent == g->right) { 219 } else if (node == node->parent->left && node->parent == g->right) {
344 220
345 - rotateRight(tree, node->parent); 221 + TR_TREE_ROTATE(right, tree, node->parent);
346 node = node->right; 222 node = node->right;
347 } 223 }
348 224
349 // case 5 225 // case 5
350 - g = grandparent(node); 226 + g = TR_TREE_GRANDPARENT(node);
351 227
352 node->parent->color = rbBlack; 228 node->parent->color = rbBlack;
353 g->color = rbRed; 229 g->color = rbRed;
354 230
355 if (node == node->parent->left) { 231 if (node == node->parent->left) {
356 - rotateRight(tree, g); 232 + TR_TREE_ROTATE(right, tree, g);
357 } else { 233 } else {
358 - rotateLeft(tree, g); 234 + TR_TREE_ROTATE(left, tree, g);
359 } 235 }
360 236
361 // we're done.. 237 // we're done..
@@ -366,36 +242,6 @@ insertElement(struct memSegment ** tree, struct memSegment * element) @@ -366,36 +242,6 @@ insertElement(struct memSegment ** tree, struct memSegment * element)
366 return new_node; 242 return new_node;
367 } 243 }
368 244
369 -/**  
370 - * delete element from tree  
371 - * here multiple functions are involved....  
372 - * =======================================================================  
373 - */  
374 -/**  
375 - * find minimum of the right subtree aka leftmost leaf of right subtree  
376 - * aka left in-order successor.  
377 - * We return the parent of the element in the out argument parent.  
378 - * This can be NULL wenn calling.  
379 - *  
380 - * 2: *successor = {size = 80, ptr = 0x603ae0, color = rbRed, parent = 0x603160,  
381 - * left = 0x0, right = 0x0}  
382 - * 1: *node = {size = 70, ptr = 0x603a60, color = rbBlack, parent = 0x603070,  
383 - * left = 0x6030e0, right = 0x6031e0}  
384 - *  
385 - */  
386 -static  
387 -struct memSegment *  
388 -findInOrderSuccessor(struct memSegment * tree)  
389 -{  
390 - struct memSegment * node = tree->right;  
391 -  
392 - while (NULL != node->left) {  
393 - node = node->left;  
394 - }  
395 -  
396 - return node;  
397 -}  
398 -  
399 static 245 static
400 struct memSegment * 246 struct memSegment *
401 deleteElement(struct memSegment ** tree, struct memSegment * element) 247 deleteElement(struct memSegment ** tree, struct memSegment * element)
@@ -456,14 +302,19 @@ deleteElement(struct memSegment ** tree, struct memSegment * element) @@ -456,14 +302,19 @@ deleteElement(struct memSegment ** tree, struct memSegment * element)
456 302
457 // case 1: two children 303 // case 1: two children
458 if (NULL != node->left && NULL != node->right) { 304 if (NULL != node->left && NULL != node->right) {
459 - struct memSegment * successor = findInOrderSuccessor(node); 305 + struct memSegment * successor;
  306 + struct memSegment * tmpparent;
  307 + struct memSegment * tmpleft;
  308 + struct memSegment * tmpright;
  309 + TR_rbColor tmpcolor;
460 310
461 - enum rbColor tmpcolor = successor->color;  
462 - struct memSegment * tmpparent = successor->parent;  
463 - struct memSegment * tmpleft = successor->left;  
464 - struct memSegment * tmpright = successor->right; 311 + TR_TREE_INORDER_SUCC(node, successor);
  312 + tmpparent = successor->parent;
  313 + tmpleft = successor->left;
  314 + tmpright = successor->right;
  315 + tmpcolor = successor->color;
465 316
466 - replaceNode(tree, node, successor); 317 + TR_TREE_REPLACE_NODE(tree, node, successor);
467 318
468 successor->color = node->color; 319 successor->color = node->color;
469 successor->left = node->left; 320 successor->left = node->left;
@@ -486,7 +337,7 @@ deleteElement(struct memSegment ** tree, struct memSegment * element) @@ -486,7 +337,7 @@ deleteElement(struct memSegment ** tree, struct memSegment * element)
486 337
487 // Precondition: n has at most one non-null child. 338 // Precondition: n has at most one non-null child.
488 child = (NULL == node->right) ? node->left : node->right; 339 child = (NULL == node->right) ? node->left : node->right;
489 - replaceNode(tree, node, child); 340 + TR_TREE_REPLACE_NODE(tree, node, child);
490 341
491 // delete one child case 342 // delete one child case
492 // TODO this is overly complex as simply derived from the function... 343 // TODO this is overly complex as simply derived from the function...
@@ -518,7 +369,7 @@ deleteElement(struct memSegment ** tree, struct memSegment * element) @@ -518,7 +369,7 @@ deleteElement(struct memSegment ** tree, struct memSegment * element)
518 } 369 }
519 370
520 // case 2 371 // case 2
521 - s = sibling(node); 372 + s = TR_TREE_SIBLING(node);
522 373
523 if (NULL != s && s->color == rbRed) { 374 if (NULL != s && s->color == rbRed) {
524 node->parent->color = rbRed; 375 node->parent->color = rbRed;
@@ -530,13 +381,13 @@ deleteElement(struct memSegment ** tree, struct memSegment * element) @@ -530,13 +381,13 @@ deleteElement(struct memSegment ** tree, struct memSegment * element)
530 * null we must be left, even if its set to NULL previously 381 * null we must be left, even if its set to NULL previously
531 */ 382 */
532 if (NULL != node->parent->right && node != node->parent->right) { 383 if (NULL != node->parent->right && node != node->parent->right) {
533 - rotateLeft(tree, node->parent); 384 + TR_TREE_ROTATE(left, tree, node->parent);
534 } else { 385 } else {
535 - rotateRight(tree, node->parent); 386 + TR_TREE_ROTATE(right, tree, node->parent);
536 } 387 }
537 } 388 }
538 389
539 - s = sibling(node); 390 + s = TR_TREE_SIBLING(node);
540 // case 3 / 4 391 // case 3 / 4
541 if (NULL == s || ((s->color == rbBlack) && 392 if (NULL == s || ((s->color == rbBlack) &&
542 (NULL == s->left || s->left->color == rbBlack) && 393 (NULL == s->left || s->left->color == rbBlack) &&
@@ -577,7 +428,7 @@ deleteElement(struct memSegment ** tree, struct memSegment * element) @@ -577,7 +428,7 @@ deleteElement(struct memSegment ** tree, struct memSegment * element)
577 s->color = rbRed; 428 s->color = rbRed;
578 s->left->color = rbBlack; 429 s->left->color = rbBlack;
579 430
580 - rotateRight(tree, s); 431 + TR_TREE_ROTATE(right, tree, s);
581 } else if ((node == node->parent->right) && 432 } else if ((node == node->parent->right) &&
582 (NULL == s->left || s->left->color == rbBlack) && 433 (NULL == s->left || s->left->color == rbBlack) &&
583 (NULL != s->right && s->right->color == rbRed)) { 434 (NULL != s->right && s->right->color == rbRed)) {
@@ -585,11 +436,11 @@ deleteElement(struct memSegment ** tree, struct memSegment * element) @@ -585,11 +436,11 @@ deleteElement(struct memSegment ** tree, struct memSegment * element)
585 s->color = rbRed; 436 s->color = rbRed;
586 s->right->color = rbBlack; 437 s->right->color = rbBlack;
587 438
588 - rotateLeft(tree, s); 439 + TR_TREE_ROTATE(left, tree, s);
589 } 440 }
590 } 441 }
591 442
592 - s = sibling(node); 443 + s = TR_TREE_SIBLING(node);
593 // case 6 444 // case 6
594 if (NULL != s) { 445 if (NULL != s) {
595 s->color = node->parent->color; 446 s->color = node->parent->color;
@@ -607,12 +458,12 @@ deleteElement(struct memSegment ** tree, struct memSegment * element) @@ -607,12 +458,12 @@ deleteElement(struct memSegment ** tree, struct memSegment * element)
607 if (NULL != s->right) { 458 if (NULL != s->right) {
608 s->right->color = rbBlack; 459 s->right->color = rbBlack;
609 } 460 }
610 - rotateLeft(tree, node->parent); 461 + TR_TREE_ROTATE(left, tree, node->parent);
611 } else { 462 } else {
612 if (NULL != s->left) { 463 if (NULL != s->left) {
613 s->left->color = rbBlack; 464 s->left->color = rbBlack;
614 } 465 }
615 - rotateRight(tree, node->parent); 466 + TR_TREE_ROTATE(right, tree, node->parent);
616 } 467 }
617 } 468 }
618 469
Please register or login to post a comment