tree.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720
  1. // SPDX-FileCopyrightText: 2002 Niels Provos <provos@citi.umich.edu>
  2. // SPDX-License-Identifier: BSD-2-Clause
  3. /* $NetBSD: tree.h,v 1.8 2004/03/28 19:38:30 provos Exp $ */
  4. /* $OpenBSD: tree.h,v 1.7 2002/10/17 21:51:54 art Exp $ */
  5. /* $FreeBSD$ */
  6. #pragma once
  7. /*
  8. * This file defines data structures for red-black trees.
  9. *
  10. * A red-black tree is a binary search tree with the node color as an
  11. * extra attribute. It fulfills a set of conditions:
  12. * - every search path from the root to a leaf consists of the
  13. * same number of black nodes,
  14. * - each red node (except for the root) has a black parent,
  15. * - each leaf node is black.
  16. *
  17. * Every operation on a red-black tree is bounded as O(lg n).
  18. * The maximum height of a red-black tree is 2lg (n+1).
  19. */
  20. namespace Common::freebsd {
  21. enum class RBColor {
  22. RB_BLACK = 0,
  23. RB_RED = 1,
  24. };
  25. #pragma pack(push, 4)
  26. template <typename T>
  27. class RBEntry {
  28. public:
  29. constexpr RBEntry() = default;
  30. [[nodiscard]] constexpr T* Left() {
  31. return m_rbe_left;
  32. }
  33. [[nodiscard]] constexpr const T* Left() const {
  34. return m_rbe_left;
  35. }
  36. constexpr void SetLeft(T* e) {
  37. m_rbe_left = e;
  38. }
  39. [[nodiscard]] constexpr T* Right() {
  40. return m_rbe_right;
  41. }
  42. [[nodiscard]] constexpr const T* Right() const {
  43. return m_rbe_right;
  44. }
  45. constexpr void SetRight(T* e) {
  46. m_rbe_right = e;
  47. }
  48. [[nodiscard]] constexpr T* Parent() {
  49. return m_rbe_parent;
  50. }
  51. [[nodiscard]] constexpr const T* Parent() const {
  52. return m_rbe_parent;
  53. }
  54. constexpr void SetParent(T* e) {
  55. m_rbe_parent = e;
  56. }
  57. [[nodiscard]] constexpr bool IsBlack() const {
  58. return m_rbe_color == RBColor::RB_BLACK;
  59. }
  60. [[nodiscard]] constexpr bool IsRed() const {
  61. return m_rbe_color == RBColor::RB_RED;
  62. }
  63. [[nodiscard]] constexpr RBColor Color() const {
  64. return m_rbe_color;
  65. }
  66. constexpr void SetColor(RBColor c) {
  67. m_rbe_color = c;
  68. }
  69. private:
  70. T* m_rbe_left{};
  71. T* m_rbe_right{};
  72. T* m_rbe_parent{};
  73. RBColor m_rbe_color{RBColor::RB_BLACK};
  74. };
  75. #pragma pack(pop)
  76. template <typename T>
  77. struct CheckRBEntry {
  78. static constexpr bool value = false;
  79. };
  80. template <typename T>
  81. struct CheckRBEntry<RBEntry<T>> {
  82. static constexpr bool value = true;
  83. };
  84. template <typename T>
  85. concept IsRBEntry = CheckRBEntry<T>::value;
  86. template <typename T>
  87. concept HasRBEntry = requires(T& t, const T& ct) {
  88. { t.GetRBEntry() } -> std::same_as<RBEntry<T>&>;
  89. { ct.GetRBEntry() } -> std::same_as<const RBEntry<T>&>;
  90. };
  91. template <typename T>
  92. requires HasRBEntry<T>
  93. class RBHead {
  94. private:
  95. T* m_rbh_root = nullptr;
  96. public:
  97. [[nodiscard]] constexpr T* Root() {
  98. return m_rbh_root;
  99. }
  100. [[nodiscard]] constexpr const T* Root() const {
  101. return m_rbh_root;
  102. }
  103. constexpr void SetRoot(T* root) {
  104. m_rbh_root = root;
  105. }
  106. [[nodiscard]] constexpr bool IsEmpty() const {
  107. return this->Root() == nullptr;
  108. }
  109. };
  110. template <typename T>
  111. requires HasRBEntry<T>
  112. [[nodiscard]] constexpr RBEntry<T>& RB_ENTRY(T* t) {
  113. return t->GetRBEntry();
  114. }
  115. template <typename T>
  116. requires HasRBEntry<T>
  117. [[nodiscard]] constexpr const RBEntry<T>& RB_ENTRY(const T* t) {
  118. return t->GetRBEntry();
  119. }
  120. template <typename T>
  121. requires HasRBEntry<T>
  122. [[nodiscard]] constexpr T* RB_LEFT(T* t) {
  123. return RB_ENTRY(t).Left();
  124. }
  125. template <typename T>
  126. requires HasRBEntry<T>
  127. [[nodiscard]] constexpr const T* RB_LEFT(const T* t) {
  128. return RB_ENTRY(t).Left();
  129. }
  130. template <typename T>
  131. requires HasRBEntry<T>
  132. [[nodiscard]] constexpr T* RB_RIGHT(T* t) {
  133. return RB_ENTRY(t).Right();
  134. }
  135. template <typename T>
  136. requires HasRBEntry<T>
  137. [[nodiscard]] constexpr const T* RB_RIGHT(const T* t) {
  138. return RB_ENTRY(t).Right();
  139. }
  140. template <typename T>
  141. requires HasRBEntry<T>
  142. [[nodiscard]] constexpr T* RB_PARENT(T* t) {
  143. return RB_ENTRY(t).Parent();
  144. }
  145. template <typename T>
  146. requires HasRBEntry<T>
  147. [[nodiscard]] constexpr const T* RB_PARENT(const T* t) {
  148. return RB_ENTRY(t).Parent();
  149. }
  150. template <typename T>
  151. requires HasRBEntry<T>
  152. constexpr void RB_SET_LEFT(T* t, T* e) {
  153. RB_ENTRY(t).SetLeft(e);
  154. }
  155. template <typename T>
  156. requires HasRBEntry<T>
  157. constexpr void RB_SET_RIGHT(T* t, T* e) {
  158. RB_ENTRY(t).SetRight(e);
  159. }
  160. template <typename T>
  161. requires HasRBEntry<T>
  162. constexpr void RB_SET_PARENT(T* t, T* e) {
  163. RB_ENTRY(t).SetParent(e);
  164. }
  165. template <typename T>
  166. requires HasRBEntry<T>
  167. [[nodiscard]] constexpr bool RB_IS_BLACK(const T* t) {
  168. return RB_ENTRY(t).IsBlack();
  169. }
  170. template <typename T>
  171. requires HasRBEntry<T>
  172. [[nodiscard]] constexpr bool RB_IS_RED(const T* t) {
  173. return RB_ENTRY(t).IsRed();
  174. }
  175. template <typename T>
  176. requires HasRBEntry<T>
  177. [[nodiscard]] constexpr RBColor RB_COLOR(const T* t) {
  178. return RB_ENTRY(t).Color();
  179. }
  180. template <typename T>
  181. requires HasRBEntry<T>
  182. constexpr void RB_SET_COLOR(T* t, RBColor c) {
  183. RB_ENTRY(t).SetColor(c);
  184. }
  185. template <typename T>
  186. requires HasRBEntry<T>
  187. constexpr void RB_SET(T* elm, T* parent) {
  188. auto& rb_entry = RB_ENTRY(elm);
  189. rb_entry.SetParent(parent);
  190. rb_entry.SetLeft(nullptr);
  191. rb_entry.SetRight(nullptr);
  192. rb_entry.SetColor(RBColor::RB_RED);
  193. }
  194. template <typename T>
  195. requires HasRBEntry<T>
  196. constexpr void RB_SET_BLACKRED(T* black, T* red) {
  197. RB_SET_COLOR(black, RBColor::RB_BLACK);
  198. RB_SET_COLOR(red, RBColor::RB_RED);
  199. }
  200. template <typename T>
  201. requires HasRBEntry<T>
  202. constexpr void RB_ROTATE_LEFT(RBHead<T>& head, T* elm, T*& tmp) {
  203. tmp = RB_RIGHT(elm);
  204. if (RB_SET_RIGHT(elm, RB_LEFT(tmp)); RB_RIGHT(elm) != nullptr) {
  205. RB_SET_PARENT(RB_LEFT(tmp), elm);
  206. }
  207. if (RB_SET_PARENT(tmp, RB_PARENT(elm)); RB_PARENT(tmp) != nullptr) {
  208. if (elm == RB_LEFT(RB_PARENT(elm))) {
  209. RB_SET_LEFT(RB_PARENT(elm), tmp);
  210. } else {
  211. RB_SET_RIGHT(RB_PARENT(elm), tmp);
  212. }
  213. } else {
  214. head.SetRoot(tmp);
  215. }
  216. RB_SET_LEFT(tmp, elm);
  217. RB_SET_PARENT(elm, tmp);
  218. }
  219. template <typename T>
  220. requires HasRBEntry<T>
  221. constexpr void RB_ROTATE_RIGHT(RBHead<T>& head, T* elm, T*& tmp) {
  222. tmp = RB_LEFT(elm);
  223. if (RB_SET_LEFT(elm, RB_RIGHT(tmp)); RB_LEFT(elm) != nullptr) {
  224. RB_SET_PARENT(RB_RIGHT(tmp), elm);
  225. }
  226. if (RB_SET_PARENT(tmp, RB_PARENT(elm)); RB_PARENT(tmp) != nullptr) {
  227. if (elm == RB_LEFT(RB_PARENT(elm))) {
  228. RB_SET_LEFT(RB_PARENT(elm), tmp);
  229. } else {
  230. RB_SET_RIGHT(RB_PARENT(elm), tmp);
  231. }
  232. } else {
  233. head.SetRoot(tmp);
  234. }
  235. RB_SET_RIGHT(tmp, elm);
  236. RB_SET_PARENT(elm, tmp);
  237. }
  238. template <typename T>
  239. requires HasRBEntry<T>
  240. constexpr void RB_REMOVE_COLOR(RBHead<T>& head, T* parent, T* elm) {
  241. T* tmp;
  242. while ((elm == nullptr || RB_IS_BLACK(elm)) && elm != head.Root()) {
  243. if (RB_LEFT(parent) == elm) {
  244. tmp = RB_RIGHT(parent);
  245. if (RB_IS_RED(tmp)) {
  246. RB_SET_BLACKRED(tmp, parent);
  247. RB_ROTATE_LEFT(head, parent, tmp);
  248. tmp = RB_RIGHT(parent);
  249. }
  250. if ((RB_LEFT(tmp) == nullptr || RB_IS_BLACK(RB_LEFT(tmp))) &&
  251. (RB_RIGHT(tmp) == nullptr || RB_IS_BLACK(RB_RIGHT(tmp)))) {
  252. RB_SET_COLOR(tmp, RBColor::RB_RED);
  253. elm = parent;
  254. parent = RB_PARENT(elm);
  255. } else {
  256. if (RB_RIGHT(tmp) == nullptr || RB_IS_BLACK(RB_RIGHT(tmp))) {
  257. T* oleft;
  258. if ((oleft = RB_LEFT(tmp)) != nullptr) {
  259. RB_SET_COLOR(oleft, RBColor::RB_BLACK);
  260. }
  261. RB_SET_COLOR(tmp, RBColor::RB_RED);
  262. RB_ROTATE_RIGHT(head, tmp, oleft);
  263. tmp = RB_RIGHT(parent);
  264. }
  265. RB_SET_COLOR(tmp, RB_COLOR(parent));
  266. RB_SET_COLOR(parent, RBColor::RB_BLACK);
  267. if (RB_RIGHT(tmp)) {
  268. RB_SET_COLOR(RB_RIGHT(tmp), RBColor::RB_BLACK);
  269. }
  270. RB_ROTATE_LEFT(head, parent, tmp);
  271. elm = head.Root();
  272. break;
  273. }
  274. } else {
  275. tmp = RB_LEFT(parent);
  276. if (RB_IS_RED(tmp)) {
  277. RB_SET_BLACKRED(tmp, parent);
  278. RB_ROTATE_RIGHT(head, parent, tmp);
  279. tmp = RB_LEFT(parent);
  280. }
  281. if ((RB_LEFT(tmp) == nullptr || RB_IS_BLACK(RB_LEFT(tmp))) &&
  282. (RB_RIGHT(tmp) == nullptr || RB_IS_BLACK(RB_RIGHT(tmp)))) {
  283. RB_SET_COLOR(tmp, RBColor::RB_RED);
  284. elm = parent;
  285. parent = RB_PARENT(elm);
  286. } else {
  287. if (RB_LEFT(tmp) == nullptr || RB_IS_BLACK(RB_LEFT(tmp))) {
  288. T* oright;
  289. if ((oright = RB_RIGHT(tmp)) != nullptr) {
  290. RB_SET_COLOR(oright, RBColor::RB_BLACK);
  291. }
  292. RB_SET_COLOR(tmp, RBColor::RB_RED);
  293. RB_ROTATE_LEFT(head, tmp, oright);
  294. tmp = RB_LEFT(parent);
  295. }
  296. RB_SET_COLOR(tmp, RB_COLOR(parent));
  297. RB_SET_COLOR(parent, RBColor::RB_BLACK);
  298. if (RB_LEFT(tmp)) {
  299. RB_SET_COLOR(RB_LEFT(tmp), RBColor::RB_BLACK);
  300. }
  301. RB_ROTATE_RIGHT(head, parent, tmp);
  302. elm = head.Root();
  303. break;
  304. }
  305. }
  306. }
  307. if (elm) {
  308. RB_SET_COLOR(elm, RBColor::RB_BLACK);
  309. }
  310. }
  311. template <typename T>
  312. requires HasRBEntry<T>
  313. constexpr T* RB_REMOVE(RBHead<T>& head, T* elm) {
  314. T* child = nullptr;
  315. T* parent = nullptr;
  316. T* old = elm;
  317. RBColor color = RBColor::RB_BLACK;
  318. if (RB_LEFT(elm) == nullptr) {
  319. child = RB_RIGHT(elm);
  320. } else if (RB_RIGHT(elm) == nullptr) {
  321. child = RB_LEFT(elm);
  322. } else {
  323. T* left;
  324. elm = RB_RIGHT(elm);
  325. while ((left = RB_LEFT(elm)) != nullptr) {
  326. elm = left;
  327. }
  328. child = RB_RIGHT(elm);
  329. parent = RB_PARENT(elm);
  330. color = RB_COLOR(elm);
  331. if (child) {
  332. RB_SET_PARENT(child, parent);
  333. }
  334. if (parent) {
  335. if (RB_LEFT(parent) == elm) {
  336. RB_SET_LEFT(parent, child);
  337. } else {
  338. RB_SET_RIGHT(parent, child);
  339. }
  340. } else {
  341. head.SetRoot(child);
  342. }
  343. if (RB_PARENT(elm) == old) {
  344. parent = elm;
  345. }
  346. elm->SetRBEntry(old->GetRBEntry());
  347. if (RB_PARENT(old)) {
  348. if (RB_LEFT(RB_PARENT(old)) == old) {
  349. RB_SET_LEFT(RB_PARENT(old), elm);
  350. } else {
  351. RB_SET_RIGHT(RB_PARENT(old), elm);
  352. }
  353. } else {
  354. head.SetRoot(elm);
  355. }
  356. RB_SET_PARENT(RB_LEFT(old), elm);
  357. if (RB_RIGHT(old)) {
  358. RB_SET_PARENT(RB_RIGHT(old), elm);
  359. }
  360. if (parent) {
  361. left = parent;
  362. }
  363. if (color == RBColor::RB_BLACK) {
  364. RB_REMOVE_COLOR(head, parent, child);
  365. }
  366. return old;
  367. }
  368. parent = RB_PARENT(elm);
  369. color = RB_COLOR(elm);
  370. if (child) {
  371. RB_SET_PARENT(child, parent);
  372. }
  373. if (parent) {
  374. if (RB_LEFT(parent) == elm) {
  375. RB_SET_LEFT(parent, child);
  376. } else {
  377. RB_SET_RIGHT(parent, child);
  378. }
  379. } else {
  380. head.SetRoot(child);
  381. }
  382. if (color == RBColor::RB_BLACK) {
  383. RB_REMOVE_COLOR(head, parent, child);
  384. }
  385. return old;
  386. }
  387. template <typename T>
  388. requires HasRBEntry<T>
  389. constexpr void RB_INSERT_COLOR(RBHead<T>& head, T* elm) {
  390. T *parent = nullptr, *tmp = nullptr;
  391. while ((parent = RB_PARENT(elm)) != nullptr && RB_IS_RED(parent)) {
  392. T* gparent = RB_PARENT(parent);
  393. if (parent == RB_LEFT(gparent)) {
  394. tmp = RB_RIGHT(gparent);
  395. if (tmp && RB_IS_RED(tmp)) {
  396. RB_SET_COLOR(tmp, RBColor::RB_BLACK);
  397. RB_SET_BLACKRED(parent, gparent);
  398. elm = gparent;
  399. continue;
  400. }
  401. if (RB_RIGHT(parent) == elm) {
  402. RB_ROTATE_LEFT(head, parent, tmp);
  403. tmp = parent;
  404. parent = elm;
  405. elm = tmp;
  406. }
  407. RB_SET_BLACKRED(parent, gparent);
  408. RB_ROTATE_RIGHT(head, gparent, tmp);
  409. } else {
  410. tmp = RB_LEFT(gparent);
  411. if (tmp && RB_IS_RED(tmp)) {
  412. RB_SET_COLOR(tmp, RBColor::RB_BLACK);
  413. RB_SET_BLACKRED(parent, gparent);
  414. elm = gparent;
  415. continue;
  416. }
  417. if (RB_LEFT(parent) == elm) {
  418. RB_ROTATE_RIGHT(head, parent, tmp);
  419. tmp = parent;
  420. parent = elm;
  421. elm = tmp;
  422. }
  423. RB_SET_BLACKRED(parent, gparent);
  424. RB_ROTATE_LEFT(head, gparent, tmp);
  425. }
  426. }
  427. RB_SET_COLOR(head.Root(), RBColor::RB_BLACK);
  428. }
  429. template <typename T, typename Compare>
  430. requires HasRBEntry<T>
  431. constexpr T* RB_INSERT(RBHead<T>& head, T* elm, Compare cmp) {
  432. T* parent = nullptr;
  433. T* tmp = head.Root();
  434. int comp = 0;
  435. while (tmp) {
  436. parent = tmp;
  437. comp = cmp(elm, parent);
  438. if (comp < 0) {
  439. tmp = RB_LEFT(tmp);
  440. } else if (comp > 0) {
  441. tmp = RB_RIGHT(tmp);
  442. } else {
  443. return tmp;
  444. }
  445. }
  446. RB_SET(elm, parent);
  447. if (parent != nullptr) {
  448. if (comp < 0) {
  449. RB_SET_LEFT(parent, elm);
  450. } else {
  451. RB_SET_RIGHT(parent, elm);
  452. }
  453. } else {
  454. head.SetRoot(elm);
  455. }
  456. RB_INSERT_COLOR(head, elm);
  457. return nullptr;
  458. }
  459. template <typename T, typename Compare>
  460. requires HasRBEntry<T>
  461. constexpr T* RB_FIND(RBHead<T>& head, T* elm, Compare cmp) {
  462. T* tmp = head.Root();
  463. while (tmp) {
  464. const int comp = cmp(elm, tmp);
  465. if (comp < 0) {
  466. tmp = RB_LEFT(tmp);
  467. } else if (comp > 0) {
  468. tmp = RB_RIGHT(tmp);
  469. } else {
  470. return tmp;
  471. }
  472. }
  473. return nullptr;
  474. }
  475. template <typename T, typename Compare>
  476. requires HasRBEntry<T>
  477. constexpr T* RB_NFIND(RBHead<T>& head, T* elm, Compare cmp) {
  478. T* tmp = head.Root();
  479. T* res = nullptr;
  480. while (tmp) {
  481. const int comp = cmp(elm, tmp);
  482. if (comp < 0) {
  483. res = tmp;
  484. tmp = RB_LEFT(tmp);
  485. } else if (comp > 0) {
  486. tmp = RB_RIGHT(tmp);
  487. } else {
  488. return tmp;
  489. }
  490. }
  491. return res;
  492. }
  493. template <typename T, typename U, typename Compare>
  494. requires HasRBEntry<T>
  495. constexpr T* RB_FIND_KEY(RBHead<T>& head, const U& key, Compare cmp) {
  496. T* tmp = head.Root();
  497. while (tmp) {
  498. const int comp = cmp(key, tmp);
  499. if (comp < 0) {
  500. tmp = RB_LEFT(tmp);
  501. } else if (comp > 0) {
  502. tmp = RB_RIGHT(tmp);
  503. } else {
  504. return tmp;
  505. }
  506. }
  507. return nullptr;
  508. }
  509. template <typename T, typename U, typename Compare>
  510. requires HasRBEntry<T>
  511. constexpr T* RB_NFIND_KEY(RBHead<T>& head, const U& key, Compare cmp) {
  512. T* tmp = head.Root();
  513. T* res = nullptr;
  514. while (tmp) {
  515. const int comp = cmp(key, tmp);
  516. if (comp < 0) {
  517. res = tmp;
  518. tmp = RB_LEFT(tmp);
  519. } else if (comp > 0) {
  520. tmp = RB_RIGHT(tmp);
  521. } else {
  522. return tmp;
  523. }
  524. }
  525. return res;
  526. }
  527. template <typename T, typename Compare>
  528. requires HasRBEntry<T>
  529. constexpr T* RB_FIND_EXISTING(RBHead<T>& head, T* elm, Compare cmp) {
  530. T* tmp = head.Root();
  531. while (true) {
  532. const int comp = cmp(elm, tmp);
  533. if (comp < 0) {
  534. tmp = RB_LEFT(tmp);
  535. } else if (comp > 0) {
  536. tmp = RB_RIGHT(tmp);
  537. } else {
  538. return tmp;
  539. }
  540. }
  541. }
  542. template <typename T, typename U, typename Compare>
  543. requires HasRBEntry<T>
  544. constexpr T* RB_FIND_EXISTING_KEY(RBHead<T>& head, const U& key, Compare cmp) {
  545. T* tmp = head.Root();
  546. while (true) {
  547. const int comp = cmp(key, tmp);
  548. if (comp < 0) {
  549. tmp = RB_LEFT(tmp);
  550. } else if (comp > 0) {
  551. tmp = RB_RIGHT(tmp);
  552. } else {
  553. return tmp;
  554. }
  555. }
  556. }
  557. template <typename T>
  558. requires HasRBEntry<T>
  559. constexpr T* RB_NEXT(T* elm) {
  560. if (RB_RIGHT(elm)) {
  561. elm = RB_RIGHT(elm);
  562. while (RB_LEFT(elm)) {
  563. elm = RB_LEFT(elm);
  564. }
  565. } else {
  566. if (RB_PARENT(elm) && (elm == RB_LEFT(RB_PARENT(elm)))) {
  567. elm = RB_PARENT(elm);
  568. } else {
  569. while (RB_PARENT(elm) && (elm == RB_RIGHT(RB_PARENT(elm)))) {
  570. elm = RB_PARENT(elm);
  571. }
  572. elm = RB_PARENT(elm);
  573. }
  574. }
  575. return elm;
  576. }
  577. template <typename T>
  578. requires HasRBEntry<T>
  579. constexpr T* RB_PREV(T* elm) {
  580. if (RB_LEFT(elm)) {
  581. elm = RB_LEFT(elm);
  582. while (RB_RIGHT(elm)) {
  583. elm = RB_RIGHT(elm);
  584. }
  585. } else {
  586. if (RB_PARENT(elm) && (elm == RB_RIGHT(RB_PARENT(elm)))) {
  587. elm = RB_PARENT(elm);
  588. } else {
  589. while (RB_PARENT(elm) && (elm == RB_LEFT(RB_PARENT(elm)))) {
  590. elm = RB_PARENT(elm);
  591. }
  592. elm = RB_PARENT(elm);
  593. }
  594. }
  595. return elm;
  596. }
  597. template <typename T>
  598. requires HasRBEntry<T>
  599. constexpr T* RB_MIN(RBHead<T>& head) {
  600. T* tmp = head.Root();
  601. T* parent = nullptr;
  602. while (tmp) {
  603. parent = tmp;
  604. tmp = RB_LEFT(tmp);
  605. }
  606. return parent;
  607. }
  608. template <typename T>
  609. requires HasRBEntry<T>
  610. constexpr T* RB_MAX(RBHead<T>& head) {
  611. T* tmp = head.Root();
  612. T* parent = nullptr;
  613. while (tmp) {
  614. parent = tmp;
  615. tmp = RB_RIGHT(tmp);
  616. }
  617. return parent;
  618. }
  619. } // namespace Common::freebsd