36 template<
typename K_TYPE,
55 enum class color { BLACK, RED };
74 explicit RBNode(
const K_TYPE& key = K_TYPE{},
const V_TYPE& value = V_TYPE{},
347 RBNode*
createNode(
const K_TYPE& key = K_TYPE{},
const V_TYPE& value = V_TYPE{},
349 RBNode* left =
nullptr, RBNode* right =
nullptr)
const;
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);
468template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
471 : data_({key, value}), color_(
color), parent_(parent), left_(left), right_(right) {}
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>
499 std::swap(this->data_, other.data_);
502template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
504 std::swap(this->color_, other.color_);
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>
581 this->color_ = new_color;
584template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
586 this->parent_ = new_parent;
589template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
591 this->left_ = new_left;
594template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
596 this->right_ = new_right;
599template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
601 RBNode* child,
bool is_left) {
603 is_left ? parent->left_ = child : parent->right_ = child;
606 child->parent_ = parent;
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>
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>
649template <
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
655template <
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
661 for (
integer i = 0; i < steps; ++i) {
667template <
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
673 for (
integer i = 0; i < steps; ++i) {
679template <
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
686 return this->
cur_->getVal();
689template <
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
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>
714 this->
createNode(this->
root_->getKey(), this->root_->getValue(), this->root_->getColor());
717 while (!src.
empty()){
742template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
757 while (parent && cur == parent->
getPLeft()) {
764template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
779 while (parent && cur == parent->
getPRight()) {
786template <
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
790 if (!
root_)
return nullptr;
799template <
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
814template <
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
818 auto moved_src = this->
createNode(std::move(*src));
819 moved_src->setColor(tar->
getColor());
823 this->
root_ = moved_src;
831template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
841template <
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
846 this->
rebind_alloc.construct(node, std::move(other_node));
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>
889 RBNode* child_right = cur;
900template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
909 if (grand_parent->
getPLeft() == uncle) {
915 if (grand_parent == this->
root_) {
916 rotated_root = this->
rotateLeft(grand_parent);
917 this->
root_ = rotated_root;
921 bool is_left = grand_grand->
getPLeft() == grand_parent;
922 rotated_root = this->
rotateLeft(grand_parent);
933 if (grand_parent == this->
root_) {
935 this->
root_ = rotated_root;
939 bool is_left = grand_grand->
getPLeft() == grand_parent;
959template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
973 bool is_left = grand_parent->
getPLeft() == parent;
988 bool is_left = grand_parent->
getPLeft() == parent;
1004 bool is_left = grand_parent->
getPLeft() == parent;
1034 bool is_left = grand_parent->
getPLeft() == parent;
1049 bool is_left = grand_parent->
getPLeft() == parent;
1065 bool is_left = grand_parent->
getPLeft() == parent;
1095template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
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_;
1144 RBNode* parent =
nullptr;
1145 bool is_left =
false;
1148 if ((*cur)->getKey() == key) {
1153 cur = is_left ? &(*cur)->getPLeftRef() : &(*cur)->getPRightRef();
1158 this->
root_ = child;
1168template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
1174 auto cur = this->
find(key);
1179 if (cur->getPLeft() && cur->getPRight()) {
1186 if (cur->getPLeft() && !cur->getPRight()) {
1188 this->
root_ = cur->getPLeft();
1192 bool is_left = parent->
getPLeft() == cur;
1195 cur->getPLeft()->setColor(
BLACK);
1197 }
else if (!cur->getPLeft() && cur->getPRight()) {
1199 this->
root_ = cur->getPRight();
1203 bool is_left = parent->
getPLeft() == cur;
1206 cur->getPRight()->setColor(
BLACK);
1210 this->
root_ =
nullptr;
1211 }
else if (cur->getColor() ==
BLACK) {
1218 if (cur->getPParent()) {
1219 RBNode::connect(cur->getPParent(),
nullptr, cur->getPParent()->getPLeft() == cur);
1226template<
typename K_TYPE,
typename V_TYPE,
typename ALLOC,
typename Compare>
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
~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_
Definition RBTree.h:208
static constexpr color BLACK
Definition RBTree.h:204
void destroyTree() noexcept
Destroys entire tree and deallocates all nodes.
Definition RBTree.h:1096
rebind_alloc_node rebind_alloc
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
bool highPriority(const K_TYPE &key, RBNode *other) const
Compares priority between a key and a node.
Definition RBTree.h:865
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_
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 * createNode(RBNode &&other_node) const
Creates a new node by moving from another node.
Definition RBTree.h:843
RBNode * getPrecursorNode(RBNode *cur) const
Gets precursor node (in-order predecessor)
Definition RBTree.h:744
typename ALLOC::template rebind_alloc< RBNode > rebind_alloc_node
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_
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
Definition RBTree.h:205
bool modify(const K_TYPE &key, const V_TYPE &value)
Modifies value for existing key.
Definition RBTree.h:1133
Default memory allocator using allocators utilities.
Definition allocator.h:154
bool empty() const
Checks if the container is empty.
Definition container.h:155
Container for two heterogeneous elements.
Definition couple.h:37
F_TYPE & first()
Access first element.
Definition couple.h:323
Comparator for increasing comparison (less than).
Definition comparator.h:63
Exception for container index out-of-range errors.
Definition error.h:84
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
TYPE pop()
Removes and returns front element from the queue.
Definition queue.h:188
Abstract base class for unique element containers.
Definition set.h:44
Comparator base class and concrete comparator classes.
Combines Comparable and CallbackOf for comparison callbacks.
Definition types.h:92
Generic pair container implementation.
Main namespace for the project Original.
Definition algorithms.h:21
std::uint32_t u_integer
32-bit unsigned integer type for sizes and indexes
Definition config.h:43
std::int64_t integer
64-bit signed integer type for arithmetic operations
Definition config.h:35
Queue container adapter implementation.