61 template <
typename Data>
83 template <
typename... Args>
88 operator Data&() {
return data_; }
89 Node& operator=(
const Data& data)
94 Data* operator->() {
return &
data_; }
95 const Data* operator->()
const {
return &
data_; }
96 Data& operator*() {
return data_; }
119 template <
typename Data, SizeLimitMode LimitMode = SizeLimitMode::MORE>
128 result = ToDerivedType<Data, LimitMode>(found);
143 BaseNode *child =
nullptr, *parent =
nullptr;
149 while (replace->
left)
151 replace = replace->
left;
163 child = replace->
right;
165 color = replace->
color;
180 parent->left = child;
197 RbtreeDeleteFixup(child, parent);
214 (parent->left == &node ? parent->
left : parent->
right) = child;
223 RbtreeDeleteFixup(child, parent);
234 template <
typename KeyType>
239 node.
right =
nullptr;
242 node.
key = std::forward<KeyType>(key);
255 RbtreeGetNum(
root_, &count);
270 template <
typename Data,
typename Func, SizeLimitMode LimitMode = SizeLimitMode::MORE>
286 template <
typename Data>
294 while (result && result->
left)
299 else if (node->
right)
302 while (result && result->
left)
344 RbtreeInsertFixup(&node);
347 void RbtreeInsertFixup(BaseNode* node)
349 BaseNode *parent =
nullptr, *gparent =
nullptr;
351 while ((parent = node->parent) && parent->color ==
RbtColor::RED)
353 gparent = parent->parent;
355 if (parent == gparent->left)
357 BaseNode* uncle = gparent->right;
367 if (node == parent->right)
369 BaseNode* tmp =
nullptr;
370 RbtreeLeftRotate(parent);
378 RbtreeRightRotate(gparent);
382 BaseNode* uncle = gparent->left;
392 if (node == parent->left)
394 BaseNode* tmp =
nullptr;
395 RbtreeRightRotate(parent);
403 RbtreeLeftRotate(gparent);
409 void RbtreeLeftRotate(BaseNode* x)
416 BaseNode* y = x->right;
423 y->parent = x->parent;
431 if (x == x->parent->left)
437 x->parent->right = y;
445 void RbtreeRightRotate(BaseNode* y)
452 BaseNode* x = y->left;
456 x->right->parent = y;
459 x->parent = y->parent;
467 if (y == y->parent->right)
469 y->parent->right = x;
481 void RbtreeDeleteFixup(BaseNode* node, BaseNode* parent)
483 BaseNode* other =
nullptr;
487 if (parent->left == node)
489 other = parent->right;
494 RbtreeLeftRotate(parent);
495 other = parent->right;
502 parent = node->parent;
510 RbtreeRightRotate(other);
511 other = parent->right;
513 other->color = parent->color;
516 RbtreeLeftRotate(parent);
523 other = parent->left;
528 RbtreeRightRotate(parent);
529 other = parent->left;
536 parent = node->parent;
544 RbtreeLeftRotate(other);
545 other = parent->left;
547 other->color = parent->color;
550 RbtreeRightRotate(parent);
562 template <
typename Data,
typename Func>
563 ErrorCode RbtreeForeachStart(BaseNode* node, Func func)
571 RbtreeForeach<Data, Func>(
reinterpret_cast<Node<Data>*
>(node->left), func);
577 if (
ErrorCode code = func(*
reinterpret_cast<Node<Data>*
>(node));
583 return RbtreeForeach<Data, Func>(
reinterpret_cast<Node<Data>*
>(node->right), func);
586 template <
typename Data,
typename Func>
587 ErrorCode RbtreeForeach(BaseNode* node, Func func)
595 RbtreeForeach<Data, Func>(
reinterpret_cast<Node<Data>*
>(node->left), func);
601 if (
ErrorCode code = func(*
reinterpret_cast<Node<Data>*
>(node));
607 return RbtreeForeach<Data, Func>(
reinterpret_cast<Node<Data>*
>(node->right), func);
610 void RbtreeGetNum(BaseNode* node, uint32_t* count)
617 RbtreeGetNum(node->left, count);
618 RbtreeGetNum(node->right, count);
621 BaseNode*
Search(BaseNode* x,
const Key& key)
630 x = cmp < 0 ? x->left : x->right;
635 template <
typename Data, SizeLimitMode LimitMode>
636 static Node<Data>* ToDerivedType(BaseNode* node)
642 return static_cast<Node<Data>*
>(node);