62 template <
typename Data>
84 template <
typename... Args>
89 operator Data&() {
return data_; }
90 Node& operator=(
const Data& data)
95 Data* operator->() {
return &
data_; }
96 const Data* operator->()
const {
return &
data_; }
97 Data& operator*() {
return data_; }
120 template <
typename Data, SizeLimitMode LimitMode = SizeLimitMode::MORE>
129 result = ToDerivedType<Data, LimitMode>(found);
144 BaseNode *child =
nullptr, *parent =
nullptr;
150 while (replace->
left)
152 replace = replace->
left;
164 child = replace->
right;
166 color = replace->
color;
181 parent->left = child;
198 RbtreeDeleteFixup(child, parent);
215 (parent->left == &node ? parent->
left : parent->
right) = child;
224 RbtreeDeleteFixup(child, parent);
235 template <
typename KeyType>
240 node.
right =
nullptr;
243 node.
key = std::forward<KeyType>(key);
256 RbtreeGetNum(
root_, &count);
271 template <
typename Data,
typename Func, SizeLimitMode LimitMode = SizeLimitMode::MORE>
275 ErrorCode result = RbtreeForeachStart<Data>(
root_, func);
287 template <
typename Data>
295 while (result && result->
left)
300 else if (node->
right)
303 while (result && result->
left)
345 RbtreeInsertFixup(&node);
348 void RbtreeInsertFixup(BaseNode* node)
350 BaseNode *parent =
nullptr, *gparent =
nullptr;
352 while ((parent = node->parent) && parent->color ==
RbtColor::RED)
354 gparent = parent->parent;
356 if (parent == gparent->left)
358 BaseNode* uncle = gparent->right;
368 if (node == parent->right)
370 BaseNode* tmp =
nullptr;
371 RbtreeLeftRotate(parent);
379 RbtreeRightRotate(gparent);
383 BaseNode* uncle = gparent->left;
393 if (node == parent->left)
395 BaseNode* tmp =
nullptr;
396 RbtreeRightRotate(parent);
404 RbtreeLeftRotate(gparent);
410 void RbtreeLeftRotate(BaseNode* x)
417 BaseNode* y = x->right;
424 y->parent = x->parent;
432 if (x == x->parent->left)
438 x->parent->right = y;
446 void RbtreeRightRotate(BaseNode* y)
453 BaseNode* x = y->left;
457 x->right->parent = y;
460 x->parent = y->parent;
468 if (y == y->parent->right)
470 y->parent->right = x;
482 void RbtreeDeleteFixup(BaseNode* node, BaseNode* parent)
484 BaseNode* other =
nullptr;
488 if (parent->left == node)
490 other = parent->right;
495 RbtreeLeftRotate(parent);
496 other = parent->right;
503 parent = node->parent;
511 RbtreeRightRotate(other);
512 other = parent->right;
514 other->color = parent->color;
517 RbtreeLeftRotate(parent);
524 other = parent->left;
529 RbtreeRightRotate(parent);
530 other = parent->left;
537 parent = node->parent;
545 RbtreeLeftRotate(other);
546 other = parent->left;
548 other->color = parent->color;
551 RbtreeRightRotate(parent);
563 template <
typename Data,
typename Func>
564 ErrorCode RbtreeForeachStart(BaseNode* node, Func func)
568 return ErrorCode::OK;
572 RbtreeForeach<Data, Func>(
reinterpret_cast<Node<Data>*
>(node->left), func);
573 code != ErrorCode::OK)
578 if (ErrorCode code = func(*
reinterpret_cast<Node<Data>*
>(node));
579 code != ErrorCode::OK)
584 return RbtreeForeach<Data, Func>(
reinterpret_cast<Node<Data>*
>(node->right), func);
587 template <
typename Data,
typename Func>
588 ErrorCode RbtreeForeach(BaseNode* node, Func func)
592 return ErrorCode::OK;
596 RbtreeForeach<Data, Func>(
reinterpret_cast<Node<Data>*
>(node->left), func);
597 code != ErrorCode::OK)
602 if (ErrorCode code = func(*
reinterpret_cast<Node<Data>*
>(node));
603 code != ErrorCode::OK)
608 return RbtreeForeach<Data, Func>(
reinterpret_cast<Node<Data>*
>(node->right), func);
611 void RbtreeGetNum(BaseNode* node, uint32_t* count)
618 RbtreeGetNum(node->left, count);
619 RbtreeGetNum(node->right, count);
622 BaseNode*
Search(BaseNode* x,
const Key& key)
631 x = cmp < 0 ? x->left : x->right;
636 template <
typename Data, SizeLimitMode LimitMode>
637 static Node<Data>* ToDerivedType(BaseNode* node)
643 return static_cast<Node<Data>*
>(node);