1*1a3d31e3SAndroid Build Coastguard Worker /*
2*1a3d31e3SAndroid Build Coastguard Worker Red Black Trees
3*1a3d31e3SAndroid Build Coastguard Worker (C) 1999 Andrea Arcangeli <[email protected]>
4*1a3d31e3SAndroid Build Coastguard Worker (C) 2002 David Woodhouse <[email protected]>
5*1a3d31e3SAndroid Build Coastguard Worker
6*1a3d31e3SAndroid Build Coastguard Worker This program is free software; you can redistribute it and/or modify
7*1a3d31e3SAndroid Build Coastguard Worker it under the terms of the GNU General Public License as published by
8*1a3d31e3SAndroid Build Coastguard Worker the Free Software Foundation; either version 2 of the License, or
9*1a3d31e3SAndroid Build Coastguard Worker (at your option) any later version.
10*1a3d31e3SAndroid Build Coastguard Worker
11*1a3d31e3SAndroid Build Coastguard Worker This program is distributed in the hope that it will be useful,
12*1a3d31e3SAndroid Build Coastguard Worker but WITHOUT ANY WARRANTY; without even the implied warranty of
13*1a3d31e3SAndroid Build Coastguard Worker MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14*1a3d31e3SAndroid Build Coastguard Worker GNU General Public License for more details.
15*1a3d31e3SAndroid Build Coastguard Worker
16*1a3d31e3SAndroid Build Coastguard Worker You should have received a copy of the GNU General Public License
17*1a3d31e3SAndroid Build Coastguard Worker along with this program; if not, write to the Free Software
18*1a3d31e3SAndroid Build Coastguard Worker Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19*1a3d31e3SAndroid Build Coastguard Worker
20*1a3d31e3SAndroid Build Coastguard Worker linux/lib/rbtree.c
21*1a3d31e3SAndroid Build Coastguard Worker */
22*1a3d31e3SAndroid Build Coastguard Worker
23*1a3d31e3SAndroid Build Coastguard Worker #include "rbtree.h"
24*1a3d31e3SAndroid Build Coastguard Worker
__rb_rotate_left(struct rb_node * node,struct rb_root * root)25*1a3d31e3SAndroid Build Coastguard Worker static void __rb_rotate_left(struct rb_node *node, struct rb_root *root)
26*1a3d31e3SAndroid Build Coastguard Worker {
27*1a3d31e3SAndroid Build Coastguard Worker struct rb_node *right = node->rb_right;
28*1a3d31e3SAndroid Build Coastguard Worker struct rb_node *parent = rb_parent(node);
29*1a3d31e3SAndroid Build Coastguard Worker
30*1a3d31e3SAndroid Build Coastguard Worker if ((node->rb_right = right->rb_left))
31*1a3d31e3SAndroid Build Coastguard Worker rb_set_parent(right->rb_left, node);
32*1a3d31e3SAndroid Build Coastguard Worker right->rb_left = node;
33*1a3d31e3SAndroid Build Coastguard Worker
34*1a3d31e3SAndroid Build Coastguard Worker rb_set_parent(right, parent);
35*1a3d31e3SAndroid Build Coastguard Worker
36*1a3d31e3SAndroid Build Coastguard Worker if (parent)
37*1a3d31e3SAndroid Build Coastguard Worker {
38*1a3d31e3SAndroid Build Coastguard Worker if (node == parent->rb_left)
39*1a3d31e3SAndroid Build Coastguard Worker parent->rb_left = right;
40*1a3d31e3SAndroid Build Coastguard Worker else
41*1a3d31e3SAndroid Build Coastguard Worker parent->rb_right = right;
42*1a3d31e3SAndroid Build Coastguard Worker }
43*1a3d31e3SAndroid Build Coastguard Worker else
44*1a3d31e3SAndroid Build Coastguard Worker root->rb_node = right;
45*1a3d31e3SAndroid Build Coastguard Worker rb_set_parent(node, right);
46*1a3d31e3SAndroid Build Coastguard Worker }
47*1a3d31e3SAndroid Build Coastguard Worker
__rb_rotate_right(struct rb_node * node,struct rb_root * root)48*1a3d31e3SAndroid Build Coastguard Worker static void __rb_rotate_right(struct rb_node *node, struct rb_root *root)
49*1a3d31e3SAndroid Build Coastguard Worker {
50*1a3d31e3SAndroid Build Coastguard Worker struct rb_node *left = node->rb_left;
51*1a3d31e3SAndroid Build Coastguard Worker struct rb_node *parent = rb_parent(node);
52*1a3d31e3SAndroid Build Coastguard Worker
53*1a3d31e3SAndroid Build Coastguard Worker if ((node->rb_left = left->rb_right))
54*1a3d31e3SAndroid Build Coastguard Worker rb_set_parent(left->rb_right, node);
55*1a3d31e3SAndroid Build Coastguard Worker left->rb_right = node;
56*1a3d31e3SAndroid Build Coastguard Worker
57*1a3d31e3SAndroid Build Coastguard Worker rb_set_parent(left, parent);
58*1a3d31e3SAndroid Build Coastguard Worker
59*1a3d31e3SAndroid Build Coastguard Worker if (parent)
60*1a3d31e3SAndroid Build Coastguard Worker {
61*1a3d31e3SAndroid Build Coastguard Worker if (node == parent->rb_right)
62*1a3d31e3SAndroid Build Coastguard Worker parent->rb_right = left;
63*1a3d31e3SAndroid Build Coastguard Worker else
64*1a3d31e3SAndroid Build Coastguard Worker parent->rb_left = left;
65*1a3d31e3SAndroid Build Coastguard Worker }
66*1a3d31e3SAndroid Build Coastguard Worker else
67*1a3d31e3SAndroid Build Coastguard Worker root->rb_node = left;
68*1a3d31e3SAndroid Build Coastguard Worker rb_set_parent(node, left);
69*1a3d31e3SAndroid Build Coastguard Worker }
70*1a3d31e3SAndroid Build Coastguard Worker
rb_insert_color(struct rb_node * node,struct rb_root * root)71*1a3d31e3SAndroid Build Coastguard Worker void rb_insert_color(struct rb_node *node, struct rb_root *root)
72*1a3d31e3SAndroid Build Coastguard Worker {
73*1a3d31e3SAndroid Build Coastguard Worker struct rb_node *parent, *gparent;
74*1a3d31e3SAndroid Build Coastguard Worker
75*1a3d31e3SAndroid Build Coastguard Worker while ((parent = rb_parent(node)) && rb_is_red(parent))
76*1a3d31e3SAndroid Build Coastguard Worker {
77*1a3d31e3SAndroid Build Coastguard Worker gparent = rb_parent(parent);
78*1a3d31e3SAndroid Build Coastguard Worker
79*1a3d31e3SAndroid Build Coastguard Worker if (parent == gparent->rb_left)
80*1a3d31e3SAndroid Build Coastguard Worker {
81*1a3d31e3SAndroid Build Coastguard Worker {
82*1a3d31e3SAndroid Build Coastguard Worker register struct rb_node *uncle = gparent->rb_right;
83*1a3d31e3SAndroid Build Coastguard Worker if (uncle && rb_is_red(uncle))
84*1a3d31e3SAndroid Build Coastguard Worker {
85*1a3d31e3SAndroid Build Coastguard Worker rb_set_black(uncle);
86*1a3d31e3SAndroid Build Coastguard Worker rb_set_black(parent);
87*1a3d31e3SAndroid Build Coastguard Worker rb_set_red(gparent);
88*1a3d31e3SAndroid Build Coastguard Worker node = gparent;
89*1a3d31e3SAndroid Build Coastguard Worker continue;
90*1a3d31e3SAndroid Build Coastguard Worker }
91*1a3d31e3SAndroid Build Coastguard Worker }
92*1a3d31e3SAndroid Build Coastguard Worker
93*1a3d31e3SAndroid Build Coastguard Worker if (parent->rb_right == node)
94*1a3d31e3SAndroid Build Coastguard Worker {
95*1a3d31e3SAndroid Build Coastguard Worker register struct rb_node *tmp;
96*1a3d31e3SAndroid Build Coastguard Worker __rb_rotate_left(parent, root);
97*1a3d31e3SAndroid Build Coastguard Worker tmp = parent;
98*1a3d31e3SAndroid Build Coastguard Worker parent = node;
99*1a3d31e3SAndroid Build Coastguard Worker node = tmp;
100*1a3d31e3SAndroid Build Coastguard Worker }
101*1a3d31e3SAndroid Build Coastguard Worker
102*1a3d31e3SAndroid Build Coastguard Worker rb_set_black(parent);
103*1a3d31e3SAndroid Build Coastguard Worker rb_set_red(gparent);
104*1a3d31e3SAndroid Build Coastguard Worker __rb_rotate_right(gparent, root);
105*1a3d31e3SAndroid Build Coastguard Worker } else {
106*1a3d31e3SAndroid Build Coastguard Worker {
107*1a3d31e3SAndroid Build Coastguard Worker register struct rb_node *uncle = gparent->rb_left;
108*1a3d31e3SAndroid Build Coastguard Worker if (uncle && rb_is_red(uncle))
109*1a3d31e3SAndroid Build Coastguard Worker {
110*1a3d31e3SAndroid Build Coastguard Worker rb_set_black(uncle);
111*1a3d31e3SAndroid Build Coastguard Worker rb_set_black(parent);
112*1a3d31e3SAndroid Build Coastguard Worker rb_set_red(gparent);
113*1a3d31e3SAndroid Build Coastguard Worker node = gparent;
114*1a3d31e3SAndroid Build Coastguard Worker continue;
115*1a3d31e3SAndroid Build Coastguard Worker }
116*1a3d31e3SAndroid Build Coastguard Worker }
117*1a3d31e3SAndroid Build Coastguard Worker
118*1a3d31e3SAndroid Build Coastguard Worker if (parent->rb_left == node)
119*1a3d31e3SAndroid Build Coastguard Worker {
120*1a3d31e3SAndroid Build Coastguard Worker register struct rb_node *tmp;
121*1a3d31e3SAndroid Build Coastguard Worker __rb_rotate_right(parent, root);
122*1a3d31e3SAndroid Build Coastguard Worker tmp = parent;
123*1a3d31e3SAndroid Build Coastguard Worker parent = node;
124*1a3d31e3SAndroid Build Coastguard Worker node = tmp;
125*1a3d31e3SAndroid Build Coastguard Worker }
126*1a3d31e3SAndroid Build Coastguard Worker
127*1a3d31e3SAndroid Build Coastguard Worker rb_set_black(parent);
128*1a3d31e3SAndroid Build Coastguard Worker rb_set_red(gparent);
129*1a3d31e3SAndroid Build Coastguard Worker __rb_rotate_left(gparent, root);
130*1a3d31e3SAndroid Build Coastguard Worker }
131*1a3d31e3SAndroid Build Coastguard Worker }
132*1a3d31e3SAndroid Build Coastguard Worker
133*1a3d31e3SAndroid Build Coastguard Worker rb_set_black(root->rb_node);
134*1a3d31e3SAndroid Build Coastguard Worker }
135*1a3d31e3SAndroid Build Coastguard Worker
__rb_erase_color(struct rb_node * node,struct rb_node * parent,struct rb_root * root)136*1a3d31e3SAndroid Build Coastguard Worker static void __rb_erase_color(struct rb_node *node, struct rb_node *parent,
137*1a3d31e3SAndroid Build Coastguard Worker struct rb_root *root)
138*1a3d31e3SAndroid Build Coastguard Worker {
139*1a3d31e3SAndroid Build Coastguard Worker struct rb_node *other;
140*1a3d31e3SAndroid Build Coastguard Worker
141*1a3d31e3SAndroid Build Coastguard Worker while ((!node || rb_is_black(node)) && node != root->rb_node)
142*1a3d31e3SAndroid Build Coastguard Worker {
143*1a3d31e3SAndroid Build Coastguard Worker if (parent->rb_left == node)
144*1a3d31e3SAndroid Build Coastguard Worker {
145*1a3d31e3SAndroid Build Coastguard Worker other = parent->rb_right;
146*1a3d31e3SAndroid Build Coastguard Worker if (rb_is_red(other))
147*1a3d31e3SAndroid Build Coastguard Worker {
148*1a3d31e3SAndroid Build Coastguard Worker rb_set_black(other);
149*1a3d31e3SAndroid Build Coastguard Worker rb_set_red(parent);
150*1a3d31e3SAndroid Build Coastguard Worker __rb_rotate_left(parent, root);
151*1a3d31e3SAndroid Build Coastguard Worker other = parent->rb_right;
152*1a3d31e3SAndroid Build Coastguard Worker }
153*1a3d31e3SAndroid Build Coastguard Worker if ((!other->rb_left || rb_is_black(other->rb_left)) &&
154*1a3d31e3SAndroid Build Coastguard Worker (!other->rb_right || rb_is_black(other->rb_right)))
155*1a3d31e3SAndroid Build Coastguard Worker {
156*1a3d31e3SAndroid Build Coastguard Worker rb_set_red(other);
157*1a3d31e3SAndroid Build Coastguard Worker node = parent;
158*1a3d31e3SAndroid Build Coastguard Worker parent = rb_parent(node);
159*1a3d31e3SAndroid Build Coastguard Worker }
160*1a3d31e3SAndroid Build Coastguard Worker else
161*1a3d31e3SAndroid Build Coastguard Worker {
162*1a3d31e3SAndroid Build Coastguard Worker if (!other->rb_right || rb_is_black(other->rb_right))
163*1a3d31e3SAndroid Build Coastguard Worker {
164*1a3d31e3SAndroid Build Coastguard Worker struct rb_node *o_left;
165*1a3d31e3SAndroid Build Coastguard Worker if ((o_left = other->rb_left))
166*1a3d31e3SAndroid Build Coastguard Worker rb_set_black(o_left);
167*1a3d31e3SAndroid Build Coastguard Worker rb_set_red(other);
168*1a3d31e3SAndroid Build Coastguard Worker __rb_rotate_right(other, root);
169*1a3d31e3SAndroid Build Coastguard Worker other = parent->rb_right;
170*1a3d31e3SAndroid Build Coastguard Worker }
171*1a3d31e3SAndroid Build Coastguard Worker rb_set_color(other, rb_color(parent));
172*1a3d31e3SAndroid Build Coastguard Worker rb_set_black(parent);
173*1a3d31e3SAndroid Build Coastguard Worker if (other->rb_right)
174*1a3d31e3SAndroid Build Coastguard Worker rb_set_black(other->rb_right);
175*1a3d31e3SAndroid Build Coastguard Worker __rb_rotate_left(parent, root);
176*1a3d31e3SAndroid Build Coastguard Worker node = root->rb_node;
177*1a3d31e3SAndroid Build Coastguard Worker break;
178*1a3d31e3SAndroid Build Coastguard Worker }
179*1a3d31e3SAndroid Build Coastguard Worker }
180*1a3d31e3SAndroid Build Coastguard Worker else
181*1a3d31e3SAndroid Build Coastguard Worker {
182*1a3d31e3SAndroid Build Coastguard Worker other = parent->rb_left;
183*1a3d31e3SAndroid Build Coastguard Worker if (rb_is_red(other))
184*1a3d31e3SAndroid Build Coastguard Worker {
185*1a3d31e3SAndroid Build Coastguard Worker rb_set_black(other);
186*1a3d31e3SAndroid Build Coastguard Worker rb_set_red(parent);
187*1a3d31e3SAndroid Build Coastguard Worker __rb_rotate_right(parent, root);
188*1a3d31e3SAndroid Build Coastguard Worker other = parent->rb_left;
189*1a3d31e3SAndroid Build Coastguard Worker }
190*1a3d31e3SAndroid Build Coastguard Worker if ((!other->rb_left || rb_is_black(other->rb_left)) &&
191*1a3d31e3SAndroid Build Coastguard Worker (!other->rb_right || rb_is_black(other->rb_right)))
192*1a3d31e3SAndroid Build Coastguard Worker {
193*1a3d31e3SAndroid Build Coastguard Worker rb_set_red(other);
194*1a3d31e3SAndroid Build Coastguard Worker node = parent;
195*1a3d31e3SAndroid Build Coastguard Worker parent = rb_parent(node);
196*1a3d31e3SAndroid Build Coastguard Worker }
197*1a3d31e3SAndroid Build Coastguard Worker else
198*1a3d31e3SAndroid Build Coastguard Worker {
199*1a3d31e3SAndroid Build Coastguard Worker if (!other->rb_left || rb_is_black(other->rb_left))
200*1a3d31e3SAndroid Build Coastguard Worker {
201*1a3d31e3SAndroid Build Coastguard Worker register struct rb_node *o_right;
202*1a3d31e3SAndroid Build Coastguard Worker if ((o_right = other->rb_right))
203*1a3d31e3SAndroid Build Coastguard Worker rb_set_black(o_right);
204*1a3d31e3SAndroid Build Coastguard Worker rb_set_red(other);
205*1a3d31e3SAndroid Build Coastguard Worker __rb_rotate_left(other, root);
206*1a3d31e3SAndroid Build Coastguard Worker other = parent->rb_left;
207*1a3d31e3SAndroid Build Coastguard Worker }
208*1a3d31e3SAndroid Build Coastguard Worker rb_set_color(other, rb_color(parent));
209*1a3d31e3SAndroid Build Coastguard Worker rb_set_black(parent);
210*1a3d31e3SAndroid Build Coastguard Worker if (other->rb_left)
211*1a3d31e3SAndroid Build Coastguard Worker rb_set_black(other->rb_left);
212*1a3d31e3SAndroid Build Coastguard Worker __rb_rotate_right(parent, root);
213*1a3d31e3SAndroid Build Coastguard Worker node = root->rb_node;
214*1a3d31e3SAndroid Build Coastguard Worker break;
215*1a3d31e3SAndroid Build Coastguard Worker }
216*1a3d31e3SAndroid Build Coastguard Worker }
217*1a3d31e3SAndroid Build Coastguard Worker }
218*1a3d31e3SAndroid Build Coastguard Worker if (node)
219*1a3d31e3SAndroid Build Coastguard Worker rb_set_black(node);
220*1a3d31e3SAndroid Build Coastguard Worker }
221*1a3d31e3SAndroid Build Coastguard Worker
rb_erase(struct rb_node * node,struct rb_root * root)222*1a3d31e3SAndroid Build Coastguard Worker void rb_erase(struct rb_node *node, struct rb_root *root)
223*1a3d31e3SAndroid Build Coastguard Worker {
224*1a3d31e3SAndroid Build Coastguard Worker struct rb_node *child, *parent;
225*1a3d31e3SAndroid Build Coastguard Worker int color;
226*1a3d31e3SAndroid Build Coastguard Worker
227*1a3d31e3SAndroid Build Coastguard Worker if (!node->rb_left)
228*1a3d31e3SAndroid Build Coastguard Worker child = node->rb_right;
229*1a3d31e3SAndroid Build Coastguard Worker else if (!node->rb_right)
230*1a3d31e3SAndroid Build Coastguard Worker child = node->rb_left;
231*1a3d31e3SAndroid Build Coastguard Worker else
232*1a3d31e3SAndroid Build Coastguard Worker {
233*1a3d31e3SAndroid Build Coastguard Worker struct rb_node *old = node, *left;
234*1a3d31e3SAndroid Build Coastguard Worker
235*1a3d31e3SAndroid Build Coastguard Worker node = node->rb_right;
236*1a3d31e3SAndroid Build Coastguard Worker while ((left = node->rb_left) != NULL)
237*1a3d31e3SAndroid Build Coastguard Worker node = left;
238*1a3d31e3SAndroid Build Coastguard Worker child = node->rb_right;
239*1a3d31e3SAndroid Build Coastguard Worker parent = rb_parent(node);
240*1a3d31e3SAndroid Build Coastguard Worker color = rb_color(node);
241*1a3d31e3SAndroid Build Coastguard Worker
242*1a3d31e3SAndroid Build Coastguard Worker if (child)
243*1a3d31e3SAndroid Build Coastguard Worker rb_set_parent(child, parent);
244*1a3d31e3SAndroid Build Coastguard Worker if (parent == old) {
245*1a3d31e3SAndroid Build Coastguard Worker parent->rb_right = child;
246*1a3d31e3SAndroid Build Coastguard Worker parent = node;
247*1a3d31e3SAndroid Build Coastguard Worker } else
248*1a3d31e3SAndroid Build Coastguard Worker parent->rb_left = child;
249*1a3d31e3SAndroid Build Coastguard Worker
250*1a3d31e3SAndroid Build Coastguard Worker node->rb_parent_color = old->rb_parent_color;
251*1a3d31e3SAndroid Build Coastguard Worker node->rb_right = old->rb_right;
252*1a3d31e3SAndroid Build Coastguard Worker node->rb_left = old->rb_left;
253*1a3d31e3SAndroid Build Coastguard Worker
254*1a3d31e3SAndroid Build Coastguard Worker if (rb_parent(old))
255*1a3d31e3SAndroid Build Coastguard Worker {
256*1a3d31e3SAndroid Build Coastguard Worker if (rb_parent(old)->rb_left == old)
257*1a3d31e3SAndroid Build Coastguard Worker rb_parent(old)->rb_left = node;
258*1a3d31e3SAndroid Build Coastguard Worker else
259*1a3d31e3SAndroid Build Coastguard Worker rb_parent(old)->rb_right = node;
260*1a3d31e3SAndroid Build Coastguard Worker } else
261*1a3d31e3SAndroid Build Coastguard Worker root->rb_node = node;
262*1a3d31e3SAndroid Build Coastguard Worker
263*1a3d31e3SAndroid Build Coastguard Worker rb_set_parent(old->rb_left, node);
264*1a3d31e3SAndroid Build Coastguard Worker if (old->rb_right)
265*1a3d31e3SAndroid Build Coastguard Worker rb_set_parent(old->rb_right, node);
266*1a3d31e3SAndroid Build Coastguard Worker goto color;
267*1a3d31e3SAndroid Build Coastguard Worker }
268*1a3d31e3SAndroid Build Coastguard Worker
269*1a3d31e3SAndroid Build Coastguard Worker parent = rb_parent(node);
270*1a3d31e3SAndroid Build Coastguard Worker color = rb_color(node);
271*1a3d31e3SAndroid Build Coastguard Worker
272*1a3d31e3SAndroid Build Coastguard Worker if (child)
273*1a3d31e3SAndroid Build Coastguard Worker rb_set_parent(child, parent);
274*1a3d31e3SAndroid Build Coastguard Worker if (parent)
275*1a3d31e3SAndroid Build Coastguard Worker {
276*1a3d31e3SAndroid Build Coastguard Worker if (parent->rb_left == node)
277*1a3d31e3SAndroid Build Coastguard Worker parent->rb_left = child;
278*1a3d31e3SAndroid Build Coastguard Worker else
279*1a3d31e3SAndroid Build Coastguard Worker parent->rb_right = child;
280*1a3d31e3SAndroid Build Coastguard Worker }
281*1a3d31e3SAndroid Build Coastguard Worker else
282*1a3d31e3SAndroid Build Coastguard Worker root->rb_node = child;
283*1a3d31e3SAndroid Build Coastguard Worker
284*1a3d31e3SAndroid Build Coastguard Worker color:
285*1a3d31e3SAndroid Build Coastguard Worker if (color == RB_BLACK)
286*1a3d31e3SAndroid Build Coastguard Worker __rb_erase_color(child, parent, root);
287*1a3d31e3SAndroid Build Coastguard Worker }
288*1a3d31e3SAndroid Build Coastguard Worker
289*1a3d31e3SAndroid Build Coastguard Worker /*
290*1a3d31e3SAndroid Build Coastguard Worker * This function returns the first node (in sort order) of the tree.
291*1a3d31e3SAndroid Build Coastguard Worker */
rb_first(struct rb_root * root)292*1a3d31e3SAndroid Build Coastguard Worker struct rb_node *rb_first(struct rb_root *root)
293*1a3d31e3SAndroid Build Coastguard Worker {
294*1a3d31e3SAndroid Build Coastguard Worker struct rb_node *n;
295*1a3d31e3SAndroid Build Coastguard Worker
296*1a3d31e3SAndroid Build Coastguard Worker n = root->rb_node;
297*1a3d31e3SAndroid Build Coastguard Worker if (!n)
298*1a3d31e3SAndroid Build Coastguard Worker return NULL;
299*1a3d31e3SAndroid Build Coastguard Worker while (n->rb_left)
300*1a3d31e3SAndroid Build Coastguard Worker n = n->rb_left;
301*1a3d31e3SAndroid Build Coastguard Worker return n;
302*1a3d31e3SAndroid Build Coastguard Worker }
303*1a3d31e3SAndroid Build Coastguard Worker
rb_last(struct rb_root * root)304*1a3d31e3SAndroid Build Coastguard Worker struct rb_node *rb_last(struct rb_root *root)
305*1a3d31e3SAndroid Build Coastguard Worker {
306*1a3d31e3SAndroid Build Coastguard Worker struct rb_node *n;
307*1a3d31e3SAndroid Build Coastguard Worker
308*1a3d31e3SAndroid Build Coastguard Worker n = root->rb_node;
309*1a3d31e3SAndroid Build Coastguard Worker if (!n)
310*1a3d31e3SAndroid Build Coastguard Worker return NULL;
311*1a3d31e3SAndroid Build Coastguard Worker while (n->rb_right)
312*1a3d31e3SAndroid Build Coastguard Worker n = n->rb_right;
313*1a3d31e3SAndroid Build Coastguard Worker return n;
314*1a3d31e3SAndroid Build Coastguard Worker }
315*1a3d31e3SAndroid Build Coastguard Worker
rb_next(struct rb_node * node)316*1a3d31e3SAndroid Build Coastguard Worker struct rb_node *rb_next(struct rb_node *node)
317*1a3d31e3SAndroid Build Coastguard Worker {
318*1a3d31e3SAndroid Build Coastguard Worker struct rb_node *parent;
319*1a3d31e3SAndroid Build Coastguard Worker
320*1a3d31e3SAndroid Build Coastguard Worker if (rb_parent(node) == node)
321*1a3d31e3SAndroid Build Coastguard Worker return NULL;
322*1a3d31e3SAndroid Build Coastguard Worker
323*1a3d31e3SAndroid Build Coastguard Worker /* If we have a right-hand child, go down and then left as far
324*1a3d31e3SAndroid Build Coastguard Worker as we can. */
325*1a3d31e3SAndroid Build Coastguard Worker if (node->rb_right) {
326*1a3d31e3SAndroid Build Coastguard Worker node = node->rb_right;
327*1a3d31e3SAndroid Build Coastguard Worker while (node->rb_left)
328*1a3d31e3SAndroid Build Coastguard Worker node=node->rb_left;
329*1a3d31e3SAndroid Build Coastguard Worker return node;
330*1a3d31e3SAndroid Build Coastguard Worker }
331*1a3d31e3SAndroid Build Coastguard Worker
332*1a3d31e3SAndroid Build Coastguard Worker /* No right-hand children. Everything down and left is
333*1a3d31e3SAndroid Build Coastguard Worker smaller than us, so any 'next' node must be in the general
334*1a3d31e3SAndroid Build Coastguard Worker direction of our parent. Go up the tree; any time the
335*1a3d31e3SAndroid Build Coastguard Worker ancestor is a right-hand child of its parent, keep going
336*1a3d31e3SAndroid Build Coastguard Worker up. First time it's a left-hand child of its parent, said
337*1a3d31e3SAndroid Build Coastguard Worker parent is our 'next' node. */
338*1a3d31e3SAndroid Build Coastguard Worker while ((parent = rb_parent(node)) && node == parent->rb_right)
339*1a3d31e3SAndroid Build Coastguard Worker node = parent;
340*1a3d31e3SAndroid Build Coastguard Worker
341*1a3d31e3SAndroid Build Coastguard Worker return parent;
342*1a3d31e3SAndroid Build Coastguard Worker }
343*1a3d31e3SAndroid Build Coastguard Worker
rb_prev(struct rb_node * node)344*1a3d31e3SAndroid Build Coastguard Worker struct rb_node *rb_prev(struct rb_node *node)
345*1a3d31e3SAndroid Build Coastguard Worker {
346*1a3d31e3SAndroid Build Coastguard Worker struct rb_node *parent;
347*1a3d31e3SAndroid Build Coastguard Worker
348*1a3d31e3SAndroid Build Coastguard Worker if (rb_parent(node) == node)
349*1a3d31e3SAndroid Build Coastguard Worker return NULL;
350*1a3d31e3SAndroid Build Coastguard Worker
351*1a3d31e3SAndroid Build Coastguard Worker /* If we have a left-hand child, go down and then right as far
352*1a3d31e3SAndroid Build Coastguard Worker as we can. */
353*1a3d31e3SAndroid Build Coastguard Worker if (node->rb_left) {
354*1a3d31e3SAndroid Build Coastguard Worker node = node->rb_left;
355*1a3d31e3SAndroid Build Coastguard Worker while (node->rb_right)
356*1a3d31e3SAndroid Build Coastguard Worker node=node->rb_right;
357*1a3d31e3SAndroid Build Coastguard Worker return node;
358*1a3d31e3SAndroid Build Coastguard Worker }
359*1a3d31e3SAndroid Build Coastguard Worker
360*1a3d31e3SAndroid Build Coastguard Worker /* No left-hand children. Go up till we find an ancestor which
361*1a3d31e3SAndroid Build Coastguard Worker is a right-hand child of its parent */
362*1a3d31e3SAndroid Build Coastguard Worker while ((parent = rb_parent(node)) && node == parent->rb_left)
363*1a3d31e3SAndroid Build Coastguard Worker node = parent;
364*1a3d31e3SAndroid Build Coastguard Worker
365*1a3d31e3SAndroid Build Coastguard Worker return parent;
366*1a3d31e3SAndroid Build Coastguard Worker }
367*1a3d31e3SAndroid Build Coastguard Worker
rb_replace_node(struct rb_node * victim,struct rb_node * new,struct rb_root * root)368*1a3d31e3SAndroid Build Coastguard Worker void rb_replace_node(struct rb_node *victim, struct rb_node *new,
369*1a3d31e3SAndroid Build Coastguard Worker struct rb_root *root)
370*1a3d31e3SAndroid Build Coastguard Worker {
371*1a3d31e3SAndroid Build Coastguard Worker struct rb_node *parent = rb_parent(victim);
372*1a3d31e3SAndroid Build Coastguard Worker
373*1a3d31e3SAndroid Build Coastguard Worker /* Set the surrounding nodes to point to the replacement */
374*1a3d31e3SAndroid Build Coastguard Worker if (parent) {
375*1a3d31e3SAndroid Build Coastguard Worker if (victim == parent->rb_left)
376*1a3d31e3SAndroid Build Coastguard Worker parent->rb_left = new;
377*1a3d31e3SAndroid Build Coastguard Worker else
378*1a3d31e3SAndroid Build Coastguard Worker parent->rb_right = new;
379*1a3d31e3SAndroid Build Coastguard Worker } else {
380*1a3d31e3SAndroid Build Coastguard Worker root->rb_node = new;
381*1a3d31e3SAndroid Build Coastguard Worker }
382*1a3d31e3SAndroid Build Coastguard Worker if (victim->rb_left)
383*1a3d31e3SAndroid Build Coastguard Worker rb_set_parent(victim->rb_left, new);
384*1a3d31e3SAndroid Build Coastguard Worker if (victim->rb_right)
385*1a3d31e3SAndroid Build Coastguard Worker rb_set_parent(victim->rb_right, new);
386*1a3d31e3SAndroid Build Coastguard Worker
387*1a3d31e3SAndroid Build Coastguard Worker /* Copy the pointers/colour from the victim to the replacement */
388*1a3d31e3SAndroid Build Coastguard Worker *new = *victim;
389*1a3d31e3SAndroid Build Coastguard Worker }
390