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 54 #include <unistd.h>
55 55
56 56 #include "tr/memory.h"
57   -
58   -enum rbColor {rbBlack=1, rbRed=2};
  57 +#include "tr/tree_macros.h"
59 58
60 59
61 60 struct memSegment
... ... @@ -64,7 +63,9 @@ struct memSegment
64 63 size_t size;
65 64 void * ptr;
66 65
67   - enum rbColor color;
  66 + TR_rbColor color;
  67 +
  68 + struct memSegment * data;
68 69
69 70 struct memSegment * next;
70 71 struct memSegment * last;
... ... @@ -84,6 +85,8 @@ newElement(size_t size)
84 85 element->size = size;
85 86 element->ptr = (void*)element + sizeof(struct memSegment);
86 87
  88 + element->data = element;
  89 +
87 90 element->next = NULL;
88 91 element->last = NULL;
89 92
... ... @@ -121,133 +124,6 @@ findElement(struct memSegment * tree, size_t size)
121 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 128 * insert element in tree
253 129 */
... ... @@ -324,8 +200,8 @@ insertElement(struct memSegment ** tree, struct memSegment * element)
324 200 }
325 201
326 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 206 if (u != NULL && u->color == rbRed) {
331 207 node->parent->color = rbBlack;
... ... @@ -338,24 +214,24 @@ insertElement(struct memSegment ** tree, struct memSegment * element)
338 214
339 215 // case 4
340 216 if (node == node->parent->right && node->parent == g->left) {
341   - rotateLeft(tree, node->parent);
  217 + TR_TREE_ROTATE(left, tree, node->parent);
342 218 node = node->left;
343 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 222 node = node->right;
347 223 }
348 224
349 225 // case 5
350   - g = grandparent(node);
  226 + g = TR_TREE_GRANDPARENT(node);
351 227
352 228 node->parent->color = rbBlack;
353 229 g->color = rbRed;
354 230
355 231 if (node == node->parent->left) {
356   - rotateRight(tree, g);
  232 + TR_TREE_ROTATE(right, tree, g);
357 233 } else {
358   - rotateLeft(tree, g);
  234 + TR_TREE_ROTATE(left, tree, g);
359 235 }
360 236
361 237 // we're done..
... ... @@ -366,36 +242,6 @@ insertElement(struct memSegment ** tree, struct memSegment * element)
366 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 245 static
400 246 struct memSegment *
401 247 deleteElement(struct memSegment ** tree, struct memSegment * element)
... ... @@ -456,14 +302,19 @@ deleteElement(struct memSegment ** tree, struct memSegment * element)
456 302
457 303 // case 1: two children
458 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 319 successor->color = node->color;
469 320 successor->left = node->left;
... ... @@ -486,7 +337,7 @@ deleteElement(struct memSegment ** tree, struct memSegment * element)
486 337
487 338 // Precondition: n has at most one non-null child.
488 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 342 // delete one child case
492 343 // TODO this is overly complex as simply derived from the function...
... ... @@ -518,7 +369,7 @@ deleteElement(struct memSegment ** tree, struct memSegment * element)
518 369 }
519 370
520 371 // case 2
521   - s = sibling(node);
  372 + s = TR_TREE_SIBLING(node);
522 373
523 374 if (NULL != s && s->color == rbRed) {
524 375 node->parent->color = rbRed;
... ... @@ -530,13 +381,13 @@ deleteElement(struct memSegment ** tree, struct memSegment * element)
530 381 * null we must be left, even if its set to NULL previously
531 382 */
532 383 if (NULL != node->parent->right && node != node->parent->right) {
533   - rotateLeft(tree, node->parent);
  384 + TR_TREE_ROTATE(left, tree, node->parent);
534 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 391 // case 3 / 4
541 392 if (NULL == s || ((s->color == rbBlack) &&
542 393 (NULL == s->left || s->left->color == rbBlack) &&
... ... @@ -577,7 +428,7 @@ deleteElement(struct memSegment ** tree, struct memSegment * element)
577 428 s->color = rbRed;
578 429 s->left->color = rbBlack;
579 430
580   - rotateRight(tree, s);
  431 + TR_TREE_ROTATE(right, tree, s);
581 432 } else if ((node == node->parent->right) &&
582 433 (NULL == s->left || s->left->color == rbBlack) &&
583 434 (NULL != s->right && s->right->color == rbRed)) {
... ... @@ -585,11 +436,11 @@ deleteElement(struct memSegment ** tree, struct memSegment * element)
585 436 s->color = rbRed;
586 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 444 // case 6
594 445 if (NULL != s) {
595 446 s->color = node->parent->color;
... ... @@ -607,12 +458,12 @@ deleteElement(struct memSegment ** tree, struct memSegment * element)
607 458 if (NULL != s->right) {
608 459 s->right->color = rbBlack;
609 460 }
610   - rotateLeft(tree, node->parent);
  461 + TR_TREE_ROTATE(left, tree, node->parent);
611 462 } else {
612 463 if (NULL != s->left) {
613 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