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