Commit da3ff3416821d277d925802fd56802b9e6964070
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