xref: /aosp_15_r20/external/blktrace/rbtree.c (revision 1a3d31e37cc95e9919fd86900a2b6a555f55952c)
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