]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - lib/rbtree.c
rbtree: augmented rbtree test
[mirror_ubuntu-artful-kernel.git] / lib / rbtree.c
CommitLineData
1da177e4
LT
1/*
2 Red Black Trees
3 (C) 1999 Andrea Arcangeli <andrea@suse.de>
4 (C) 2002 David Woodhouse <dwmw2@infradead.org>
46b6135a
ML
5 (C) 2012 Michel Lespinasse <walken@google.com>
6
1da177e4
LT
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
21 linux/lib/rbtree.c
22*/
23
24#include <linux/rbtree.h>
8bc3bcc9 25#include <linux/export.h>
1da177e4 26
5bc9188a
ML
27/*
28 * red-black trees properties: http://en.wikipedia.org/wiki/Rbtree
29 *
30 * 1) A node is either red or black
31 * 2) The root is black
32 * 3) All leaves (NULL) are black
33 * 4) Both children of every red node are black
34 * 5) Every simple path from root to leaves contains the same number
35 * of black nodes.
36 *
37 * 4 and 5 give the O(log n) guarantee, since 4 implies you cannot have two
38 * consecutive red nodes in a path and every red node is therefore followed by
39 * a black. So if B is the number of black nodes on every simple path (as per
40 * 5), then the longest possible path due to 4 is 2B.
41 *
42 * We shall indicate color with case, where black nodes are uppercase and red
6280d235
ML
43 * nodes will be lowercase. Unknown color nodes shall be drawn as red within
44 * parentheses and have some accompanying text comment.
5bc9188a
ML
45 */
46
bf7ad8ee
ML
47#define RB_RED 0
48#define RB_BLACK 1
49
4f035ad6
ML
50#define __rb_parent(pc) ((struct rb_node *)(pc & ~3))
51
52#define __rb_color(pc) ((pc) & 1)
53#define __rb_is_black(pc) __rb_color(pc)
54#define __rb_is_red(pc) (!__rb_color(pc))
55#define rb_color(rb) __rb_color((rb)->__rb_parent_color)
56#define rb_is_red(rb) __rb_is_red((rb)->__rb_parent_color)
57#define rb_is_black(rb) __rb_is_black((rb)->__rb_parent_color)
bf7ad8ee 58
46b6135a
ML
59static inline void rb_set_black(struct rb_node *rb)
60{
61 rb->__rb_parent_color |= RB_BLACK;
62}
63
bf7ad8ee
ML
64static inline void rb_set_parent(struct rb_node *rb, struct rb_node *p)
65{
66 rb->__rb_parent_color = rb_color(rb) | (unsigned long)p;
67}
bf7ad8ee 68
5bc9188a
ML
69static inline void rb_set_parent_color(struct rb_node *rb,
70 struct rb_node *p, int color)
71{
72 rb->__rb_parent_color = (unsigned long)p | color;
73}
74
75static inline struct rb_node *rb_red_parent(struct rb_node *red)
76{
77 return (struct rb_node *)red->__rb_parent_color;
78}
79
7abc704a
ML
80static inline void
81__rb_change_child(struct rb_node *old, struct rb_node *new,
82 struct rb_node *parent, struct rb_root *root)
83{
84 if (parent) {
85 if (parent->rb_left == old)
86 parent->rb_left = new;
87 else
88 parent->rb_right = new;
89 } else
90 root->rb_node = new;
91}
92
5bc9188a
ML
93/*
94 * Helper function for rotations:
95 * - old's parent and color get assigned to new
96 * - old gets assigned new as a parent and 'color' as a color.
97 */
98static inline void
99__rb_rotate_set_parents(struct rb_node *old, struct rb_node *new,
100 struct rb_root *root, int color)
101{
102 struct rb_node *parent = rb_parent(old);
103 new->__rb_parent_color = old->__rb_parent_color;
104 rb_set_parent_color(old, new, color);
7abc704a 105 __rb_change_child(old, new, parent, root);
5bc9188a
ML
106}
107
1da177e4
LT
108void rb_insert_color(struct rb_node *node, struct rb_root *root)
109{
5bc9188a 110 struct rb_node *parent = rb_red_parent(node), *gparent, *tmp;
1da177e4 111
6d58452d
ML
112 while (true) {
113 /*
114 * Loop invariant: node is red
115 *
116 * If there is a black parent, we are done.
117 * Otherwise, take some corrective action as we don't
118 * want a red root or two consecutive red nodes.
119 */
6d58452d 120 if (!parent) {
5bc9188a 121 rb_set_parent_color(node, NULL, RB_BLACK);
6d58452d
ML
122 break;
123 } else if (rb_is_black(parent))
124 break;
125
5bc9188a
ML
126 gparent = rb_red_parent(parent);
127
59633abf
ML
128 tmp = gparent->rb_right;
129 if (parent != tmp) { /* parent == gparent->rb_left */
5bc9188a
ML
130 if (tmp && rb_is_red(tmp)) {
131 /*
132 * Case 1 - color flips
133 *
134 * G g
135 * / \ / \
136 * p u --> P U
137 * / /
138 * n N
139 *
140 * However, since g's parent might be red, and
141 * 4) does not allow this, we need to recurse
142 * at g.
143 */
144 rb_set_parent_color(tmp, gparent, RB_BLACK);
145 rb_set_parent_color(parent, gparent, RB_BLACK);
146 node = gparent;
147 parent = rb_parent(node);
148 rb_set_parent_color(node, parent, RB_RED);
149 continue;
1da177e4
LT
150 }
151
59633abf
ML
152 tmp = parent->rb_right;
153 if (node == tmp) {
5bc9188a
ML
154 /*
155 * Case 2 - left rotate at parent
156 *
157 * G G
158 * / \ / \
159 * p U --> n U
160 * \ /
161 * n p
162 *
163 * This still leaves us in violation of 4), the
164 * continuation into Case 3 will fix that.
165 */
166 parent->rb_right = tmp = node->rb_left;
167 node->rb_left = parent;
168 if (tmp)
169 rb_set_parent_color(tmp, parent,
170 RB_BLACK);
171 rb_set_parent_color(parent, node, RB_RED);
1da177e4 172 parent = node;
59633abf 173 tmp = node->rb_right;
1da177e4
LT
174 }
175
5bc9188a
ML
176 /*
177 * Case 3 - right rotate at gparent
178 *
179 * G P
180 * / \ / \
181 * p U --> n g
182 * / \
183 * n U
184 */
59633abf 185 gparent->rb_left = tmp; /* == parent->rb_right */
5bc9188a
ML
186 parent->rb_right = gparent;
187 if (tmp)
188 rb_set_parent_color(tmp, gparent, RB_BLACK);
189 __rb_rotate_set_parents(gparent, parent, root, RB_RED);
1f052865 190 break;
1da177e4 191 } else {
5bc9188a
ML
192 tmp = gparent->rb_left;
193 if (tmp && rb_is_red(tmp)) {
194 /* Case 1 - color flips */
195 rb_set_parent_color(tmp, gparent, RB_BLACK);
196 rb_set_parent_color(parent, gparent, RB_BLACK);
197 node = gparent;
198 parent = rb_parent(node);
199 rb_set_parent_color(node, parent, RB_RED);
200 continue;
1da177e4
LT
201 }
202
59633abf
ML
203 tmp = parent->rb_left;
204 if (node == tmp) {
5bc9188a
ML
205 /* Case 2 - right rotate at parent */
206 parent->rb_left = tmp = node->rb_right;
207 node->rb_right = parent;
208 if (tmp)
209 rb_set_parent_color(tmp, parent,
210 RB_BLACK);
211 rb_set_parent_color(parent, node, RB_RED);
1da177e4 212 parent = node;
59633abf 213 tmp = node->rb_left;
1da177e4
LT
214 }
215
5bc9188a 216 /* Case 3 - left rotate at gparent */
59633abf 217 gparent->rb_right = tmp; /* == parent->rb_left */
5bc9188a
ML
218 parent->rb_left = gparent;
219 if (tmp)
220 rb_set_parent_color(tmp, gparent, RB_BLACK);
221 __rb_rotate_set_parents(gparent, parent, root, RB_RED);
1f052865 222 break;
1da177e4
LT
223 }
224 }
1da177e4
LT
225}
226EXPORT_SYMBOL(rb_insert_color);
227
46b6135a 228static void __rb_erase_color(struct rb_node *parent, struct rb_root *root)
1da177e4 229{
46b6135a 230 struct rb_node *node = NULL, *sibling, *tmp1, *tmp2;
1da177e4 231
d6ff1273
ML
232 while (true) {
233 /*
46b6135a
ML
234 * Loop invariants:
235 * - node is black (or NULL on first iteration)
236 * - node is not the root (parent is not NULL)
237 * - All leaf paths going through parent and node have a
238 * black node count that is 1 lower than other leaf paths.
d6ff1273 239 */
59633abf
ML
240 sibling = parent->rb_right;
241 if (node != sibling) { /* node == parent->rb_left */
6280d235
ML
242 if (rb_is_red(sibling)) {
243 /*
244 * Case 1 - left rotate at parent
245 *
246 * P S
247 * / \ / \
248 * N s --> p Sr
249 * / \ / \
250 * Sl Sr N Sl
251 */
252 parent->rb_right = tmp1 = sibling->rb_left;
253 sibling->rb_left = parent;
254 rb_set_parent_color(tmp1, parent, RB_BLACK);
255 __rb_rotate_set_parents(parent, sibling, root,
256 RB_RED);
257 sibling = tmp1;
1da177e4 258 }
6280d235
ML
259 tmp1 = sibling->rb_right;
260 if (!tmp1 || rb_is_black(tmp1)) {
261 tmp2 = sibling->rb_left;
262 if (!tmp2 || rb_is_black(tmp2)) {
263 /*
264 * Case 2 - sibling color flip
265 * (p could be either color here)
266 *
267 * (p) (p)
268 * / \ / \
269 * N S --> N s
270 * / \ / \
271 * Sl Sr Sl Sr
272 *
46b6135a
ML
273 * This leaves us violating 5) which
274 * can be fixed by flipping p to black
275 * if it was red, or by recursing at p.
276 * p is red when coming from Case 1.
6280d235
ML
277 */
278 rb_set_parent_color(sibling, parent,
279 RB_RED);
46b6135a
ML
280 if (rb_is_red(parent))
281 rb_set_black(parent);
282 else {
283 node = parent;
284 parent = rb_parent(node);
285 if (parent)
286 continue;
287 }
288 break;
1da177e4 289 }
6280d235
ML
290 /*
291 * Case 3 - right rotate at sibling
292 * (p could be either color here)
293 *
294 * (p) (p)
295 * / \ / \
296 * N S --> N Sl
297 * / \ \
298 * sl Sr s
299 * \
300 * Sr
301 */
302 sibling->rb_left = tmp1 = tmp2->rb_right;
303 tmp2->rb_right = sibling;
304 parent->rb_right = tmp2;
305 if (tmp1)
306 rb_set_parent_color(tmp1, sibling,
307 RB_BLACK);
308 tmp1 = sibling;
309 sibling = tmp2;
1da177e4 310 }
6280d235
ML
311 /*
312 * Case 4 - left rotate at parent + color flips
313 * (p and sl could be either color here.
314 * After rotation, p becomes black, s acquires
315 * p's color, and sl keeps its color)
316 *
317 * (p) (s)
318 * / \ / \
319 * N S --> P Sr
320 * / \ / \
321 * (sl) sr N (sl)
322 */
323 parent->rb_right = tmp2 = sibling->rb_left;
324 sibling->rb_left = parent;
325 rb_set_parent_color(tmp1, sibling, RB_BLACK);
326 if (tmp2)
327 rb_set_parent(tmp2, parent);
328 __rb_rotate_set_parents(parent, sibling, root,
329 RB_BLACK);
e125d147 330 break;
d6ff1273 331 } else {
6280d235
ML
332 sibling = parent->rb_left;
333 if (rb_is_red(sibling)) {
334 /* Case 1 - right rotate at parent */
335 parent->rb_left = tmp1 = sibling->rb_right;
336 sibling->rb_right = parent;
337 rb_set_parent_color(tmp1, parent, RB_BLACK);
338 __rb_rotate_set_parents(parent, sibling, root,
339 RB_RED);
340 sibling = tmp1;
1da177e4 341 }
6280d235
ML
342 tmp1 = sibling->rb_left;
343 if (!tmp1 || rb_is_black(tmp1)) {
344 tmp2 = sibling->rb_right;
345 if (!tmp2 || rb_is_black(tmp2)) {
346 /* Case 2 - sibling color flip */
347 rb_set_parent_color(sibling, parent,
348 RB_RED);
46b6135a
ML
349 if (rb_is_red(parent))
350 rb_set_black(parent);
351 else {
352 node = parent;
353 parent = rb_parent(node);
354 if (parent)
355 continue;
356 }
357 break;
1da177e4 358 }
6280d235
ML
359 /* Case 3 - right rotate at sibling */
360 sibling->rb_right = tmp1 = tmp2->rb_left;
361 tmp2->rb_left = sibling;
362 parent->rb_left = tmp2;
363 if (tmp1)
364 rb_set_parent_color(tmp1, sibling,
365 RB_BLACK);
366 tmp1 = sibling;
367 sibling = tmp2;
1da177e4 368 }
6280d235
ML
369 /* Case 4 - left rotate at parent + color flips */
370 parent->rb_left = tmp2 = sibling->rb_right;
371 sibling->rb_right = parent;
372 rb_set_parent_color(tmp1, sibling, RB_BLACK);
373 if (tmp2)
374 rb_set_parent(tmp2, parent);
375 __rb_rotate_set_parents(parent, sibling, root,
376 RB_BLACK);
e125d147 377 break;
1da177e4
LT
378 }
379 }
1da177e4
LT
380}
381
382void rb_erase(struct rb_node *node, struct rb_root *root)
383{
60670b80 384 struct rb_node *child = node->rb_right, *tmp = node->rb_left;
46b6135a 385 struct rb_node *parent, *rebalance;
4f035ad6 386 unsigned long pc;
1da177e4 387
60670b80 388 if (!tmp) {
46b6135a
ML
389 /*
390 * Case 1: node to erase has no more than 1 child (easy!)
391 *
392 * Note that if there is one child it must be red due to 5)
393 * and node must be black due to 4). We adjust colors locally
394 * so as to bypass __rb_erase_color() later on.
395 */
4f035ad6
ML
396 pc = node->__rb_parent_color;
397 parent = __rb_parent(pc);
60670b80 398 __rb_change_child(node, child, parent, root);
46b6135a 399 if (child) {
4f035ad6 400 child->__rb_parent_color = pc;
46b6135a 401 rebalance = NULL;
4f035ad6
ML
402 } else
403 rebalance = __rb_is_black(pc) ? parent : NULL;
60670b80
ML
404 } else if (!child) {
405 /* Still case 1, but this time the child is node->rb_left */
4f035ad6
ML
406 tmp->__rb_parent_color = pc = node->__rb_parent_color;
407 parent = __rb_parent(pc);
46b6135a 408 __rb_change_child(node, tmp, parent, root);
46b6135a 409 rebalance = NULL;
60670b80 410 } else {
4f035ad6
ML
411 struct rb_node *successor = child, *child2;
412 tmp = child->rb_left;
413 if (!tmp) {
414 /*
415 * Case 2: node's successor is its right child
416 *
417 * (n) (s)
418 * / \ / \
419 * (x) (s) -> (x) (c)
420 * \
421 * (c)
422 */
423 parent = child;
424 child2 = child->rb_right;
4c601178 425 } else {
4f035ad6
ML
426 /*
427 * Case 3: node's successor is leftmost under
428 * node's right child subtree
429 *
430 * (n) (s)
431 * / \ / \
432 * (x) (y) -> (x) (y)
433 * / /
434 * (p) (p)
435 * / /
436 * (s) (c)
437 * \
438 * (c)
439 */
440 do {
441 parent = successor;
442 successor = tmp;
443 tmp = tmp->rb_left;
444 } while (tmp);
445 parent->rb_left = child2 = successor->rb_right;
446 successor->rb_right = child;
447 rb_set_parent(child, successor);
4c601178 448 }
1975e593 449
4f035ad6
ML
450 successor->rb_left = tmp = node->rb_left;
451 rb_set_parent(tmp, successor);
452
453 pc = node->__rb_parent_color;
454 tmp = __rb_parent(pc);
455 __rb_change_child(node, successor, tmp, root);
456 if (child2) {
457 successor->__rb_parent_color = pc;
458 rb_set_parent_color(child2, parent, RB_BLACK);
46b6135a
ML
459 rebalance = NULL;
460 } else {
4f035ad6
ML
461 unsigned long pc2 = successor->__rb_parent_color;
462 successor->__rb_parent_color = pc;
463 rebalance = __rb_is_black(pc2) ? parent : NULL;
46b6135a 464 }
1da177e4
LT
465 }
466
46b6135a
ML
467 if (rebalance)
468 __rb_erase_color(rebalance, root);
1da177e4
LT
469}
470EXPORT_SYMBOL(rb_erase);
471
b945d6b2
PZ
472static void rb_augment_path(struct rb_node *node, rb_augment_f func, void *data)
473{
474 struct rb_node *parent;
475
476up:
477 func(node, data);
478 parent = rb_parent(node);
479 if (!parent)
480 return;
481
482 if (node == parent->rb_left && parent->rb_right)
483 func(parent->rb_right, data);
484 else if (parent->rb_left)
485 func(parent->rb_left, data);
486
487 node = parent;
488 goto up;
489}
490
491/*
492 * after inserting @node into the tree, update the tree to account for
493 * both the new entry and any damage done by rebalance
494 */
495void rb_augment_insert(struct rb_node *node, rb_augment_f func, void *data)
496{
497 if (node->rb_left)
498 node = node->rb_left;
499 else if (node->rb_right)
500 node = node->rb_right;
501
502 rb_augment_path(node, func, data);
503}
0b6bb66d 504EXPORT_SYMBOL(rb_augment_insert);
b945d6b2
PZ
505
506/*
507 * before removing the node, find the deepest node on the rebalance path
508 * that will still be there after @node gets removed
509 */
510struct rb_node *rb_augment_erase_begin(struct rb_node *node)
511{
512 struct rb_node *deepest;
513
514 if (!node->rb_right && !node->rb_left)
515 deepest = rb_parent(node);
516 else if (!node->rb_right)
517 deepest = node->rb_left;
518 else if (!node->rb_left)
519 deepest = node->rb_right;
520 else {
521 deepest = rb_next(node);
522 if (deepest->rb_right)
523 deepest = deepest->rb_right;
524 else if (rb_parent(deepest) != node)
525 deepest = rb_parent(deepest);
526 }
527
528 return deepest;
529}
0b6bb66d 530EXPORT_SYMBOL(rb_augment_erase_begin);
b945d6b2
PZ
531
532/*
533 * after removal, update the tree to account for the removed entry
534 * and any rebalance damage.
535 */
536void rb_augment_erase_end(struct rb_node *node, rb_augment_f func, void *data)
537{
538 if (node)
539 rb_augment_path(node, func, data);
540}
0b6bb66d 541EXPORT_SYMBOL(rb_augment_erase_end);
b945d6b2 542
1da177e4
LT
543/*
544 * This function returns the first node (in sort order) of the tree.
545 */
f4b477c4 546struct rb_node *rb_first(const struct rb_root *root)
1da177e4
LT
547{
548 struct rb_node *n;
549
550 n = root->rb_node;
551 if (!n)
552 return NULL;
553 while (n->rb_left)
554 n = n->rb_left;
555 return n;
556}
557EXPORT_SYMBOL(rb_first);
558
f4b477c4 559struct rb_node *rb_last(const struct rb_root *root)
1da177e4
LT
560{
561 struct rb_node *n;
562
563 n = root->rb_node;
564 if (!n)
565 return NULL;
566 while (n->rb_right)
567 n = n->rb_right;
568 return n;
569}
570EXPORT_SYMBOL(rb_last);
571
f4b477c4 572struct rb_node *rb_next(const struct rb_node *node)
1da177e4 573{
55a98102
DW
574 struct rb_node *parent;
575
4c199a93 576 if (RB_EMPTY_NODE(node))
10fd48f2
JA
577 return NULL;
578
7ce6ff9e
ML
579 /*
580 * If we have a right-hand child, go down and then left as far
581 * as we can.
582 */
1da177e4
LT
583 if (node->rb_right) {
584 node = node->rb_right;
585 while (node->rb_left)
586 node=node->rb_left;
f4b477c4 587 return (struct rb_node *)node;
1da177e4
LT
588 }
589
7ce6ff9e
ML
590 /*
591 * No right-hand children. Everything down and left is smaller than us,
592 * so any 'next' node must be in the general direction of our parent.
593 * Go up the tree; any time the ancestor is a right-hand child of its
594 * parent, keep going up. First time it's a left-hand child of its
595 * parent, said parent is our 'next' node.
596 */
55a98102
DW
597 while ((parent = rb_parent(node)) && node == parent->rb_right)
598 node = parent;
1da177e4 599
55a98102 600 return parent;
1da177e4
LT
601}
602EXPORT_SYMBOL(rb_next);
603
f4b477c4 604struct rb_node *rb_prev(const struct rb_node *node)
1da177e4 605{
55a98102
DW
606 struct rb_node *parent;
607
4c199a93 608 if (RB_EMPTY_NODE(node))
10fd48f2
JA
609 return NULL;
610
7ce6ff9e
ML
611 /*
612 * If we have a left-hand child, go down and then right as far
613 * as we can.
614 */
1da177e4
LT
615 if (node->rb_left) {
616 node = node->rb_left;
617 while (node->rb_right)
618 node=node->rb_right;
f4b477c4 619 return (struct rb_node *)node;
1da177e4
LT
620 }
621
7ce6ff9e
ML
622 /*
623 * No left-hand children. Go up till we find an ancestor which
624 * is a right-hand child of its parent.
625 */
55a98102
DW
626 while ((parent = rb_parent(node)) && node == parent->rb_left)
627 node = parent;
1da177e4 628
55a98102 629 return parent;
1da177e4
LT
630}
631EXPORT_SYMBOL(rb_prev);
632
633void rb_replace_node(struct rb_node *victim, struct rb_node *new,
634 struct rb_root *root)
635{
55a98102 636 struct rb_node *parent = rb_parent(victim);
1da177e4
LT
637
638 /* Set the surrounding nodes to point to the replacement */
7abc704a 639 __rb_change_child(victim, new, parent, root);
1da177e4 640 if (victim->rb_left)
55a98102 641 rb_set_parent(victim->rb_left, new);
1da177e4 642 if (victim->rb_right)
55a98102 643 rb_set_parent(victim->rb_right, new);
1da177e4
LT
644
645 /* Copy the pointers/colour from the victim to the replacement */
646 *new = *victim;
647}
648EXPORT_SYMBOL(rb_replace_node);