36 template<
typename K_TYPE,
38 typename ALLOC = allocator<K_TYPE>,
39 typename Compare = increaseComparator<K_TYPE>>
55 enum class color { BLACK, RED };
75 color color = color::RED, RBNode* parent =
nullptr, RBNode* left =
nullptr, RBNode* right =
nullptr);
78 RBNode(
const RBNode& other);
84 RBNode(RBNode&& other)
noexcept;
90 void swapData(RBNode& other)
noexcept;
102 couple<const K_TYPE, V_TYPE>&
getVal();
108 const couple<const K_TYPE, V_TYPE>&
getVal()
const;
114 const K_TYPE&
getKey()
const;
200 static void connect(RBNode* parent, RBNode* child,
bool is_left);
349 RBNode* left =
nullptr, RBNode* right =
nullptr)
const;
357 RBNode*
createNode(RBNode&& other_node)
const;
382 bool highPriority(
const K_TYPE& key, RBNode* other)
const;
424 explicit RBTree(Compare compare = Compare{});
432 RBNode*
find(
const K_TYPE& key)
const;
440 bool modify(
const K_TYPE& key,
const V_TYPE& value);
449 bool insert(
const K_TYPE& key,
const V_TYPE& value);
457 bool erase(
const K_TYPE& key);
468template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
473template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
478template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
484 this->data_ =
other.data_;
485 this->color_ =
other.color_;
486 this->parent_ =
other.parent_;
487 this->left_ =
other.left_;
488 this->right_ =
other.right_;
492template <
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
494 : data_(std::move(
other.data_)), color_(
other.color_), parent_(
nullptr), left_(
nullptr), right_(
nullptr) {}
497template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
502template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
507template <
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
514template <
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
521template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
523 return this->data_.first();
526template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
528 return this->data_.second();
531template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
533 return this->data_.second();
536template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
538 this->data_.template
set<1>(value);
541template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
547template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
550 return this->parent_;
553template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
559template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
565template <
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
572template <
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
579template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
584template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
589template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
594template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
599template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
610template <
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
614template <
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
619template <
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
626 this->tree_ =
other.tree_;
627 this->cur_ =
other.cur_;
631template <
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
634 return this->cur_ && this->tree_->getSuccessorNode(this->cur_);
637template <
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
640 return this->cur_ && this->tree_->getPrecursorNode(this->cur_);
643template <
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
646 this->cur_ = this->tree_->getSuccessorNode(this->cur_);
649template <
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
652 this->cur_ = this->tree_->getPrecursorNode(this->cur_);
655template <
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
659 this->operator-=(-
steps);
667template <
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
671 this->operator+=(-
steps);
679template <
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
682 if (!this->isValid()) {
686 return this->cur_->getVal();
689template <
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
692 if (!this->isValid()) {
696 return this->cur_->getVal();
699template <
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
706template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
717 while (!
src.empty()){
742template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
748 if (
cur->getPLeft()) {
750 while (
cur->getPRight()) {
764template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
770 if (
cur->getPRight()) {
772 while (
cur->getPLeft()) {
786template <
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
790 if (!
root_)
return nullptr;
793 while (
node->getPLeft()) {
799template <
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
814template <
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
831template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
841template <
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
850template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
856template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
864template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
872template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
886template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
900template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
916 rotated_root = this->
rotateLeft(grand_parent);
917 this->
root_ = rotated_root;
935 this->
root_ = rotated_root;
959template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
1095template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
1102 while (!queue.empty()) {
1104 if (
node->getPLeft()) {
1107 if (
node->getPRight()) {
1112 this->
root_ =
nullptr;
1115template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
1119template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
1122 auto cur = this->root_;
1124 if (
cur->getKey() ==
key){
1127 cur = this->highPriority(
key,
cur) ?
cur->getPLeft() :
cur->getPRight();
1132template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
1134 if (
auto cur = this->
find(key)){
1135 cur->setValue(value);
1141template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
1143 auto**
cur = &this->root_;
1148 if ((*cur)->getKey() ==
key) {
1153 cur =
is_left ? &(*cur)->getPLeftRef() : &(*cur)->getPRightRef();
1158 this->root_ =
child;
1164 this->adjustInsert(
child);
1168template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
1179 if (
cur->getPLeft() &&
cur->getPRight()) {
1181 this->getPrecursorNode(
cur) : this->getSuccessorNode(
cur);
1186 if (
cur->getPLeft() && !
cur->getPRight()) {
1188 this->root_ =
cur->getPLeft();
1189 RBNode::connect(
nullptr, this->root_,
true);
1190 this->root_->setColor(BLACK);
1194 RBNode::connect(
nullptr,
cur,
true);
1195 cur->getPLeft()->setColor(BLACK);
1197 }
else if (!
cur->getPLeft() &&
cur->getPRight()) {
1199 this->root_ =
cur->getPRight();
1200 RBNode::connect(
nullptr, this->root_,
true);
1201 this->root_->setColor(BLACK);
1205 RBNode::connect(
nullptr,
cur,
true);
1206 cur->getPRight()->setColor(BLACK);
1210 this->root_ =
nullptr;
1211 }
else if (
cur->getColor() == BLACK) {
1212 this->adjustErase(
cur);
1214 RBNode::connect(
nullptr,
cur,
true);
1218 if (
cur->getPParent()) {
1219 RBNode::connect(
cur->getPParent(),
nullptr,
cur->getPParent()->getPLeft() ==
cur);
1221 this->destroyNode(
cur);
1226template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
1228 this->destroyTree();
Memory allocation interface and implementations.
Bidirectional iterator for RBTree.
Definition RBTree.h:219
Iterator & operator=(const Iterator &other)
Copy assignment operator.
Definition RBTree.h:621
Iterator(RBTree *tree=nullptr, RBNode *cur=nullptr)
Constructs iterator.
Definition RBTree.h:611
bool hasPrev() const
Checks if more elements exist backward.
Definition RBTree.h:638
void operator-=(integer steps) const
Moves iterator backward by steps.
Definition RBTree.h:668
bool hasNext() const
Checks if more elements exist forward.
Definition RBTree.h:632
bool isValid() const
Checks if iterator is valid.
Definition RBTree.h:700
couple< const K_TYPE, V_TYPE > & get()
Gets current element (non-const)
Definition RBTree.h:680
RBNode * cur_
Current node.
Definition RBTree.h:222
void operator+=(integer steps) const
Advances iterator by steps.
Definition RBTree.h:656
void prev() const
Moves to previous element.
Definition RBTree.h:650
void next() const
Moves to next element.
Definition RBTree.h:644
RBTree * tree_
Owning tree.
Definition RBTree.h:221
Internal node class for Red-Black Tree.
Definition RBTree.h:51
const V_TYPE & getValue() const
Gets value (const)
Definition RBTree.h:527
color
Node color enumeration.
Definition RBTree.h:55
RBNode *& getPRightRef()
Gets right child reference.
Definition RBTree.h:574
RBNode * getPLeft() const
Gets left child.
Definition RBTree.h:555
void setPLeft(RBNode *new_left)
Sets left child.
Definition RBTree.h:590
RBNode & operator=(const RBNode &other)
Copy assignment operator.
Definition RBTree.h:480
void setValue(const V_TYPE &value)
Sets new value.
Definition RBTree.h:537
color getColor() const
Gets node color.
Definition RBTree.h:543
const K_TYPE & getKey() const
Gets key.
Definition RBTree.h:522
void setPRight(RBNode *new_right)
Sets right child.
Definition RBTree.h:595
void swapColor(RBNode &other) noexcept
Swaps color with another node.
Definition RBTree.h:503
void setPParent(RBNode *new_parent)
Sets parent node.
Definition RBTree.h:585
void swapData(RBNode &other) noexcept
Swaps data with another node.
Definition RBTree.h:498
RBNode *& getPLeftRef()
Gets left child reference.
Definition RBTree.h:567
couple< const K_TYPE, V_TYPE > & getVal()
Gets key-value pair (non-const)
Definition RBTree.h:509
RBNode * getPRight() const
Gets right child.
Definition RBTree.h:561
void setColor(color new_color)
Sets node color.
Definition RBTree.h:580
RBNode * getPParent() const
Gets parent node.
Definition RBTree.h:549
static void connect(RBNode *parent, RBNode *child, bool is_left)
Connects parent and child nodes.
Definition RBTree.h:600
RBNode(const K_TYPE &key=K_TYPE{}, const V_TYPE &value=V_TYPE{}, color color=color::RED, RBNode *parent=nullptr, RBNode *left=nullptr, RBNode *right=nullptr)
Constructs a new RBNode.
Definition RBTree.h:469
Red-Black Tree container implementation.
Definition RBTree.h:40
~RBTree()
Destructor.
Definition RBTree.h:1227
bool insert(const K_TYPE &key, const V_TYPE &value)
Inserts new key-value pair.
Definition RBTree.h:1142
typename RBNode::color color
Color type alias.
Definition RBTree.h:203
RBNode * rotateRight(RBNode *cur)
Performs right rotation around a node.
Definition RBTree.h:888
RBTree(Compare compare=Compare{})
Constructs RBTree with given comparison function.
Definition RBTree.h:1116
RBNode * getMaxNode() const
Gets the maximum node in the tree.
Definition RBTree.h:801
bool highPriority(RBNode *cur, RBNode *other) const
Compares priority between two nodes.
Definition RBTree.h:857
RBNode * root_
Root node pointer.
Definition RBTree.h:208
static constexpr color BLACK
Black color constant.
Definition RBTree.h:204
void destroyTree() noexcept
Destroys entire tree and deallocates all nodes.
Definition RBTree.h:1096
rebind_alloc_node rebind_alloc
Node allocator.
Definition RBTree.h:211
RBNode * getSuccessorNode(RBNode *cur) const
Gets successor node (in-order successor)
Definition RBTree.h:766
void adjustErase(RBNode *cur)
Adjusts tree after deletion to maintain RB properties.
Definition RBTree.h:960
RBNode * rotateLeft(RBNode *cur)
Performs left rotation around a node.
Definition RBTree.h:874
RBNode * replaceNode(RBNode *src, RBNode *tar)
Replaces one node with another while maintaining tree structure.
Definition RBTree.h:816
u_integer size_
Number of elements.
Definition RBTree.h:209
RBNode * createNode(const K_TYPE &key=K_TYPE{}, const V_TYPE &value=V_TYPE{}, color color=RED, RBNode *parent=nullptr, RBNode *left=nullptr, RBNode *right=nullptr) const
Creates a new node with given parameters.
Definition RBTree.h:833
bool erase(const K_TYPE &key)
Erases node with given key.
Definition RBTree.h:1169
RBNode * treeCopy() const
Creates a deep copy of the tree.
Definition RBTree.h:708
RBNode * getPrecursorNode(RBNode *cur) const
Gets precursor node (in-order predecessor)
Definition RBTree.h:744
typename ALLOC::template rebind_alloc< RBNode > rebind_alloc_node
Rebound allocator type.
Definition RBTree.h:206
void destroyNode(RBNode *node) noexcept
Destroys a node and deallocates memory.
Definition RBTree.h:851
RBNode * find(const K_TYPE &key) const
Finds node with given key.
Definition RBTree.h:1121
Compare compare_
Comparison function.
Definition RBTree.h:210
RBNode * getMinNode() const
Gets the minimum node in the tree.
Definition RBTree.h:788
void adjustInsert(RBNode *cur)
Adjusts tree after insertion to maintain RB properties.
Definition RBTree.h:901
static constexpr color RED
Red color constant.
Definition RBTree.h:205
bool modify(const K_TYPE &key, const V_TYPE &value)
Modifies value for existing key.
Definition RBTree.h:1133
Exception for container index out-of-range errors.
Definition error.h:192
Unique ownership smart pointer with move semantics.
Definition ownerPtr.h:37
First-In-First-Out (FIFO) container adapter.
Definition queue.h:35
TYPE head() const
Accesses front element of the queue.
Definition queue.h:195
void push(const TYPE &e)
Inserts element at the back of the queue.
Definition queue.h:181
Comparator base class and concrete comparator classes.
Combines Comparable and CallbackOf for comparison callbacks.
Definition types.h:377
Generic pair container implementation.
std::uint32_t u_integer
32-bit unsigned integer type for sizes and indexes
Definition config.h:263
std::int64_t integer
64-bit signed integer type for arithmetic operations
Definition config.h:254
Main namespace for the project Original.
Definition algorithms.h:21
TYPE find(coroutine::generator< TYPE > gen, Callback &&c)
Finds the first element satisfying a predicate.
Definition generators.h:863
Standard namespace extensions for original::alternative.
Definition allocator.h:351
void swap(original::objPoolAllocator< TYPE > &lhs, original::objPoolAllocator< TYPE > &rhs) noexcept
Specialization of std::swap for objPoolAllocator.
Definition allocator.h:635
Queue container adapter implementation.