21 template<
typename Value,
typename Comp>
35template<
typename Value,
typename Comp,
typename Tag,
typename Interface,
bool is_multi,
typename Self = Vo
id>
45 constexpr auto down_cast_self() ->
decltype(
auto) {
49 return static_cast<Self&
>(*this);
85 constexpr auto end() const -> ConstIterator {
return Iterator(
m_maximum,
true); }
91 if constexpr (!is_multi) {
93 return Tuple(Iterator(position.parent,
false),
false);
98 if constexpr (!is_multi) {
99 return Tuple(Iterator(util::addressof(node),
false),
true);
101 return Iterator(util::addressof(node),
false);
107 if constexpr (!is_multi) {
109 return Iterator(position.parent,
false);
114 return Iterator(util::addressof(node),
false);
117 constexpr auto erase_impl(ConstIterator position) -> Iterator {
121 auto& node = position.base().node();
124 Tag::did_remove(down_cast_self(),
static_cast<ConcreteNode&
>(node));
138 Node* result =
nullptr;
139 for (
auto* node =
m_root; node;) {
147 return result ? Iterator(result,
false) :
end();
153 Node* result =
nullptr;
154 for (
auto* node =
m_root; node;) {
162 return result ? Iterator(result,
false) :
end();
167 constexpr auto find_impl(U&& needle)
const -> ConstIterator {
168 for (
auto* node =
m_root; node;) {
171 return Iterator(node,
false);
184 *
this = util::move(other);
188 auto it = other.begin();
189 auto last = other.end();
194 if (!is_multi && position.parent &&
compare(position.parent->value, *save) == 0) {
206 constexpr auto node_value(Node
const& node)
const -> Value
const& {
207 return const_cast<RBTree&
>(*this).node_value(
const_cast<Node&
>(node));
224 if (y.left !=
nullptr) {
228 if (x.
parent ==
nullptr) {
245 if (y.
left !=
nullptr) {
249 if (y.
parent ==
nullptr) {
271 while (x !=
nullptr) {
276 if constexpr (!is_multi) {
301 Tag::did_insert(down_cast_self(),
static_cast<ConcreteNode&
>(to_insert));
306 if (position.
parent ==
nullptr) {
313 auto& parent = *position.
parent;
314 to_insert.
parent = &parent;
316 parent.left = &to_insert;
318 parent.right = &to_insert;
339 auto* uncle = grand_parent->left;
355 auto* uncle = grand_parent->right;
376 if (u.
parent ==
nullptr) {
390 auto* y = &to_delete;
391 auto y_color = y->
color;
403 if (to_delete.
left ==
nullptr) {
407 }
else if (to_delete.
right ==
nullptr) {
417 if (y->parent == &to_delete) {
423 y->right = to_delete.
right;
427 y->left = to_delete.
left;
508 template<
typename T,
typename U>
510 constexpr auto compare(T
const& a, U&& b)
const {
514 constexpr friend auto operator==(ConcreteSelf
const& a, ConcreteSelf
const& b) ->
bool
519 constexpr friend auto operator<=>(ConcreteSelf
const& a, ConcreteSelf
const& b)
#define DI_ASSERT(...)
Definition assert_bool.h:7
Definition const_iterator_impl.h:19
Definition rb_tree_iterator.h:10
constexpr void do_erase_rebalancing(Node *x)
Definition rb_tree.h:438
constexpr auto node_color(Node *node) const -> Node::Color
Definition rb_tree.h:211
constexpr void do_insert_node(InsertPosition position, Node &to_insert)
Definition rb_tree.h:304
Node * m_minimum
Definition rb_tree.h:526
constexpr void transplant(Node &u, Node *v)
Definition rb_tree.h:375
constexpr auto equal_range_impl(U &&needle) const
Definition rb_tree.h:131
constexpr friend auto operator==(ConcreteSelf const &a, ConcreteSelf const &b) -> bool requires(concepts::EqualityComparable< Value >)
Definition rb_tree.h:514
auto operator=(RBTree const &) -> RBTree &=delete
constexpr auto operator=(RBTree &&other) -> RBTree &
Definition rb_tree.h:67
constexpr auto lower_bound_impl(U &&needle) const -> ConstIterator
Definition rb_tree.h:137
Comp m_comparator
Definition rb_tree.h:529
constexpr auto find_impl(U &&needle) const -> ConstIterator
Definition rb_tree.h:167
constexpr auto begin() -> Iterator
Definition rb_tree.h:82
constexpr auto insert_node(Node &node)
Definition rb_tree.h:89
constexpr auto compare(T const &a, U &&b) const
Definition rb_tree.h:510
constexpr void merge_impl(RBTree &&other)
Definition rb_tree.h:182
constexpr auto size() const -> usize
Definition rb_tree.h:79
constexpr friend auto operator<=>(ConcreteSelf const &a, ConcreteSelf const &b)
Definition rb_tree.h:519
usize m_size
Definition rb_tree.h:528
constexpr auto upper_bound_impl(U &&needle) const -> ConstIterator
Definition rb_tree.h:152
constexpr auto empty() const -> bool
Definition rb_tree.h:80
constexpr RBTree(Comp comparator)
Definition rb_tree.h:58
constexpr ~RBTree()
Definition rb_tree.h:77
constexpr RBTree(RBTree &&other)
Definition rb_tree.h:60
Node * m_root
Definition rb_tree.h:525
constexpr auto end() -> Iterator
Definition rb_tree.h:84
constexpr auto insert_position(U &&needle) const -> InsertPosition
Definition rb_tree.h:267
constexpr auto erase_impl(ConstIterator position) -> Iterator
Definition rb_tree.h:117
constexpr auto end() const -> ConstIterator
Definition rb_tree.h:85
constexpr auto begin() const -> ConstIterator
Definition rb_tree.h:83
constexpr auto compare(Node const &a, Node const &b) const
Definition rb_tree.h:506
constexpr auto insert_node(ConstIterator, Node &node)
Definition rb_tree.h:105
constexpr void insert_node(InsertPosition position, Node &to_insert)
Definition rb_tree.h:298
constexpr auto unconst_iterator(ConstIterator it) -> Iterator
Definition rb_tree.h:87
constexpr void erase_node(Node &to_delete)
Definition rb_tree.h:388
constexpr void rotate_left(Node &x)
Definition rb_tree.h:219
constexpr auto node_value(Node const &node) const -> Value const &
Definition rb_tree.h:206
RBTree(RBTree const &)=delete
constexpr void do_insert_rebalancing(Node *node)
Definition rb_tree.h:334
Node * m_maximum
Definition rb_tree.h:527
constexpr auto node_value(Node &node) const -> Value &
Definition rb_tree.h:203
constexpr void rotate_right(Node &y)
Definition rb_tree.h:240
Definition tuple_forward_declaration.h:5
constexpr auto next
Definition next.h:35
constexpr auto equal
Definition equal.h:46
constexpr auto compare
Definition compare.h:40
constexpr auto invoke
Definition invoke.h:100
size_t usize
Definition integers.h:33
constexpr auto exchange(T &object, U &&new_value) -> T
Definition exchange.h:8
constexpr auto exchange(T &object, U &&new_value) -> T
Definition exchange.h:8
constexpr auto in_place_type
Definition in_place_type.h:12
Definition rb_tree_node.h:9
constexpr auto successor() const -> RBTreeNode *
Definition rb_tree_node.h:48
constexpr auto is_right_child() const -> bool
Definition rb_tree_node.h:16
constexpr auto predecessor() const -> RBTreeNode *
Definition rb_tree_node.h:34
RBTreeNode * right
Definition rb_tree_node.h:65
RBTreeNode * left
Definition rb_tree_node.h:64
constexpr auto is_left_child() const -> bool
Definition rb_tree_node.h:15
RBTreeNode * parent
Definition rb_tree_node.h:63
Color
Definition rb_tree_node.h:11
@ Black
Definition rb_tree_node.h:11
@ Red
Definition rb_tree_node.h:11
Color color
Definition rb_tree_node.h:62
bool left
Definition rb_tree.h:262
Node * parent
Definition rb_tree.h:261
static constexpr bool value
Definition rb_tree.h:25