rbtree.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554
  1. /*
  2. * Copyright (c) 2010-2017 Richard Braun.
  3. *
  4. * This program is free software: you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation, either version 3 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. *
  17. * Upstream site with license notes :
  18. * http://git.sceen.net/rbraun/librbraun.git/
  19. */
  20. #include <assert.h>
  21. #include <stddef.h>
  22. #include <stdint.h>
  23. #include <kern/macros.h>
  24. #include <kern/rbtree.h>
  25. #include <kern/rbtree_i.h>
  26. /*
  27. * Return the index of a node in the children array of its parent.
  28. *
  29. * The parent parameter must not be NULL, and must be the parent of the
  30. * given node.
  31. */
  32. static inline int
  33. rbtree_node_index(const struct rbtree_node *node,
  34. const struct rbtree_node *parent)
  35. {
  36. assert(parent != NULL);
  37. assert((node == NULL) || (rbtree_node_parent(node) == parent));
  38. if (parent->children[RBTREE_LEFT] == node) {
  39. return RBTREE_LEFT;
  40. }
  41. assert(parent->children[RBTREE_RIGHT] == node);
  42. return RBTREE_RIGHT;
  43. }
  44. /*
  45. * Return the color of a node.
  46. */
  47. static inline int
  48. rbtree_node_color(const struct rbtree_node *node)
  49. {
  50. return node->parent & RBTREE_COLOR_MASK;
  51. }
  52. /*
  53. * Return true if the node is red.
  54. */
  55. static inline int
  56. rbtree_node_is_red(const struct rbtree_node *node)
  57. {
  58. return rbtree_node_color(node) == RBTREE_COLOR_RED;
  59. }
  60. /*
  61. * Return true if the node is black.
  62. */
  63. static inline int
  64. rbtree_node_is_black(const struct rbtree_node *node)
  65. {
  66. return rbtree_node_color(node) == RBTREE_COLOR_BLACK;
  67. }
  68. /*
  69. * Set the parent of a node, retaining its current color.
  70. */
  71. static inline void
  72. rbtree_node_set_parent(struct rbtree_node *node, struct rbtree_node *parent)
  73. {
  74. assert(rbtree_node_check_alignment(node));
  75. assert(rbtree_node_check_alignment(parent));
  76. node->parent = (uintptr_t)parent | (node->parent & RBTREE_COLOR_MASK);
  77. }
  78. /*
  79. * Set the color of a node, retaining its current parent.
  80. */
  81. static inline void
  82. rbtree_node_set_color(struct rbtree_node *node, int color)
  83. {
  84. assert((color & ~RBTREE_COLOR_MASK) == 0);
  85. node->parent = (node->parent & RBTREE_PARENT_MASK) | color;
  86. }
  87. /*
  88. * Set the color of a node to red, retaining its current parent.
  89. */
  90. static inline void
  91. rbtree_node_set_red(struct rbtree_node *node)
  92. {
  93. rbtree_node_set_color(node, RBTREE_COLOR_RED);
  94. }
  95. /*
  96. * Set the color of a node to black, retaining its current parent.
  97. */
  98. static inline void
  99. rbtree_node_set_black(struct rbtree_node *node)
  100. {
  101. rbtree_node_set_color(node, RBTREE_COLOR_BLACK);
  102. }
  103. /*
  104. * Return the left-most deepest child node of the given node.
  105. */
  106. static struct rbtree_node *
  107. rbtree_node_find_deepest(struct rbtree_node *node)
  108. {
  109. struct rbtree_node *parent;
  110. assert(node != NULL);
  111. for (;;) {
  112. parent = node;
  113. node = node->children[RBTREE_LEFT];
  114. if (node == NULL) {
  115. node = parent->children[RBTREE_RIGHT];
  116. if (node == NULL) {
  117. return parent;
  118. }
  119. }
  120. }
  121. }
  122. /*
  123. * Perform a tree rotation, rooted at the given node.
  124. *
  125. * The direction parameter defines the rotation direction and is either
  126. * RBTREE_LEFT or RBTREE_RIGHT.
  127. */
  128. static void
  129. rbtree_rotate(struct rbtree *tree, struct rbtree_node *node, int direction)
  130. {
  131. struct rbtree_node *parent, *rnode;
  132. int left, right;
  133. left = direction;
  134. right = 1 - left;
  135. parent = rbtree_node_parent(node);
  136. rnode = node->children[right];
  137. node->children[right] = rnode->children[left];
  138. if (rnode->children[left] != NULL) {
  139. rbtree_node_set_parent(rnode->children[left], node);
  140. }
  141. rnode->children[left] = node;
  142. rbtree_node_set_parent(rnode, parent);
  143. if (unlikely(parent == NULL)) {
  144. tree->root = rnode;
  145. } else {
  146. parent->children[rbtree_node_index(node, parent)] = rnode;
  147. }
  148. rbtree_node_set_parent(node, rnode);
  149. }
  150. void
  151. rbtree_insert_rebalance(struct rbtree *tree, struct rbtree_node *parent,
  152. int index, struct rbtree_node *node)
  153. {
  154. struct rbtree_node *grand_parent, *uncle;
  155. int left, right;
  156. assert(rbtree_node_check_alignment(parent));
  157. assert(rbtree_node_check_alignment(node));
  158. node->parent = (uintptr_t)parent | RBTREE_COLOR_RED;
  159. node->children[RBTREE_LEFT] = NULL;
  160. node->children[RBTREE_RIGHT] = NULL;
  161. if (unlikely(parent == NULL)) {
  162. tree->root = node;
  163. } else {
  164. parent->children[index] = node;
  165. }
  166. for (;;) {
  167. if (parent == NULL) {
  168. rbtree_node_set_black(node);
  169. break;
  170. }
  171. if (rbtree_node_is_black(parent)) {
  172. break;
  173. }
  174. grand_parent = rbtree_node_parent(parent);
  175. assert(grand_parent != NULL);
  176. left = rbtree_node_index(parent, grand_parent);
  177. right = 1 - left;
  178. uncle = grand_parent->children[right];
  179. /*
  180. * Uncle is red. Flip colors and repeat at grand parent.
  181. */
  182. if ((uncle != NULL) && rbtree_node_is_red(uncle)) {
  183. rbtree_node_set_black(uncle);
  184. rbtree_node_set_black(parent);
  185. rbtree_node_set_red(grand_parent);
  186. node = grand_parent;
  187. parent = rbtree_node_parent(node);
  188. continue;
  189. }
  190. /*
  191. * Node is the right child of its parent. Rotate left at parent.
  192. */
  193. if (parent->children[right] == node) {
  194. rbtree_rotate(tree, parent, left);
  195. parent = node;
  196. }
  197. /*
  198. * Node is the left child of its parent. Handle colors, rotate right
  199. * at grand parent, and leave.
  200. */
  201. rbtree_node_set_black(parent);
  202. rbtree_node_set_red(grand_parent);
  203. rbtree_rotate(tree, grand_parent, right);
  204. break;
  205. }
  206. assert(rbtree_node_is_black(tree->root));
  207. }
  208. void *
  209. rbtree_replace_slot(struct rbtree *tree, rbtree_slot_t slot,
  210. struct rbtree_node *node)
  211. {
  212. struct rbtree_node *parent, *prev;
  213. int index;
  214. parent = rbtree_slot_parent(slot);
  215. if (!parent) {
  216. prev = tree->root;
  217. tree->root = node;
  218. } else {
  219. index = rbtree_slot_index(slot);
  220. assert(rbtree_check_index(index));
  221. prev = parent->children[index];
  222. parent->children[index] = node;
  223. }
  224. assert(prev);
  225. *node = *prev;
  226. for (size_t i = 0; i < ARRAY_SIZE(node->children); i++) {
  227. if (!node->children[i]) {
  228. continue;
  229. }
  230. rbtree_node_set_parent(node->children[i], node);
  231. }
  232. return prev;
  233. }
  234. void
  235. rbtree_remove(struct rbtree *tree, struct rbtree_node *node)
  236. {
  237. struct rbtree_node *child, *parent, *brother;
  238. int color, left, right;
  239. if (node->children[RBTREE_LEFT] == NULL) {
  240. child = node->children[RBTREE_RIGHT];
  241. } else if (node->children[RBTREE_RIGHT] == NULL) {
  242. child = node->children[RBTREE_LEFT];
  243. } else {
  244. struct rbtree_node *successor;
  245. /*
  246. * Two-children case: replace the node with its successor.
  247. */
  248. successor = node->children[RBTREE_RIGHT];
  249. while (successor->children[RBTREE_LEFT] != NULL) {
  250. successor = successor->children[RBTREE_LEFT];
  251. }
  252. color = rbtree_node_color(successor);
  253. child = successor->children[RBTREE_RIGHT];
  254. parent = rbtree_node_parent(node);
  255. if (unlikely(parent == NULL)) {
  256. tree->root = successor;
  257. } else {
  258. parent->children[rbtree_node_index(node, parent)] = successor;
  259. }
  260. parent = rbtree_node_parent(successor);
  261. /*
  262. * Set parent directly to keep the original color.
  263. */
  264. successor->parent = node->parent;
  265. successor->children[RBTREE_LEFT] = node->children[RBTREE_LEFT];
  266. rbtree_node_set_parent(successor->children[RBTREE_LEFT], successor);
  267. if (node == parent) {
  268. parent = successor;
  269. } else {
  270. successor->children[RBTREE_RIGHT] = node->children[RBTREE_RIGHT];
  271. rbtree_node_set_parent(successor->children[RBTREE_RIGHT],
  272. successor);
  273. parent->children[RBTREE_LEFT] = child;
  274. if (child != NULL) {
  275. rbtree_node_set_parent(child, parent);
  276. }
  277. }
  278. goto update_color;
  279. }
  280. /*
  281. * Node has at most one child.
  282. */
  283. color = rbtree_node_color(node);
  284. parent = rbtree_node_parent(node);
  285. if (child != NULL) {
  286. rbtree_node_set_parent(child, parent);
  287. }
  288. if (unlikely(parent == NULL)) {
  289. tree->root = child;
  290. } else {
  291. parent->children[rbtree_node_index(node, parent)] = child;
  292. }
  293. /*
  294. * The node has been removed, update the colors. The child pointer can
  295. * be NULL, in which case it is considered a black leaf.
  296. */
  297. update_color:
  298. if (color == RBTREE_COLOR_RED) {
  299. return;
  300. }
  301. for (;;) {
  302. if ((child != NULL) && rbtree_node_is_red(child)) {
  303. rbtree_node_set_black(child);
  304. break;
  305. }
  306. if (parent == NULL) {
  307. break;
  308. }
  309. left = rbtree_node_index(child, parent);
  310. right = 1 - left;
  311. brother = parent->children[right];
  312. /*
  313. * Brother is red. Recolor and rotate left at parent so that brother
  314. * becomes black.
  315. */
  316. if (rbtree_node_is_red(brother)) {
  317. rbtree_node_set_black(brother);
  318. rbtree_node_set_red(parent);
  319. rbtree_rotate(tree, parent, left);
  320. brother = parent->children[right];
  321. }
  322. assert(brother != NULL);
  323. /*
  324. * Brother has no red child. Recolor and repeat at parent.
  325. */
  326. if (((brother->children[RBTREE_LEFT] == NULL)
  327. || rbtree_node_is_black(brother->children[RBTREE_LEFT]))
  328. && ((brother->children[RBTREE_RIGHT] == NULL)
  329. || rbtree_node_is_black(brother->children[RBTREE_RIGHT]))) {
  330. rbtree_node_set_red(brother);
  331. child = parent;
  332. parent = rbtree_node_parent(child);
  333. continue;
  334. }
  335. /*
  336. * Brother's right child is black. Recolor and rotate right at brother.
  337. */
  338. if ((brother->children[right] == NULL)
  339. || rbtree_node_is_black(brother->children[right])) {
  340. rbtree_node_set_black(brother->children[left]);
  341. rbtree_node_set_red(brother);
  342. rbtree_rotate(tree, brother, right);
  343. brother = parent->children[right];
  344. }
  345. /*
  346. * Brother's left child is black. Exchange parent and brother colors
  347. * (we already know brother is black), set brother's right child black,
  348. * rotate left at parent and leave.
  349. */
  350. assert(brother->children[right] != NULL);
  351. rbtree_node_set_color(brother, rbtree_node_color(parent));
  352. rbtree_node_set_black(parent);
  353. rbtree_node_set_black(brother->children[right]);
  354. rbtree_rotate(tree, parent, left);
  355. break;
  356. }
  357. assert((tree->root == NULL) || rbtree_node_is_black(tree->root));
  358. }
  359. struct rbtree_node *
  360. rbtree_nearest(struct rbtree_node *parent, int index, int direction)
  361. {
  362. assert(rbtree_check_index(direction));
  363. if (parent == NULL) {
  364. return NULL;
  365. }
  366. assert(rbtree_check_index(index));
  367. if (index != direction) {
  368. return parent;
  369. }
  370. return rbtree_walk(parent, direction);
  371. }
  372. struct rbtree_node *
  373. rbtree_firstlast(const struct rbtree *tree, int direction)
  374. {
  375. struct rbtree_node *prev, *cur;
  376. assert(rbtree_check_index(direction));
  377. prev = NULL;
  378. for (cur = tree->root; cur != NULL; cur = cur->children[direction]) {
  379. prev = cur;
  380. }
  381. return prev;
  382. }
  383. struct rbtree_node *
  384. rbtree_walk(struct rbtree_node *node, int direction)
  385. {
  386. int left, right;
  387. assert(rbtree_check_index(direction));
  388. left = direction;
  389. right = 1 - left;
  390. if (node == NULL) {
  391. return NULL;
  392. }
  393. if (node->children[left] != NULL) {
  394. node = node->children[left];
  395. while (node->children[right] != NULL) {
  396. node = node->children[right];
  397. }
  398. } else {
  399. struct rbtree_node *parent;
  400. int index;
  401. for (;;) {
  402. parent = rbtree_node_parent(node);
  403. if (parent == NULL) {
  404. return NULL;
  405. }
  406. index = rbtree_node_index(node, parent);
  407. node = parent;
  408. if (index == right) {
  409. break;
  410. }
  411. }
  412. }
  413. return node;
  414. }
  415. struct rbtree_node *
  416. rbtree_postwalk_deepest(const struct rbtree *tree)
  417. {
  418. struct rbtree_node *node;
  419. node = tree->root;
  420. if (node == NULL) {
  421. return NULL;
  422. }
  423. return rbtree_node_find_deepest(node);
  424. }
  425. struct rbtree_node *
  426. rbtree_postwalk_unlink(struct rbtree_node *node)
  427. {
  428. struct rbtree_node *parent;
  429. int index;
  430. if (node == NULL) {
  431. return NULL;
  432. }
  433. assert(node->children[RBTREE_LEFT] == NULL);
  434. assert(node->children[RBTREE_RIGHT] == NULL);
  435. parent = rbtree_node_parent(node);
  436. if (parent == NULL) {
  437. return NULL;
  438. }
  439. index = rbtree_node_index(node, parent);
  440. parent->children[index] = NULL;
  441. node = parent->children[RBTREE_RIGHT];
  442. if (node == NULL) {
  443. return parent;
  444. }
  445. return rbtree_node_find_deepest(node);
  446. }