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