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_; }
107 explicit RBTree(
int (*compare_fun)(
const Key &,
const Key &))
121 template <
typename Data, SizeLimitMode LimitMode = SizeLimitMode::MORE>
130 result = ToDerivedType<Data, LimitMode>(found);
145 BaseNode *child =
nullptr, *parent =
nullptr;
151 while (replace->
left)
153 replace = replace->
left;
165 child = replace->
right;
167 color = replace->
color;
182 parent->left = child;
199 RbtreeDeleteFixup(child, parent);
216 (parent->left == &node ? parent->
left : parent->
right) = child;
225 RbtreeDeleteFixup(child, parent);
236 template <
typename KeyType>
241 node.
right =
nullptr;
244 node.
key = std::forward<KeyType>(key);
257 RbtreeGetNum(
root_, &count);
272 template <
typename Data,
typename Func, SizeLimitMode LimitMode = SizeLimitMode::MORE>
276 ErrorCode result = RbtreeForeachStart<Data>(
root_, func);
288 template <
typename Data>
296 while (result && result->
left)
301 else if (node->
right)
304 while (result && result->
left)
346 RbtreeInsertFixup(&node);
349 void RbtreeInsertFixup(BaseNode *node)
351 BaseNode *parent =
nullptr, *gparent =
nullptr;
353 while ((parent = node->parent) && parent->color ==
RbtColor::RED)
355 gparent = parent->parent;
357 if (parent == gparent->left)
359 BaseNode *uncle = gparent->right;
369 if (node == parent->right)
371 BaseNode *tmp =
nullptr;
372 RbtreeLeftRotate(parent);
380 RbtreeRightRotate(gparent);
384 BaseNode *uncle = gparent->left;
394 if (node == parent->left)
396 BaseNode *tmp =
nullptr;
397 RbtreeRightRotate(parent);
405 RbtreeLeftRotate(gparent);
411 void RbtreeLeftRotate(BaseNode *x)
418 BaseNode *y = x->right;
425 y->parent = x->parent;
433 if (x == x->parent->left)
439 x->parent->right = y;
447 void RbtreeRightRotate(BaseNode *y)
454 BaseNode *x = y->left;
458 x->right->parent = y;
461 x->parent = y->parent;
469 if (y == y->parent->right)
471 y->parent->right = x;
483 void RbtreeDeleteFixup(BaseNode *node, BaseNode *parent)
485 BaseNode *other =
nullptr;
489 if (parent->left == node)
491 other = parent->right;
496 RbtreeLeftRotate(parent);
497 other = parent->right;
504 parent = node->parent;
512 RbtreeRightRotate(other);
513 other = parent->right;
515 other->color = parent->color;
518 RbtreeLeftRotate(parent);
525 other = parent->left;
530 RbtreeRightRotate(parent);
531 other = parent->left;
538 parent = node->parent;
546 RbtreeLeftRotate(other);
547 other = parent->left;
549 other->color = parent->color;
552 RbtreeRightRotate(parent);
564 template <
typename Data,
typename Func>
565 ErrorCode RbtreeForeachStart(BaseNode *node, Func func)
569 return ErrorCode::OK;
573 RbtreeForeach<Data, Func>(
reinterpret_cast<Node<Data> *
>(node->left), func);
574 code != ErrorCode::OK)
579 if (ErrorCode code = func(*
reinterpret_cast<Node<Data> *
>(node));
580 code != ErrorCode::OK)
585 return RbtreeForeach<Data, Func>(
reinterpret_cast<Node<Data> *
>(node->right), func);
588 template <
typename Data,
typename Func>
589 ErrorCode RbtreeForeach(BaseNode *node, Func func)
593 return ErrorCode::OK;
597 RbtreeForeach<Data, Func>(
reinterpret_cast<Node<Data> *
>(node->left), func);
598 code != ErrorCode::OK)
603 if (ErrorCode code = func(*
reinterpret_cast<Node<Data> *
>(node));
604 code != ErrorCode::OK)
609 return RbtreeForeach<Data, Func>(
reinterpret_cast<Node<Data> *
>(node->right), func);
612 void RbtreeGetNum(BaseNode *node, uint32_t *count)
619 RbtreeGetNum(node->left, count);
620 RbtreeGetNum(node->right, count);
623 BaseNode *
Search(BaseNode *x,
const Key &key)
632 x = cmp < 0 ? x->left : x->right;
637 template <
typename Data, SizeLimitMode LimitMode>
638 static Node<Data> *ToDerivedType(BaseNode *node)
644 return static_cast<Node<Data> *
>(node);