xref: /aosp_15_r20/external/mesa3d/src/util/rb_tree.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2017 Faith Ekstrand
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice shall be included in
12*61046927SAndroid Build Coastguard Worker  * all copies or substantial portions of the Software.
13*61046927SAndroid Build Coastguard Worker  *
14*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17*61046927SAndroid Build Coastguard Worker  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20*61046927SAndroid Build Coastguard Worker  * DEALINGS IN THE SOFTWARE.
21*61046927SAndroid Build Coastguard Worker  */
22*61046927SAndroid Build Coastguard Worker 
23*61046927SAndroid Build Coastguard Worker #include "rb_tree.h"
24*61046927SAndroid Build Coastguard Worker 
25*61046927SAndroid Build Coastguard Worker /** \file rb_tree.c
26*61046927SAndroid Build Coastguard Worker  *
27*61046927SAndroid Build Coastguard Worker  * An implementation of a red-black tree
28*61046927SAndroid Build Coastguard Worker  *
29*61046927SAndroid Build Coastguard Worker  * This file implements the guts of a red-black tree.  The implementation
30*61046927SAndroid Build Coastguard Worker  * is mostly based on the one in "Introduction to Algorithms", third
31*61046927SAndroid Build Coastguard Worker  * edition, by Cormen, Leiserson, Rivest, and Stein.  The primary
32*61046927SAndroid Build Coastguard Worker  * divergence in our algorithms from those presented in CLRS is that we use
33*61046927SAndroid Build Coastguard Worker  * NULL for the leaves instead of a sentinel.  This means we have to do a
34*61046927SAndroid Build Coastguard Worker  * tiny bit more tracking in our implementation of delete but it makes the
35*61046927SAndroid Build Coastguard Worker  * algorithms far more explicit than stashing stuff in the sentinel.
36*61046927SAndroid Build Coastguard Worker  */
37*61046927SAndroid Build Coastguard Worker 
38*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
39*61046927SAndroid Build Coastguard Worker #include <string.h>
40*61046927SAndroid Build Coastguard Worker #include <assert.h>
41*61046927SAndroid Build Coastguard Worker 
42*61046927SAndroid Build Coastguard Worker #include "macros.h"
43*61046927SAndroid Build Coastguard Worker 
44*61046927SAndroid Build Coastguard Worker static bool
rb_node_is_black(struct rb_node * n)45*61046927SAndroid Build Coastguard Worker rb_node_is_black(struct rb_node *n)
46*61046927SAndroid Build Coastguard Worker {
47*61046927SAndroid Build Coastguard Worker     /* NULL nodes are leaves and therefore black */
48*61046927SAndroid Build Coastguard Worker     return (n == NULL) || (n->parent & 1);
49*61046927SAndroid Build Coastguard Worker }
50*61046927SAndroid Build Coastguard Worker 
51*61046927SAndroid Build Coastguard Worker static bool
rb_node_is_red(struct rb_node * n)52*61046927SAndroid Build Coastguard Worker rb_node_is_red(struct rb_node *n)
53*61046927SAndroid Build Coastguard Worker {
54*61046927SAndroid Build Coastguard Worker     return !rb_node_is_black(n);
55*61046927SAndroid Build Coastguard Worker }
56*61046927SAndroid Build Coastguard Worker 
57*61046927SAndroid Build Coastguard Worker static void
rb_node_set_black(struct rb_node * n)58*61046927SAndroid Build Coastguard Worker rb_node_set_black(struct rb_node *n)
59*61046927SAndroid Build Coastguard Worker {
60*61046927SAndroid Build Coastguard Worker     n->parent |= 1;
61*61046927SAndroid Build Coastguard Worker }
62*61046927SAndroid Build Coastguard Worker 
63*61046927SAndroid Build Coastguard Worker static void
rb_node_set_red(struct rb_node * n)64*61046927SAndroid Build Coastguard Worker rb_node_set_red(struct rb_node *n)
65*61046927SAndroid Build Coastguard Worker {
66*61046927SAndroid Build Coastguard Worker     n->parent &= ~1ull;
67*61046927SAndroid Build Coastguard Worker }
68*61046927SAndroid Build Coastguard Worker 
69*61046927SAndroid Build Coastguard Worker static void
rb_node_copy_color(struct rb_node * dst,struct rb_node * src)70*61046927SAndroid Build Coastguard Worker rb_node_copy_color(struct rb_node *dst, struct rb_node *src)
71*61046927SAndroid Build Coastguard Worker {
72*61046927SAndroid Build Coastguard Worker     dst->parent = (dst->parent & ~1ull) | (src->parent & 1);
73*61046927SAndroid Build Coastguard Worker }
74*61046927SAndroid Build Coastguard Worker 
75*61046927SAndroid Build Coastguard Worker static void
rb_node_set_parent(struct rb_node * n,struct rb_node * p)76*61046927SAndroid Build Coastguard Worker rb_node_set_parent(struct rb_node *n, struct rb_node *p)
77*61046927SAndroid Build Coastguard Worker {
78*61046927SAndroid Build Coastguard Worker     n->parent = (n->parent & 1) | (uintptr_t)p;
79*61046927SAndroid Build Coastguard Worker }
80*61046927SAndroid Build Coastguard Worker 
81*61046927SAndroid Build Coastguard Worker static struct rb_node *
rb_node_minimum(struct rb_node * node)82*61046927SAndroid Build Coastguard Worker rb_node_minimum(struct rb_node *node)
83*61046927SAndroid Build Coastguard Worker {
84*61046927SAndroid Build Coastguard Worker     while (node->left)
85*61046927SAndroid Build Coastguard Worker         node = node->left;
86*61046927SAndroid Build Coastguard Worker     return node;
87*61046927SAndroid Build Coastguard Worker }
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker static struct rb_node *
rb_node_maximum(struct rb_node * node)90*61046927SAndroid Build Coastguard Worker rb_node_maximum(struct rb_node *node)
91*61046927SAndroid Build Coastguard Worker {
92*61046927SAndroid Build Coastguard Worker     while (node->right)
93*61046927SAndroid Build Coastguard Worker         node = node->right;
94*61046927SAndroid Build Coastguard Worker     return node;
95*61046927SAndroid Build Coastguard Worker }
96*61046927SAndroid Build Coastguard Worker 
97*61046927SAndroid Build Coastguard Worker /**
98*61046927SAndroid Build Coastguard Worker  * Replace the subtree of T rooted at u with the subtree rooted at v
99*61046927SAndroid Build Coastguard Worker  *
100*61046927SAndroid Build Coastguard Worker  * This is called RB-transplant in CLRS.
101*61046927SAndroid Build Coastguard Worker  *
102*61046927SAndroid Build Coastguard Worker  * The node to be replaced is assumed to be a non-leaf.
103*61046927SAndroid Build Coastguard Worker  */
104*61046927SAndroid Build Coastguard Worker static void
rb_tree_splice(struct rb_tree * T,struct rb_node * u,struct rb_node * v)105*61046927SAndroid Build Coastguard Worker rb_tree_splice(struct rb_tree *T, struct rb_node *u, struct rb_node *v)
106*61046927SAndroid Build Coastguard Worker {
107*61046927SAndroid Build Coastguard Worker     assert(u);
108*61046927SAndroid Build Coastguard Worker     struct rb_node *p = rb_node_parent(u);
109*61046927SAndroid Build Coastguard Worker     if (p == NULL) {
110*61046927SAndroid Build Coastguard Worker         assert(T->root == u);
111*61046927SAndroid Build Coastguard Worker         T->root = v;
112*61046927SAndroid Build Coastguard Worker     } else if (u == p->left) {
113*61046927SAndroid Build Coastguard Worker         p->left = v;
114*61046927SAndroid Build Coastguard Worker     } else {
115*61046927SAndroid Build Coastguard Worker         assert(u == p->right);
116*61046927SAndroid Build Coastguard Worker         p->right = v;
117*61046927SAndroid Build Coastguard Worker     }
118*61046927SAndroid Build Coastguard Worker     if (v)
119*61046927SAndroid Build Coastguard Worker         rb_node_set_parent(v, p);
120*61046927SAndroid Build Coastguard Worker }
121*61046927SAndroid Build Coastguard Worker 
122*61046927SAndroid Build Coastguard Worker static void
rb_tree_rotate_left(struct rb_tree * T,struct rb_node * x,void (* update)(struct rb_node *))123*61046927SAndroid Build Coastguard Worker rb_tree_rotate_left(struct rb_tree *T, struct rb_node *x,
124*61046927SAndroid Build Coastguard Worker                     void (*update)(struct rb_node *))
125*61046927SAndroid Build Coastguard Worker {
126*61046927SAndroid Build Coastguard Worker     assert(x && x->right);
127*61046927SAndroid Build Coastguard Worker 
128*61046927SAndroid Build Coastguard Worker     struct rb_node *y = x->right;
129*61046927SAndroid Build Coastguard Worker     x->right = y->left;
130*61046927SAndroid Build Coastguard Worker     if (y->left)
131*61046927SAndroid Build Coastguard Worker         rb_node_set_parent(y->left, x);
132*61046927SAndroid Build Coastguard Worker     rb_tree_splice(T, x, y);
133*61046927SAndroid Build Coastguard Worker     y->left = x;
134*61046927SAndroid Build Coastguard Worker     rb_node_set_parent(x, y);
135*61046927SAndroid Build Coastguard Worker     if (update) {
136*61046927SAndroid Build Coastguard Worker         update(x);
137*61046927SAndroid Build Coastguard Worker         update(y);
138*61046927SAndroid Build Coastguard Worker     }
139*61046927SAndroid Build Coastguard Worker }
140*61046927SAndroid Build Coastguard Worker 
141*61046927SAndroid Build Coastguard Worker static void
rb_tree_rotate_right(struct rb_tree * T,struct rb_node * y,void (* update)(struct rb_node *))142*61046927SAndroid Build Coastguard Worker rb_tree_rotate_right(struct rb_tree *T, struct rb_node *y,
143*61046927SAndroid Build Coastguard Worker                      void (*update)(struct rb_node *))
144*61046927SAndroid Build Coastguard Worker {
145*61046927SAndroid Build Coastguard Worker     assert(y && y->left);
146*61046927SAndroid Build Coastguard Worker 
147*61046927SAndroid Build Coastguard Worker     struct rb_node *x = y->left;
148*61046927SAndroid Build Coastguard Worker     y->left = x->right;
149*61046927SAndroid Build Coastguard Worker     if (x->right)
150*61046927SAndroid Build Coastguard Worker         rb_node_set_parent(x->right, y);
151*61046927SAndroid Build Coastguard Worker     rb_tree_splice(T, y, x);
152*61046927SAndroid Build Coastguard Worker     x->right = y;
153*61046927SAndroid Build Coastguard Worker     rb_node_set_parent(y, x);
154*61046927SAndroid Build Coastguard Worker     if (update) {
155*61046927SAndroid Build Coastguard Worker         update(y);
156*61046927SAndroid Build Coastguard Worker         update(x);
157*61046927SAndroid Build Coastguard Worker     }
158*61046927SAndroid Build Coastguard Worker }
159*61046927SAndroid Build Coastguard Worker 
160*61046927SAndroid Build Coastguard Worker void
rb_augmented_tree_insert_at(struct rb_tree * T,struct rb_node * parent,struct rb_node * node,bool insert_left,void (* update)(struct rb_node * node))161*61046927SAndroid Build Coastguard Worker rb_augmented_tree_insert_at(struct rb_tree *T, struct rb_node *parent,
162*61046927SAndroid Build Coastguard Worker                             struct rb_node *node, bool insert_left,
163*61046927SAndroid Build Coastguard Worker                             void (*update)(struct rb_node *node))
164*61046927SAndroid Build Coastguard Worker {
165*61046927SAndroid Build Coastguard Worker     /* This sets null children, parent, and a color of red */
166*61046927SAndroid Build Coastguard Worker     memset(node, 0, sizeof(*node));
167*61046927SAndroid Build Coastguard Worker 
168*61046927SAndroid Build Coastguard Worker     if (update)
169*61046927SAndroid Build Coastguard Worker        update(node);
170*61046927SAndroid Build Coastguard Worker 
171*61046927SAndroid Build Coastguard Worker     if (parent == NULL) {
172*61046927SAndroid Build Coastguard Worker         assert(T->root == NULL);
173*61046927SAndroid Build Coastguard Worker         T->root = node;
174*61046927SAndroid Build Coastguard Worker         rb_node_set_black(node);
175*61046927SAndroid Build Coastguard Worker         return;
176*61046927SAndroid Build Coastguard Worker     }
177*61046927SAndroid Build Coastguard Worker 
178*61046927SAndroid Build Coastguard Worker     if (insert_left) {
179*61046927SAndroid Build Coastguard Worker         assert(parent->left == NULL);
180*61046927SAndroid Build Coastguard Worker         parent->left = node;
181*61046927SAndroid Build Coastguard Worker     } else {
182*61046927SAndroid Build Coastguard Worker         assert(parent->right == NULL);
183*61046927SAndroid Build Coastguard Worker         parent->right = node;
184*61046927SAndroid Build Coastguard Worker     }
185*61046927SAndroid Build Coastguard Worker     rb_node_set_parent(node, parent);
186*61046927SAndroid Build Coastguard Worker 
187*61046927SAndroid Build Coastguard Worker     if (update) {
188*61046927SAndroid Build Coastguard Worker         struct rb_node *p = parent;
189*61046927SAndroid Build Coastguard Worker         while (p) {
190*61046927SAndroid Build Coastguard Worker             update(p);
191*61046927SAndroid Build Coastguard Worker             p = rb_node_parent(p);
192*61046927SAndroid Build Coastguard Worker         }
193*61046927SAndroid Build Coastguard Worker     }
194*61046927SAndroid Build Coastguard Worker 
195*61046927SAndroid Build Coastguard Worker     /* Now we do the insertion fixup */
196*61046927SAndroid Build Coastguard Worker     struct rb_node *z = node;
197*61046927SAndroid Build Coastguard Worker     while (rb_node_is_red(rb_node_parent(z))) {
198*61046927SAndroid Build Coastguard Worker         struct rb_node *z_p = rb_node_parent(z);
199*61046927SAndroid Build Coastguard Worker         assert(z == z_p->left || z == z_p->right);
200*61046927SAndroid Build Coastguard Worker         struct rb_node *z_p_p = rb_node_parent(z_p);
201*61046927SAndroid Build Coastguard Worker         assert(z_p_p != NULL);
202*61046927SAndroid Build Coastguard Worker         if (z_p == z_p_p->left) {
203*61046927SAndroid Build Coastguard Worker             struct rb_node *y = z_p_p->right;
204*61046927SAndroid Build Coastguard Worker             if (rb_node_is_red(y)) {
205*61046927SAndroid Build Coastguard Worker                 rb_node_set_black(z_p);
206*61046927SAndroid Build Coastguard Worker                 rb_node_set_black(y);
207*61046927SAndroid Build Coastguard Worker                 rb_node_set_red(z_p_p);
208*61046927SAndroid Build Coastguard Worker                 z = z_p_p;
209*61046927SAndroid Build Coastguard Worker             } else {
210*61046927SAndroid Build Coastguard Worker                 if (z == z_p->right) {
211*61046927SAndroid Build Coastguard Worker                     z = z_p;
212*61046927SAndroid Build Coastguard Worker                     rb_tree_rotate_left(T, z, update);
213*61046927SAndroid Build Coastguard Worker                     /* We changed z */
214*61046927SAndroid Build Coastguard Worker                     z_p = rb_node_parent(z);
215*61046927SAndroid Build Coastguard Worker                     assert(z == z_p->left || z == z_p->right);
216*61046927SAndroid Build Coastguard Worker                     z_p_p = rb_node_parent(z_p);
217*61046927SAndroid Build Coastguard Worker                 }
218*61046927SAndroid Build Coastguard Worker                 rb_node_set_black(z_p);
219*61046927SAndroid Build Coastguard Worker                 rb_node_set_red(z_p_p);
220*61046927SAndroid Build Coastguard Worker                 rb_tree_rotate_right(T, z_p_p, update);
221*61046927SAndroid Build Coastguard Worker             }
222*61046927SAndroid Build Coastguard Worker         } else {
223*61046927SAndroid Build Coastguard Worker             struct rb_node *y = z_p_p->left;
224*61046927SAndroid Build Coastguard Worker             if (rb_node_is_red(y)) {
225*61046927SAndroid Build Coastguard Worker                 rb_node_set_black(z_p);
226*61046927SAndroid Build Coastguard Worker                 rb_node_set_black(y);
227*61046927SAndroid Build Coastguard Worker                 rb_node_set_red(z_p_p);
228*61046927SAndroid Build Coastguard Worker                 z = z_p_p;
229*61046927SAndroid Build Coastguard Worker             } else {
230*61046927SAndroid Build Coastguard Worker                 if (z == z_p->left) {
231*61046927SAndroid Build Coastguard Worker                     z = z_p;
232*61046927SAndroid Build Coastguard Worker                     rb_tree_rotate_right(T, z, update);
233*61046927SAndroid Build Coastguard Worker                     /* We changed z */
234*61046927SAndroid Build Coastguard Worker                     z_p = rb_node_parent(z);
235*61046927SAndroid Build Coastguard Worker                     assert(z == z_p->left || z == z_p->right);
236*61046927SAndroid Build Coastguard Worker                     z_p_p = rb_node_parent(z_p);
237*61046927SAndroid Build Coastguard Worker                 }
238*61046927SAndroid Build Coastguard Worker                 rb_node_set_black(z_p);
239*61046927SAndroid Build Coastguard Worker                 rb_node_set_red(z_p_p);
240*61046927SAndroid Build Coastguard Worker                 rb_tree_rotate_left(T, z_p_p, update);
241*61046927SAndroid Build Coastguard Worker             }
242*61046927SAndroid Build Coastguard Worker         }
243*61046927SAndroid Build Coastguard Worker     }
244*61046927SAndroid Build Coastguard Worker     rb_node_set_black(T->root);
245*61046927SAndroid Build Coastguard Worker }
246*61046927SAndroid Build Coastguard Worker 
247*61046927SAndroid Build Coastguard Worker void
rb_augmented_tree_remove(struct rb_tree * T,struct rb_node * z,void (* update)(struct rb_node *))248*61046927SAndroid Build Coastguard Worker rb_augmented_tree_remove(struct rb_tree *T, struct rb_node *z,
249*61046927SAndroid Build Coastguard Worker                          void (*update)(struct rb_node *))
250*61046927SAndroid Build Coastguard Worker {
251*61046927SAndroid Build Coastguard Worker     /* x_p is always the parent node of X.  We have to track this
252*61046927SAndroid Build Coastguard Worker      * separately because x may be NULL.
253*61046927SAndroid Build Coastguard Worker      */
254*61046927SAndroid Build Coastguard Worker     struct rb_node *x, *x_p;
255*61046927SAndroid Build Coastguard Worker     struct rb_node *y = z;
256*61046927SAndroid Build Coastguard Worker     bool y_was_black = rb_node_is_black(y);
257*61046927SAndroid Build Coastguard Worker     if (z->left == NULL) {
258*61046927SAndroid Build Coastguard Worker         x = z->right;
259*61046927SAndroid Build Coastguard Worker         x_p = rb_node_parent(z);
260*61046927SAndroid Build Coastguard Worker         rb_tree_splice(T, z, x);
261*61046927SAndroid Build Coastguard Worker     } else if (z->right == NULL) {
262*61046927SAndroid Build Coastguard Worker         x = z->left;
263*61046927SAndroid Build Coastguard Worker         x_p = rb_node_parent(z);
264*61046927SAndroid Build Coastguard Worker         rb_tree_splice(T, z, x);
265*61046927SAndroid Build Coastguard Worker     } else {
266*61046927SAndroid Build Coastguard Worker         /* Find the minimum sub-node of z->right */
267*61046927SAndroid Build Coastguard Worker         y = rb_node_minimum(z->right);
268*61046927SAndroid Build Coastguard Worker         y_was_black = rb_node_is_black(y);
269*61046927SAndroid Build Coastguard Worker 
270*61046927SAndroid Build Coastguard Worker         x = y->right;
271*61046927SAndroid Build Coastguard Worker         if (rb_node_parent(y) == z) {
272*61046927SAndroid Build Coastguard Worker             x_p = y;
273*61046927SAndroid Build Coastguard Worker         } else {
274*61046927SAndroid Build Coastguard Worker             x_p = rb_node_parent(y);
275*61046927SAndroid Build Coastguard Worker             rb_tree_splice(T, y, x);
276*61046927SAndroid Build Coastguard Worker             y->right = z->right;
277*61046927SAndroid Build Coastguard Worker             rb_node_set_parent(y->right, y);
278*61046927SAndroid Build Coastguard Worker         }
279*61046927SAndroid Build Coastguard Worker         assert(y->left == NULL);
280*61046927SAndroid Build Coastguard Worker         rb_tree_splice(T, z, y);
281*61046927SAndroid Build Coastguard Worker         y->left = z->left;
282*61046927SAndroid Build Coastguard Worker         rb_node_set_parent(y->left, y);
283*61046927SAndroid Build Coastguard Worker         rb_node_copy_color(y, z);
284*61046927SAndroid Build Coastguard Worker     }
285*61046927SAndroid Build Coastguard Worker 
286*61046927SAndroid Build Coastguard Worker     assert(x_p == NULL || x == x_p->left || x == x_p->right);
287*61046927SAndroid Build Coastguard Worker 
288*61046927SAndroid Build Coastguard Worker     if (update) {
289*61046927SAndroid Build Coastguard Worker         struct rb_node *p = x_p;
290*61046927SAndroid Build Coastguard Worker         while (p) {
291*61046927SAndroid Build Coastguard Worker             update(p);
292*61046927SAndroid Build Coastguard Worker             p = rb_node_parent(p);
293*61046927SAndroid Build Coastguard Worker         }
294*61046927SAndroid Build Coastguard Worker     }
295*61046927SAndroid Build Coastguard Worker 
296*61046927SAndroid Build Coastguard Worker     if (!y_was_black)
297*61046927SAndroid Build Coastguard Worker         return;
298*61046927SAndroid Build Coastguard Worker 
299*61046927SAndroid Build Coastguard Worker     /* Fixup RB tree after the delete */
300*61046927SAndroid Build Coastguard Worker     while (x != T->root && rb_node_is_black(x)) {
301*61046927SAndroid Build Coastguard Worker         if (x == x_p->left) {
302*61046927SAndroid Build Coastguard Worker             struct rb_node *w = x_p->right;
303*61046927SAndroid Build Coastguard Worker             if (rb_node_is_red(w)) {
304*61046927SAndroid Build Coastguard Worker                 rb_node_set_black(w);
305*61046927SAndroid Build Coastguard Worker                 rb_node_set_red(x_p);
306*61046927SAndroid Build Coastguard Worker                 rb_tree_rotate_left(T, x_p, update);
307*61046927SAndroid Build Coastguard Worker                 assert(x == x_p->left);
308*61046927SAndroid Build Coastguard Worker                 w = x_p->right;
309*61046927SAndroid Build Coastguard Worker             }
310*61046927SAndroid Build Coastguard Worker             if (rb_node_is_black(w->left) && rb_node_is_black(w->right)) {
311*61046927SAndroid Build Coastguard Worker                 rb_node_set_red(w);
312*61046927SAndroid Build Coastguard Worker                 x = x_p;
313*61046927SAndroid Build Coastguard Worker             } else {
314*61046927SAndroid Build Coastguard Worker                 if (rb_node_is_black(w->right)) {
315*61046927SAndroid Build Coastguard Worker                     rb_node_set_black(w->left);
316*61046927SAndroid Build Coastguard Worker                     rb_node_set_red(w);
317*61046927SAndroid Build Coastguard Worker                     rb_tree_rotate_right(T, w, update);
318*61046927SAndroid Build Coastguard Worker                     w = x_p->right;
319*61046927SAndroid Build Coastguard Worker                 }
320*61046927SAndroid Build Coastguard Worker                 rb_node_copy_color(w, x_p);
321*61046927SAndroid Build Coastguard Worker                 rb_node_set_black(x_p);
322*61046927SAndroid Build Coastguard Worker                 rb_node_set_black(w->right);
323*61046927SAndroid Build Coastguard Worker                 rb_tree_rotate_left(T, x_p, update);
324*61046927SAndroid Build Coastguard Worker                 x = T->root;
325*61046927SAndroid Build Coastguard Worker             }
326*61046927SAndroid Build Coastguard Worker         } else {
327*61046927SAndroid Build Coastguard Worker             struct rb_node *w = x_p->left;
328*61046927SAndroid Build Coastguard Worker             if (rb_node_is_red(w)) {
329*61046927SAndroid Build Coastguard Worker                 rb_node_set_black(w);
330*61046927SAndroid Build Coastguard Worker                 rb_node_set_red(x_p);
331*61046927SAndroid Build Coastguard Worker                 rb_tree_rotate_right(T, x_p, update);
332*61046927SAndroid Build Coastguard Worker                 assert(x == x_p->right);
333*61046927SAndroid Build Coastguard Worker                 w = x_p->left;
334*61046927SAndroid Build Coastguard Worker             }
335*61046927SAndroid Build Coastguard Worker             if (rb_node_is_black(w->right) && rb_node_is_black(w->left)) {
336*61046927SAndroid Build Coastguard Worker                 rb_node_set_red(w);
337*61046927SAndroid Build Coastguard Worker                 x = x_p;
338*61046927SAndroid Build Coastguard Worker             } else {
339*61046927SAndroid Build Coastguard Worker                 if (rb_node_is_black(w->left)) {
340*61046927SAndroid Build Coastguard Worker                     rb_node_set_black(w->right);
341*61046927SAndroid Build Coastguard Worker                     rb_node_set_red(w);
342*61046927SAndroid Build Coastguard Worker                     rb_tree_rotate_left(T, w, update);
343*61046927SAndroid Build Coastguard Worker                     w = x_p->left;
344*61046927SAndroid Build Coastguard Worker                 }
345*61046927SAndroid Build Coastguard Worker                 rb_node_copy_color(w, x_p);
346*61046927SAndroid Build Coastguard Worker                 rb_node_set_black(x_p);
347*61046927SAndroid Build Coastguard Worker                 rb_node_set_black(w->left);
348*61046927SAndroid Build Coastguard Worker                 rb_tree_rotate_right(T, x_p, update);
349*61046927SAndroid Build Coastguard Worker                 x = T->root;
350*61046927SAndroid Build Coastguard Worker             }
351*61046927SAndroid Build Coastguard Worker         }
352*61046927SAndroid Build Coastguard Worker         x_p = rb_node_parent(x);
353*61046927SAndroid Build Coastguard Worker     }
354*61046927SAndroid Build Coastguard Worker     if (x)
355*61046927SAndroid Build Coastguard Worker         rb_node_set_black(x);
356*61046927SAndroid Build Coastguard Worker }
357*61046927SAndroid Build Coastguard Worker 
358*61046927SAndroid Build Coastguard Worker struct rb_node *
rb_tree_first(struct rb_tree * T)359*61046927SAndroid Build Coastguard Worker rb_tree_first(struct rb_tree *T)
360*61046927SAndroid Build Coastguard Worker {
361*61046927SAndroid Build Coastguard Worker     return T->root ? rb_node_minimum(T->root) : NULL;
362*61046927SAndroid Build Coastguard Worker }
363*61046927SAndroid Build Coastguard Worker 
364*61046927SAndroid Build Coastguard Worker struct rb_node *
rb_tree_last(struct rb_tree * T)365*61046927SAndroid Build Coastguard Worker rb_tree_last(struct rb_tree *T)
366*61046927SAndroid Build Coastguard Worker {
367*61046927SAndroid Build Coastguard Worker     return T->root ? rb_node_maximum(T->root) : NULL;
368*61046927SAndroid Build Coastguard Worker }
369*61046927SAndroid Build Coastguard Worker 
370*61046927SAndroid Build Coastguard Worker struct rb_node *
rb_node_next(struct rb_node * node)371*61046927SAndroid Build Coastguard Worker rb_node_next(struct rb_node *node)
372*61046927SAndroid Build Coastguard Worker {
373*61046927SAndroid Build Coastguard Worker     if (node->right) {
374*61046927SAndroid Build Coastguard Worker         /* If we have a right child, then the next thing (compared to this
375*61046927SAndroid Build Coastguard Worker          * node) is the left-most child of our right child.
376*61046927SAndroid Build Coastguard Worker          */
377*61046927SAndroid Build Coastguard Worker         return rb_node_minimum(node->right);
378*61046927SAndroid Build Coastguard Worker     } else {
379*61046927SAndroid Build Coastguard Worker         /* If node doesn't have a right child, crawl back up the to the
380*61046927SAndroid Build Coastguard Worker          * left until we hit a parent to the right.
381*61046927SAndroid Build Coastguard Worker          */
382*61046927SAndroid Build Coastguard Worker         struct rb_node *p = rb_node_parent(node);
383*61046927SAndroid Build Coastguard Worker         while (p && node == p->right) {
384*61046927SAndroid Build Coastguard Worker             node = p;
385*61046927SAndroid Build Coastguard Worker             p = rb_node_parent(node);
386*61046927SAndroid Build Coastguard Worker         }
387*61046927SAndroid Build Coastguard Worker         assert(p == NULL || node == p->left);
388*61046927SAndroid Build Coastguard Worker         return p;
389*61046927SAndroid Build Coastguard Worker     }
390*61046927SAndroid Build Coastguard Worker }
391*61046927SAndroid Build Coastguard Worker 
392*61046927SAndroid Build Coastguard Worker struct rb_node *
rb_node_prev(struct rb_node * node)393*61046927SAndroid Build Coastguard Worker rb_node_prev(struct rb_node *node)
394*61046927SAndroid Build Coastguard Worker {
395*61046927SAndroid Build Coastguard Worker     if (node->left) {
396*61046927SAndroid Build Coastguard Worker         /* If we have a left child, then the previous thing (compared to
397*61046927SAndroid Build Coastguard Worker          * this node) is the right-most child of our left child.
398*61046927SAndroid Build Coastguard Worker          */
399*61046927SAndroid Build Coastguard Worker         return rb_node_maximum(node->left);
400*61046927SAndroid Build Coastguard Worker     } else {
401*61046927SAndroid Build Coastguard Worker         /* If node doesn't have a left child, crawl back up the to the
402*61046927SAndroid Build Coastguard Worker          * right until we hit a parent to the left.
403*61046927SAndroid Build Coastguard Worker          */
404*61046927SAndroid Build Coastguard Worker         struct rb_node *p = rb_node_parent(node);
405*61046927SAndroid Build Coastguard Worker         while (p && node == p->left) {
406*61046927SAndroid Build Coastguard Worker             node = p;
407*61046927SAndroid Build Coastguard Worker             p = rb_node_parent(node);
408*61046927SAndroid Build Coastguard Worker         }
409*61046927SAndroid Build Coastguard Worker         assert(p == NULL || node == p->right);
410*61046927SAndroid Build Coastguard Worker         return p;
411*61046927SAndroid Build Coastguard Worker     }
412*61046927SAndroid Build Coastguard Worker }
413*61046927SAndroid Build Coastguard Worker 
414*61046927SAndroid Build Coastguard Worker /* Return the first node in an interval tree that intersects a given interval
415*61046927SAndroid Build Coastguard Worker  * or point. The tests against the interval and the max field are abstracted
416*61046927SAndroid Build Coastguard Worker  * via function pointers, so that this works for any type of interval.
417*61046927SAndroid Build Coastguard Worker  */
418*61046927SAndroid Build Coastguard Worker static struct rb_node *
rb_node_min_intersecting(struct rb_node * node,void * interval,int (* cmp_interval)(const struct rb_node * node,const void * interval),bool (* cmp_max)(const struct rb_node * node,const void * interval))419*61046927SAndroid Build Coastguard Worker rb_node_min_intersecting(struct rb_node *node, void *interval,
420*61046927SAndroid Build Coastguard Worker                          int (*cmp_interval)(const struct rb_node *node,
421*61046927SAndroid Build Coastguard Worker                                              const void *interval),
422*61046927SAndroid Build Coastguard Worker                          bool (*cmp_max)(const struct rb_node *node,
423*61046927SAndroid Build Coastguard Worker                                          const void *interval))
424*61046927SAndroid Build Coastguard Worker {
425*61046927SAndroid Build Coastguard Worker     if (!cmp_max(node, interval))
426*61046927SAndroid Build Coastguard Worker         return NULL;
427*61046927SAndroid Build Coastguard Worker 
428*61046927SAndroid Build Coastguard Worker     while (node) {
429*61046927SAndroid Build Coastguard Worker         int cmp = cmp_interval(node, interval);
430*61046927SAndroid Build Coastguard Worker 
431*61046927SAndroid Build Coastguard Worker         /* If the node's interval is entirely to the right of the interval
432*61046927SAndroid Build Coastguard Worker          * we're searching for, all of its right descendants are also to the
433*61046927SAndroid Build Coastguard Worker          * right and don't intersect so we have to search to the left.
434*61046927SAndroid Build Coastguard Worker          */
435*61046927SAndroid Build Coastguard Worker         if (cmp > 0) {
436*61046927SAndroid Build Coastguard Worker             node = node->left;
437*61046927SAndroid Build Coastguard Worker             continue;
438*61046927SAndroid Build Coastguard Worker         }
439*61046927SAndroid Build Coastguard Worker 
440*61046927SAndroid Build Coastguard Worker         /* The interval overlaps or is to the left. This must also be true for
441*61046927SAndroid Build Coastguard Worker          * its left descendants because their start points are to the left of
442*61046927SAndroid Build Coastguard Worker          * node's. We can use the max to tell if there is an interval in its
443*61046927SAndroid Build Coastguard Worker          * left descendants which overlaps our interval, in which case we
444*61046927SAndroid Build Coastguard Worker          * should descend to the left.
445*61046927SAndroid Build Coastguard Worker          */
446*61046927SAndroid Build Coastguard Worker         if (node->left && cmp_max(node->left, interval)) {
447*61046927SAndroid Build Coastguard Worker             node = node->left;
448*61046927SAndroid Build Coastguard Worker             continue;
449*61046927SAndroid Build Coastguard Worker         }
450*61046927SAndroid Build Coastguard Worker 
451*61046927SAndroid Build Coastguard Worker         /* Now the only possibilities are the node's interval intersects the
452*61046927SAndroid Build Coastguard Worker          * interval or one of its right descendants does.
453*61046927SAndroid Build Coastguard Worker          */
454*61046927SAndroid Build Coastguard Worker         if (cmp == 0)
455*61046927SAndroid Build Coastguard Worker             return node;
456*61046927SAndroid Build Coastguard Worker 
457*61046927SAndroid Build Coastguard Worker         node = node->right;
458*61046927SAndroid Build Coastguard Worker         if (node && !cmp_max(node, interval))
459*61046927SAndroid Build Coastguard Worker             return NULL;
460*61046927SAndroid Build Coastguard Worker     }
461*61046927SAndroid Build Coastguard Worker 
462*61046927SAndroid Build Coastguard Worker     return NULL;
463*61046927SAndroid Build Coastguard Worker }
464*61046927SAndroid Build Coastguard Worker 
465*61046927SAndroid Build Coastguard Worker /* Return the next node after "node" that intersects a given interval.
466*61046927SAndroid Build Coastguard Worker  *
467*61046927SAndroid Build Coastguard Worker  * Because rb_node_min_intersecting() takes O(log n) time and may be called up
468*61046927SAndroid Build Coastguard Worker  * to O(log n) times, in addition to the O(log n) crawl up the tree, a naive
469*61046927SAndroid Build Coastguard Worker  * runtime analysis would show that this takes O((log n)^2) time, but actually
470*61046927SAndroid Build Coastguard Worker  * it's O(log n). Proving this is tricky:
471*61046927SAndroid Build Coastguard Worker  *
472*61046927SAndroid Build Coastguard Worker  * Call the rightmost node in the tree whose start is before the end of the
473*61046927SAndroid Build Coastguard Worker  * interval we're searching for N. All nodes after N in the tree are to the
474*61046927SAndroid Build Coastguard Worker  * right of the interval. We'll divide the search into two phases: in phase 1,
475*61046927SAndroid Build Coastguard Worker  * "node" is *not* an ancestor of N, and in phase 2 it is. Because we always
476*61046927SAndroid Build Coastguard Worker  * crawl up the tree, phase 2 cannot turn back into phase 1, but phase 1 may
477*61046927SAndroid Build Coastguard Worker  * be followed by phase 2. We'll prove that the calls to
478*61046927SAndroid Build Coastguard Worker  * rb_node_min_intersecting() take O(log n) time in both phases.
479*61046927SAndroid Build Coastguard Worker  *
480*61046927SAndroid Build Coastguard Worker  * Phase 1: Because "node" is to the left of N and N isn't a descendant of
481*61046927SAndroid Build Coastguard Worker  * "node", the start of every interval in "node"'s subtree must be less than
482*61046927SAndroid Build Coastguard Worker  * or equal to N's start which is less than or equal to the end of the search
483*61046927SAndroid Build Coastguard Worker  * interval. Furthermore, either "node"'s max_end is less than the start of
484*61046927SAndroid Build Coastguard Worker  * the interval, in which case rb_node_min_intersecting() immediately returns
485*61046927SAndroid Build Coastguard Worker  * NULL, or some descendant has an end equal to "node"'s max_end which is
486*61046927SAndroid Build Coastguard Worker  * greater than or equal to the search interval's start, and therefore it
487*61046927SAndroid Build Coastguard Worker  * intersects the search interval and rb_node_min_intersecting() must return
488*61046927SAndroid Build Coastguard Worker  * non-NULL which causes us to terminate. rb_node_min_intersecting() is called
489*61046927SAndroid Build Coastguard Worker  * O(log n) times, with all but the last call taking constant time and the
490*61046927SAndroid Build Coastguard Worker  * last call taking O(log n), so the overall runtime is O(log n).
491*61046927SAndroid Build Coastguard Worker  *
492*61046927SAndroid Build Coastguard Worker  * Phase 2: After the first call to rb_node_min_intersecting, we may crawl up
493*61046927SAndroid Build Coastguard Worker  * the tree until we get to a node p where "node", and therefore N, is in p's
494*61046927SAndroid Build Coastguard Worker  * left subtree. However this means that p is to the right of N in the tree
495*61046927SAndroid Build Coastguard Worker  * and is therefore to the right of the search interval, and the search
496*61046927SAndroid Build Coastguard Worker  * terminates on the first iteration of the loop so that
497*61046927SAndroid Build Coastguard Worker  * rb_node_min_intersecting() is only called once.
498*61046927SAndroid Build Coastguard Worker  */
499*61046927SAndroid Build Coastguard Worker static struct rb_node *
rb_node_next_intersecting(struct rb_node * node,void * interval,int (* cmp_interval)(const struct rb_node * node,const void * interval),bool (* cmp_max)(const struct rb_node * node,const void * interval))500*61046927SAndroid Build Coastguard Worker rb_node_next_intersecting(struct rb_node *node,
501*61046927SAndroid Build Coastguard Worker                           void *interval,
502*61046927SAndroid Build Coastguard Worker                           int (*cmp_interval)(const struct rb_node *node,
503*61046927SAndroid Build Coastguard Worker                                               const void *interval),
504*61046927SAndroid Build Coastguard Worker                           bool (*cmp_max)(const struct rb_node *node,
505*61046927SAndroid Build Coastguard Worker                                           const void *interval))
506*61046927SAndroid Build Coastguard Worker {
507*61046927SAndroid Build Coastguard Worker     while (true) {
508*61046927SAndroid Build Coastguard Worker         /* The first place to search is the node's right subtree. */
509*61046927SAndroid Build Coastguard Worker         if (node->right) {
510*61046927SAndroid Build Coastguard Worker             struct rb_node *next =
511*61046927SAndroid Build Coastguard Worker                 rb_node_min_intersecting(node->right, interval, cmp_interval, cmp_max);
512*61046927SAndroid Build Coastguard Worker             if (next)
513*61046927SAndroid Build Coastguard Worker                 return next;
514*61046927SAndroid Build Coastguard Worker         }
515*61046927SAndroid Build Coastguard Worker 
516*61046927SAndroid Build Coastguard Worker         /* If we don't find a matching interval there, crawl up the tree until
517*61046927SAndroid Build Coastguard Worker          * we find an ancestor to the right. This is the next node after the
518*61046927SAndroid Build Coastguard Worker          * right subtree which we determined didn't match.
519*61046927SAndroid Build Coastguard Worker          */
520*61046927SAndroid Build Coastguard Worker         struct rb_node *p = rb_node_parent(node);
521*61046927SAndroid Build Coastguard Worker         while (p && node == p->right) {
522*61046927SAndroid Build Coastguard Worker             node = p;
523*61046927SAndroid Build Coastguard Worker             p = rb_node_parent(node);
524*61046927SAndroid Build Coastguard Worker         }
525*61046927SAndroid Build Coastguard Worker         assert(p == NULL || node == p->left);
526*61046927SAndroid Build Coastguard Worker 
527*61046927SAndroid Build Coastguard Worker         /* Check if we've searched everything in the tree. */
528*61046927SAndroid Build Coastguard Worker         if (!p)
529*61046927SAndroid Build Coastguard Worker             return NULL;
530*61046927SAndroid Build Coastguard Worker 
531*61046927SAndroid Build Coastguard Worker         int cmp = cmp_interval(p, interval);
532*61046927SAndroid Build Coastguard Worker 
533*61046927SAndroid Build Coastguard Worker         /* If it intersects, return it. */
534*61046927SAndroid Build Coastguard Worker         if (cmp == 0)
535*61046927SAndroid Build Coastguard Worker             return p;
536*61046927SAndroid Build Coastguard Worker 
537*61046927SAndroid Build Coastguard Worker         /* If it's to the right of the interval, all following nodes will be
538*61046927SAndroid Build Coastguard Worker          * to the right and we can bail early.
539*61046927SAndroid Build Coastguard Worker          */
540*61046927SAndroid Build Coastguard Worker         if (cmp > 0)
541*61046927SAndroid Build Coastguard Worker             return NULL;
542*61046927SAndroid Build Coastguard Worker 
543*61046927SAndroid Build Coastguard Worker         node = p;
544*61046927SAndroid Build Coastguard Worker     }
545*61046927SAndroid Build Coastguard Worker }
546*61046927SAndroid Build Coastguard Worker 
547*61046927SAndroid Build Coastguard Worker static int
uinterval_cmp(struct uinterval a,struct uinterval b)548*61046927SAndroid Build Coastguard Worker uinterval_cmp(struct uinterval a, struct uinterval b)
549*61046927SAndroid Build Coastguard Worker {
550*61046927SAndroid Build Coastguard Worker     if (a.end < b.start)
551*61046927SAndroid Build Coastguard Worker         return -1;
552*61046927SAndroid Build Coastguard Worker     else if (b.end < a.start)
553*61046927SAndroid Build Coastguard Worker         return 1;
554*61046927SAndroid Build Coastguard Worker     else
555*61046927SAndroid Build Coastguard Worker         return 0;
556*61046927SAndroid Build Coastguard Worker }
557*61046927SAndroid Build Coastguard Worker 
558*61046927SAndroid Build Coastguard Worker static int
uinterval_node_cmp(const struct rb_node * _a,const struct rb_node * _b)559*61046927SAndroid Build Coastguard Worker uinterval_node_cmp(const struct rb_node *_a, const struct rb_node *_b)
560*61046927SAndroid Build Coastguard Worker {
561*61046927SAndroid Build Coastguard Worker     const struct uinterval_node *a = rb_node_data(struct uinterval_node, _a, node);
562*61046927SAndroid Build Coastguard Worker     const struct uinterval_node *b = rb_node_data(struct uinterval_node, _b, node);
563*61046927SAndroid Build Coastguard Worker 
564*61046927SAndroid Build Coastguard Worker     return (int) (b->interval.start - a->interval.start);
565*61046927SAndroid Build Coastguard Worker }
566*61046927SAndroid Build Coastguard Worker 
567*61046927SAndroid Build Coastguard Worker static int
uinterval_search_cmp(const struct rb_node * _node,const void * _interval)568*61046927SAndroid Build Coastguard Worker uinterval_search_cmp(const struct rb_node *_node, const void *_interval)
569*61046927SAndroid Build Coastguard Worker {
570*61046927SAndroid Build Coastguard Worker     const struct uinterval_node *node = rb_node_data(struct uinterval_node, _node, node);
571*61046927SAndroid Build Coastguard Worker     const struct uinterval *interval = _interval;
572*61046927SAndroid Build Coastguard Worker 
573*61046927SAndroid Build Coastguard Worker     return uinterval_cmp(node->interval, *interval);
574*61046927SAndroid Build Coastguard Worker }
575*61046927SAndroid Build Coastguard Worker 
576*61046927SAndroid Build Coastguard Worker static bool
uinterval_max_cmp(const struct rb_node * _node,const void * data)577*61046927SAndroid Build Coastguard Worker uinterval_max_cmp(const struct rb_node *_node, const void *data)
578*61046927SAndroid Build Coastguard Worker {
579*61046927SAndroid Build Coastguard Worker     const struct uinterval_node *node = rb_node_data(struct uinterval_node, _node, node);
580*61046927SAndroid Build Coastguard Worker     const struct uinterval *interval = data;
581*61046927SAndroid Build Coastguard Worker 
582*61046927SAndroid Build Coastguard Worker     return node->max_end >= interval->start;
583*61046927SAndroid Build Coastguard Worker }
584*61046927SAndroid Build Coastguard Worker 
585*61046927SAndroid Build Coastguard Worker static void
uinterval_update_max(struct rb_node * _node)586*61046927SAndroid Build Coastguard Worker uinterval_update_max(struct rb_node *_node)
587*61046927SAndroid Build Coastguard Worker {
588*61046927SAndroid Build Coastguard Worker     struct uinterval_node *node = rb_node_data(struct uinterval_node, _node, node);
589*61046927SAndroid Build Coastguard Worker     node->max_end = node->interval.end;
590*61046927SAndroid Build Coastguard Worker     if (node->node.left) {
591*61046927SAndroid Build Coastguard Worker         struct uinterval_node *left = rb_node_data(struct uinterval_node, node->node.left, node);
592*61046927SAndroid Build Coastguard Worker         node->max_end = MAX2(node->max_end, left->max_end);
593*61046927SAndroid Build Coastguard Worker     }
594*61046927SAndroid Build Coastguard Worker     if (node->node.right) {
595*61046927SAndroid Build Coastguard Worker         struct uinterval_node *right = rb_node_data(struct uinterval_node, node->node.right, node);
596*61046927SAndroid Build Coastguard Worker         node->max_end = MAX2(node->max_end, right->max_end);
597*61046927SAndroid Build Coastguard Worker     }
598*61046927SAndroid Build Coastguard Worker }
599*61046927SAndroid Build Coastguard Worker 
600*61046927SAndroid Build Coastguard Worker void
uinterval_tree_insert(struct rb_tree * tree,struct uinterval_node * node)601*61046927SAndroid Build Coastguard Worker uinterval_tree_insert(struct rb_tree *tree, struct uinterval_node *node)
602*61046927SAndroid Build Coastguard Worker {
603*61046927SAndroid Build Coastguard Worker     rb_augmented_tree_insert(tree, &node->node, uinterval_node_cmp,
604*61046927SAndroid Build Coastguard Worker                              uinterval_update_max);
605*61046927SAndroid Build Coastguard Worker }
606*61046927SAndroid Build Coastguard Worker 
607*61046927SAndroid Build Coastguard Worker void
uinterval_tree_remove(struct rb_tree * tree,struct uinterval_node * node)608*61046927SAndroid Build Coastguard Worker uinterval_tree_remove(struct rb_tree *tree, struct uinterval_node *node)
609*61046927SAndroid Build Coastguard Worker {
610*61046927SAndroid Build Coastguard Worker     rb_augmented_tree_remove(tree, &node->node, uinterval_update_max);
611*61046927SAndroid Build Coastguard Worker }
612*61046927SAndroid Build Coastguard Worker 
613*61046927SAndroid Build Coastguard Worker struct uinterval_node *
uinterval_tree_first(struct rb_tree * tree,struct uinterval interval)614*61046927SAndroid Build Coastguard Worker uinterval_tree_first(struct rb_tree *tree, struct uinterval interval)
615*61046927SAndroid Build Coastguard Worker {
616*61046927SAndroid Build Coastguard Worker     if (!tree->root)
617*61046927SAndroid Build Coastguard Worker         return NULL;
618*61046927SAndroid Build Coastguard Worker 
619*61046927SAndroid Build Coastguard Worker     struct rb_node *node =
620*61046927SAndroid Build Coastguard Worker         rb_node_min_intersecting(tree->root, &interval, uinterval_search_cmp,
621*61046927SAndroid Build Coastguard Worker                                  uinterval_max_cmp);
622*61046927SAndroid Build Coastguard Worker 
623*61046927SAndroid Build Coastguard Worker     return node ? rb_node_data(struct uinterval_node, node, node) : NULL;
624*61046927SAndroid Build Coastguard Worker }
625*61046927SAndroid Build Coastguard Worker 
626*61046927SAndroid Build Coastguard Worker struct uinterval_node *
uinterval_node_next(struct uinterval_node * node,struct uinterval interval)627*61046927SAndroid Build Coastguard Worker uinterval_node_next(struct uinterval_node *node,
628*61046927SAndroid Build Coastguard Worker                     struct uinterval interval)
629*61046927SAndroid Build Coastguard Worker {
630*61046927SAndroid Build Coastguard Worker     struct rb_node *next =
631*61046927SAndroid Build Coastguard Worker         rb_node_next_intersecting(&node->node, &interval, uinterval_search_cmp,
632*61046927SAndroid Build Coastguard Worker                                   uinterval_max_cmp);
633*61046927SAndroid Build Coastguard Worker 
634*61046927SAndroid Build Coastguard Worker     return next ? rb_node_data(struct uinterval_node, next, node) : NULL;
635*61046927SAndroid Build Coastguard Worker }
636*61046927SAndroid Build Coastguard Worker 
637*61046927SAndroid Build Coastguard Worker static void
validate_rb_node(struct rb_node * n,int black_depth)638*61046927SAndroid Build Coastguard Worker validate_rb_node(struct rb_node *n, int black_depth)
639*61046927SAndroid Build Coastguard Worker {
640*61046927SAndroid Build Coastguard Worker     if (n == NULL) {
641*61046927SAndroid Build Coastguard Worker         assert(black_depth == 0);
642*61046927SAndroid Build Coastguard Worker         return;
643*61046927SAndroid Build Coastguard Worker     }
644*61046927SAndroid Build Coastguard Worker 
645*61046927SAndroid Build Coastguard Worker     if (rb_node_is_black(n)) {
646*61046927SAndroid Build Coastguard Worker         black_depth--;
647*61046927SAndroid Build Coastguard Worker     } else {
648*61046927SAndroid Build Coastguard Worker         assert(rb_node_is_black(n->left));
649*61046927SAndroid Build Coastguard Worker         assert(rb_node_is_black(n->right));
650*61046927SAndroid Build Coastguard Worker     }
651*61046927SAndroid Build Coastguard Worker 
652*61046927SAndroid Build Coastguard Worker     validate_rb_node(n->left, black_depth);
653*61046927SAndroid Build Coastguard Worker     validate_rb_node(n->right, black_depth);
654*61046927SAndroid Build Coastguard Worker }
655*61046927SAndroid Build Coastguard Worker 
656*61046927SAndroid Build Coastguard Worker void
rb_tree_validate(struct rb_tree * T)657*61046927SAndroid Build Coastguard Worker rb_tree_validate(struct rb_tree *T)
658*61046927SAndroid Build Coastguard Worker {
659*61046927SAndroid Build Coastguard Worker     if (T->root == NULL)
660*61046927SAndroid Build Coastguard Worker         return;
661*61046927SAndroid Build Coastguard Worker 
662*61046927SAndroid Build Coastguard Worker     assert(rb_node_is_black(T->root));
663*61046927SAndroid Build Coastguard Worker 
664*61046927SAndroid Build Coastguard Worker     unsigned black_depth = 0;
665*61046927SAndroid Build Coastguard Worker     for (struct rb_node *n = T->root; n; n = n->left) {
666*61046927SAndroid Build Coastguard Worker         if (rb_node_is_black(n))
667*61046927SAndroid Build Coastguard Worker             black_depth++;
668*61046927SAndroid Build Coastguard Worker     }
669*61046927SAndroid Build Coastguard Worker 
670*61046927SAndroid Build Coastguard Worker     validate_rb_node(T->root, black_depth);
671*61046927SAndroid Build Coastguard Worker }
672