SethVan

clang_format_test2

Jul 28th, 2022 (edited)
1,078
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 21.93 KB | None | 0 0
  1. #ifndef _RED_BLACK_TREE_
  2. #define _RED_BLACK_TREE_
  3.  
  4. #include <cassert>
  5. #include <iostream>
  6. #include <iterator>
  7. #include <memory>
  8. #include <utility>
  9.  
  10. #include "../Order.hpp"
  11. #include "Node.hpp"
  12.  
  13. template <typename K, typename V>
  14. class RedBlackTree {
  15.    public:
  16.     struct Iterator {
  17.         using value_type = std::pair<const K, V>;
  18.         using difference_type = ptrdiff_t;
  19.         using pointer = value_type*;
  20.         using reference = value_type&;
  21.         using iterator_category = std::bidirectional_iterator_tag;
  22.  
  23.        private:
  24.         Node<K, V>* p;
  25.         Node<K, V>* itRoot;
  26.         Node<K, V>* nextInOrder();
  27.         Node<K, V>* previousInOrder();
  28.         Node<K, V>* lastInOrder();
  29.  
  30.        public:
  31.         Iterator(Node<K, V>* _p = nullptr, Node<K, V>* _root = nullptr);
  32.         Iterator& operator++();
  33.         Iterator operator++(int);
  34.         Iterator& operator--();
  35.         Iterator operator--(int);
  36.         bool operator!=(const Iterator& rhs) const;
  37.         bool operator==(const Iterator& rhs) const;
  38.         std::pair<const K&, V&> operator*();
  39.         std::unique_ptr<std::pair<const K&, V&>> operator->();
  40.     };
  41.  
  42.    private:
  43.     Node<K, V>* root;
  44.     size_t treeSize;
  45.     Node<K, V>* insertNode(Node<K, V>* parent, K key, V val);
  46.     void checkColor(Node<K, V>* node);
  47.     void correctTree(Node<K, V>* node);
  48.     void rotate(Node<K, V>* node);
  49.     void leftRotate(Node<K, V>* node);       // grandparent
  50.     void rightRotate(Node<K, V>* node);      // grandparent
  51.     void leftRightRotate(Node<K, V>* node);  // grandparent
  52.     void rightLeftRotate(Node<K, V>* node);  // grandparent
  53.     int calculateHeight(Node<K, V>* node) const;
  54.     void destroyNodes(Node<K, V>* node);
  55.     void traverse(Node<K, V>* ptr, Order order) const;
  56.     int getBlackNodes(Node<K, V>* node) const;
  57.     Node<K, V>* findKey(Node<K, V>* node, K key) const;
  58.     Node<K, V>* moveToLeaf(Node<K, V>* toBeRemoved);
  59.     void fixUp(Node<K, V>* node, Node<K, V>* sibling);
  60.     void lowMemDestruct();
  61.     Node<K, V>* firstInOrder();  // root
  62.     void copyTree(Node<K, V>* rhsRoot);
  63.     void swap(RedBlackTree<K, V>& rhs) noexcept;
  64.  
  65.    public:
  66.     RedBlackTree() {
  67.         root = nullptr;
  68.         treeSize = 0;
  69.     }
  70.     RedBlackTree(const RedBlackTree<K, V>& rhs);
  71.     RedBlackTree(RedBlackTree<K, V>&& rhs) noexcept;
  72.     ~RedBlackTree();
  73.     RedBlackTree<K, V>& operator=(const RedBlackTree<K, V>& rhs);
  74.     RedBlackTree<K, V>& operator=(RedBlackTree<K, V>&& rhs) noexcept;
  75.  
  76.     bool empty() { return (!root); }
  77.     void clear();
  78.     void insert(K key, V val);
  79.     int height() const;
  80.     void displayTree(Order order) const;
  81.     int blackNodes() const;
  82.     bool contains(K key) const;
  83.     void erase(K key);
  84.     V& operator[](const K& key);
  85.     size_t size() const;
  86.     auto begin() -> Iterator;
  87.     auto end() -> Iterator;
  88.     auto find(const K& key) -> Iterator;
  89. };
  90.  
  91. template <typename K, typename V>
  92. RedBlackTree<K, V>::RedBlackTree(const RedBlackTree<K, V>& rhs) : RedBlackTree() {
  93.     copyTree(rhs.root);
  94. }
  95.  
  96. template <typename K, typename V>
  97. RedBlackTree<K, V>::RedBlackTree(RedBlackTree<K, V>&& rhs) noexcept : RedBlackTree() {
  98.     swap(rhs);
  99. }
  100.  
  101. template <typename K, typename V>
  102. RedBlackTree<K, V>& RedBlackTree<K, V>::operator=(const RedBlackTree<K, V>& rhs) {
  103.     RedBlackTree<K, V> temp(rhs);
  104.     swap(temp);
  105.     return *this;
  106. }
  107.  
  108. template <typename K, typename V>
  109. RedBlackTree<K, V>& RedBlackTree<K, V>::operator=(RedBlackTree<K, V>&& rhs) noexcept {
  110.     RedBlackTree<K, V> temp(std::move(rhs));
  111.     swap(temp);
  112.     return *this;
  113. }
  114.  
  115. template <typename K, typename V>
  116. void RedBlackTree<K, V>::copyTree(Node<K, V>* rhsRoot) {
  117.     if (rhsRoot) {
  118.         this->insert(rhsRoot->kvp.first, rhsRoot->kvp.second);
  119.         copyTree(rhsRoot->left);
  120.         copyTree(rhsRoot->right);
  121.     }
  122. }
  123.  
  124. template <typename K, typename V>
  125. size_t RedBlackTree<K, V>::size() const {
  126.     return treeSize;
  127. }
  128.  
  129. template <typename K, typename V>
  130. RedBlackTree<K, V>::~RedBlackTree() {
  131.     if (root) lowMemDestruct();
  132. }
  133.  
  134. template <typename K, typename V>
  135. void RedBlackTree<K, V>::destroyNodes(Node<K, V>* node) {
  136.     if (node) {
  137.         destroyNodes(node->left);
  138.         destroyNodes(node->right);
  139.         delete node;
  140.     }
  141. }
  142.  
  143. template <typename K, typename V>
  144. void RedBlackTree<K, V>::clear() {
  145.     Node<K, V>* temp = root;
  146.     root = nullptr;
  147.     destroyNodes(temp);
  148.     treeSize = 0;
  149. }
  150.  
  151. template <typename K, typename V>
  152. void RedBlackTree<K, V>::insert(K key, V val) {
  153.     if (root == nullptr) {
  154.         Node<K, V>* node = new Node<K, V>(key, val, nullptr, leftChild);
  155.         node->color = black;
  156.         root = node;
  157.         treeSize++;
  158.         return;
  159.     }
  160.     insertNode(root, key, val);
  161. }
  162.  
  163. template <typename K, typename V>
  164. Node<K, V>* RedBlackTree<K, V>::insertNode(Node<K, V>* parent, K key, V val) {
  165.     if (key == parent->kvp.first) return nullptr;
  166.     Node<K, V>* node;
  167.     if (key > parent->kvp.first) {
  168.         if (!parent->right) {
  169.             node = new Node<K, V>(key, val, parent, rightChild);
  170.             parent->right = node;
  171.             treeSize++;
  172.         }
  173.         else
  174.             return insertNode(parent->right, key, val);
  175.     }
  176.     else {
  177.         if (!parent->left) {
  178.             node = new Node<K, V>(key, val, parent, leftChild);
  179.             parent->left = node;
  180.             treeSize++;
  181.         }
  182.         else
  183.             return insertNode(parent->left, key, val);
  184.     }
  185.     if (node) checkColor(node);
  186.     return node;
  187. }
  188.  
  189. template <typename K, typename V>
  190. void RedBlackTree<K, V>::checkColor(Node<K, V>* node) {
  191.     if (node == root) return;
  192.     assert(node);
  193.     if (node->color == red && node->parent->color == red) correctTree(node);
  194.     if (node == root) return;
  195.     return checkColor(node->parent);
  196. }
  197.  
  198. template <typename K, typename V>
  199. void RedBlackTree<K, V>::correctTree(Node<K, V>* node) {
  200.     Node<K, V>* aunt;
  201.     if (node->parent->branch == leftChild)
  202.         aunt = node->parent->parent->right;
  203.     else
  204.         aunt = node->parent->parent->left;
  205.     if (aunt == nullptr || aunt->color == black) return rotate(node);
  206.     if (aunt != nullptr) aunt->color = black;
  207.     if (node->parent->parent != root) node->parent->parent->color = red;
  208.     node->parent->color = black;
  209.     return;
  210. }
  211.  
  212. template <typename K, typename V>
  213. void RedBlackTree<K, V>::rotate(Node<K, V>* node) {
  214.     auto singleRotateColors = [&](Node<K, V>* aunt) {
  215.         node->color = red;
  216.         node->parent->color = black;
  217.         if (aunt != nullptr) aunt->color = red;
  218.     };
  219.     auto doubleRotateColors = [&]() {
  220.         node->color = black;
  221.         node->left->color = red;
  222.         node->right->color = red;
  223.     };
  224.     if (node->branch == leftChild) {
  225.         if (node->parent->branch == leftChild) {
  226.             rightRotate(node->parent->parent);
  227.             singleRotateColors(node->parent->right);
  228.             return;
  229.         }
  230.         else {
  231.             rightLeftRotate(node->parent->parent);
  232.             doubleRotateColors();
  233.             return;
  234.         }
  235.     }
  236.     else {
  237.         if (node->parent->branch == rightChild) {
  238.             leftRotate(node->parent->parent);
  239.             singleRotateColors(node->parent->left);
  240.             return;
  241.         }
  242.         else {
  243.             leftRightRotate(node->parent->parent);
  244.             doubleRotateColors();
  245.             return;
  246.         }
  247.     }
  248. }
  249.  
  250. template <typename K, typename V>
  251. void RedBlackTree<K, V>::leftRotate(Node<K, V>* node) {
  252.     Node<K, V>* temp = node->right;
  253.     if (temp->right) temp->right->parent = temp;
  254.     node->right = temp->left;
  255.     if (node->right != nullptr) {
  256.         node->right->parent = node;
  257.         node->right->branch = rightChild;
  258.     }
  259.     if (node->parent == nullptr) {
  260.         temp->parent = nullptr;
  261.         temp->left = node;
  262.         temp->left->parent = temp;
  263.         root = temp;
  264.     }
  265.     else {
  266.         temp->parent = node->parent;
  267.         temp->left = node;
  268.         if (node->branch == leftChild) {
  269.             temp->branch = leftChild;
  270.             temp->parent->left = temp;
  271.         }
  272.         else {
  273.             temp->branch = rightChild;
  274.             temp->parent->right = temp;
  275.         }
  276.     }
  277.     node->parent = temp;
  278.     node->branch = leftChild;
  279. }
  280.  
  281. template <typename K, typename V>
  282. void RedBlackTree<K, V>::rightRotate(Node<K, V>* node) {
  283.     Node<K, V>* temp = node->left;
  284.     assert(temp);
  285.     if (temp->left) temp->left->parent = temp;
  286.     node->left = temp->right;
  287.     if (node->left != nullptr) {
  288.         node->left->parent = node;
  289.         node->left->branch = leftChild;
  290.     }
  291.     if (node->parent == nullptr) {
  292.         temp->parent = nullptr;
  293.         temp->right = node;
  294.         temp->right->parent = temp;
  295.         root = temp;
  296.     }
  297.     else {
  298.         temp->parent = node->parent;
  299.         temp->right = node;
  300.         if (node->branch == rightChild) {
  301.             temp->branch = rightChild;
  302.             temp->parent->right = temp;
  303.         }
  304.         else {
  305.             temp->branch = leftChild;
  306.             temp->parent->left = temp;
  307.         }
  308.     }
  309.     node->parent = temp;
  310.     node->branch = rightChild;
  311. }
  312.  
  313. template <typename K, typename V>
  314. void RedBlackTree<K, V>::leftRightRotate(Node<K, V>* node) {
  315.     leftRotate(node->left);
  316.     rightRotate(node);
  317. }
  318.  
  319. template <typename K, typename V>
  320. void RedBlackTree<K, V>::rightLeftRotate(Node<K, V>* node) {
  321.     rightRotate(node->right);
  322.     leftRotate(node);
  323. }
  324.  
  325. template <typename K, typename V>
  326. int RedBlackTree<K, V>::height() const {
  327.     if (root == nullptr) return 0;
  328.     return calculateHeight(root) - 1;
  329. }
  330.  
  331. template <typename K, typename V>
  332. int RedBlackTree<K, V>::calculateHeight(Node<K, V>* node) const {
  333.     if (node == nullptr) return 0;
  334.     int leftHeight = calculateHeight(node->left) + 1;
  335.     int rightHeight = calculateHeight(node->right) + 1;
  336.     if (leftHeight > rightHeight) return leftHeight;
  337.     return rightHeight;
  338. }
  339.  
  340. template <typename K, typename V>
  341. void RedBlackTree<K, V>::displayTree(Order order) const {
  342.     if (!root) {
  343.         std::cout << "Node equals nullptr\n";
  344.         return;
  345.     }
  346.     traverse(root, order);
  347. }
  348.  
  349. template <typename K, typename V>
  350. void RedBlackTree<K, V>::traverse(Node<K, V>* ptr, Order order) const {
  351.     // needs adjustment for non-int types
  352.     if (order == inOrder) {
  353.         if (ptr) {
  354.             traverse(ptr->left, order);
  355.             std::cout << ptr->kvp.first << "(" << (ptr->color == red ? "red" : "black") << ")(val=" << ptr->kvp.second
  356.                       << "), " << (ptr->left ? std::to_string(ptr->left->kvp.first) : "NILL") << ", "
  357.                       << (ptr->right ? std::to_string(ptr->right->kvp.first) : "NILL") << std::endl;
  358.             traverse(ptr->right, order);
  359.         }
  360.     }
  361.     else if (order == preOrder) {
  362.         if (ptr) {
  363.             std::cout << ptr->kvp.first << "(" << (ptr->color == red ? "red" : "black") << ")(val=" << ptr->kvp.second
  364.                       << "), " << (ptr->left ? std::to_string(ptr->left->kvp.first) : "NILL") << ", "
  365.                       << (ptr->right ? std::to_string(ptr->right->kvp.first) : "NILL") << std::endl;
  366.             traverse(ptr->left, order);
  367.             traverse(ptr->right, order);
  368.         }
  369.     }
  370.     else if (order == postOrder) {
  371.         if (ptr) {
  372.             traverse(ptr->left, order);
  373.             traverse(ptr->right, order);
  374.             std::cout << ptr->kvp.first << "(" << (ptr->color == red ? "red" : "black") << ")(val=" << ptr->kvp.second
  375.                       << "), " << (ptr->left ? std::to_string(ptr->left->kvp.first) : "NILL") << ", "
  376.                       << (ptr->right ? std::to_string(ptr->right->kvp.first) : "NILL") << std::endl;
  377.         }
  378.     }
  379.     else if (order == elementsOnly) {
  380.         if (ptr) {
  381.             traverse(ptr->left, order);
  382.             std::cout << ptr->kvp.first << "(" << (ptr->color == red ? "red" : "black") << ")(val=" << ptr->kvp.second
  383.                       << "), ";
  384.             traverse(ptr->right, order);
  385.         }
  386.     }
  387. }
  388.  
  389. template <typename K, typename V>
  390. int RedBlackTree<K, V>::getBlackNodes(Node<K, V>* node) const {
  391.     if (node == nullptr) return 1;
  392.     int leftBlackNodes = getBlackNodes(node->left);
  393.     int rightBlackNodes = getBlackNodes(node->right);
  394.     assert(leftBlackNodes == rightBlackNodes);
  395.     if (node->color == black) ++leftBlackNodes;
  396.     return leftBlackNodes;
  397. }
  398.  
  399. template <typename K, typename V>
  400. int RedBlackTree<K, V>::blackNodes() const {
  401.     return getBlackNodes(root);
  402. }
  403.  
  404. template <typename K, typename V>
  405. Node<K, V>* RedBlackTree<K, V>::findKey(Node<K, V>* node, K key) const {
  406.     if (node == nullptr) return nullptr;
  407.     if (node->kvp.first == key) return node;
  408.     if (key < node->kvp.first)
  409.         return findKey(node->left, key);
  410.     else
  411.         return findKey(node->right, key);
  412. }
  413.  
  414. template <typename K, typename V>
  415. bool RedBlackTree<K, V>::contains(K key) const {
  416.     return findKey(root, key) != nullptr;
  417. }
  418.  
  419. template <typename K, typename V>
  420. Node<K, V>* RedBlackTree<K, V>::moveToLeaf(Node<K, V>* toBeRemoved) {
  421.     Node<K, V>* current = toBeRemoved;
  422.     Node<K, V>* replacingWith = nullptr;
  423.     auto swapAndMove = [&]() {
  424.         std::swap(toBeRemoved->kvp, replacingWith->kvp);
  425.         toBeRemoved = moveToLeaf(replacingWith);
  426.     };
  427.  
  428.     if (!current->right && !current->left) {
  429.         if (toBeRemoved->parent) {
  430.             if (toBeRemoved->branch == leftChild)
  431.                 toBeRemoved->parent->left = nullptr;
  432.             else
  433.                 toBeRemoved->parent->right = nullptr;
  434.         }
  435.         return toBeRemoved;
  436.     }
  437.     else if (!current->right) {
  438.         replacingWith = current->left;
  439.         swapAndMove();
  440.     }
  441.     else {
  442.         if (!current->right->left) {
  443.             replacingWith = current->right;
  444.             swapAndMove();
  445.         }
  446.         else {
  447.             current = current->right;
  448.             while (current->left) current = current->left;
  449.             replacingWith = current;
  450.             swapAndMove();
  451.         }
  452.     }
  453.     return toBeRemoved;
  454. }
  455.  
  456. template <typename K, typename V>
  457. void RedBlackTree<K, V>::erase(K key) {
  458.     Node<K, V>* node;
  459.     if ((node = findKey(root, key)) == nullptr) return;
  460.     if ((node = moveToLeaf(node))->color == red || node == root) {
  461.         if (node == root) root = nullptr;
  462.         delete node;
  463.         --treeSize;
  464.         return;
  465.     }
  466.     Node<K, V>* sibling = node->branch == leftChild ? node->parent->right : node->parent->left;
  467.     fixUp(node, sibling);
  468.     delete node;
  469.     --treeSize;
  470.     return;
  471. }
  472.  
  473. template <typename K, typename V>
  474. void RedBlackTree<K, V>::fixUp(Node<K, V>* node, Node<K, V>* sibling) {
  475.     if (node)
  476.         if (node == root) return;
  477.  
  478.     Node<K, V>* parent = sibling->parent;
  479.     if (sibling->color == red) {
  480.         std::swap(parent->color, sibling->color);
  481.         if (sibling->branch == leftChild) {
  482.             rightRotate(parent);
  483.             fixUp(node, parent->left);
  484.         }
  485.         else {
  486.             leftRotate(parent);
  487.             fixUp(node, parent->right);
  488.         }
  489.     }
  490.     else {
  491.         if ((!sibling->left || sibling->left->color == black) && (!sibling->right || sibling->right->color == black)) {
  492.             sibling->color = red;
  493.             if (parent->color == red)
  494.                 parent->color = black;
  495.             else {
  496.                 if (parent->parent) {
  497.                     if (parent->branch == leftChild)
  498.                         fixUp(parent, parent->parent->right);
  499.                     else
  500.                         fixUp(parent, parent->parent->left);
  501.                 }
  502.                 return;
  503.             }
  504.         }
  505.         else {
  506.             if (sibling->branch == rightChild) {
  507.                 if ((sibling->left && (sibling->left->color == red)) &&
  508.                     (!sibling->right || (sibling->right->color == black)))  // case 5
  509.                 {
  510.                     std::swap(sibling->left->color, sibling->color);
  511.                     rightRotate(sibling);
  512.                     sibling = sibling->parent;
  513.                 }
  514.                 if (sibling->right && (sibling->right->color == red))  // case 6
  515.                 {
  516.                     Node<K, V>* nephew = sibling->right;
  517.                     std::swap(sibling->parent->color, sibling->color);
  518.                     leftRotate(sibling->parent);
  519.                     nephew->color = black;
  520.                 }
  521.             }
  522.             else {
  523.                 if ((sibling->right && (sibling->right->color == red)) &&
  524.                     (!sibling->left || (sibling->left->color == black)))  // case 5
  525.                 {
  526.                     std::swap(sibling->right->color, sibling->color);
  527.                     leftRotate(sibling);
  528.                     sibling = sibling->parent;
  529.                 }
  530.                 if (sibling->left && (sibling->left->color == red))  // case 6
  531.                 {
  532.                     Node<K, V>* nephew = sibling->left;
  533.                     std::swap(sibling->parent->color, sibling->color);
  534.                     rightRotate(sibling->parent);
  535.                     nephew->color = black;
  536.                 }
  537.             }
  538.         }
  539.     }
  540. }
  541.  
  542. template <typename K, typename V>
  543. V& RedBlackTree<K, V>::operator[](const K& key) {
  544.     Node<K, V>* node;
  545.     if ((node = findKey(root, key)) != nullptr)
  546.         return node->kvp.second;
  547.     else {
  548.         V defaultVal{};
  549.         if (!treeSize) {
  550.             insert(key, defaultVal);
  551.             return root->kvp.second;
  552.         }
  553.         node = insertNode(root, key, defaultVal);
  554.         return node->kvp.second;
  555.     }
  556. }
  557.  
  558. template <typename K, typename V>
  559. Node<K, V>* RedBlackTree<K, V>::firstInOrder()  // root
  560. {
  561.     Node<K, V>* node = root;
  562.     while (node->left) node = node->left;
  563.     return node;
  564. }
  565.  
  566. template <typename K, typename V>
  567. void RedBlackTree<K, V>::lowMemDestruct() {
  568.     Node<K, V>* node = firstInOrder();
  569.     while (root) {
  570.         while (node->right) {
  571.             node = node->right;
  572.             if (node->left)
  573.                 while (node->left) node = node->left;
  574.         }
  575.         Node<K, V>* temp = node;
  576.         node = node->parent;
  577.         if (temp == root)
  578.             root = nullptr;
  579.         else {
  580.             if (temp->branch == leftChild)
  581.                 node->left = nullptr;
  582.             else
  583.                 node->right = nullptr;
  584.         }
  585.         delete temp;
  586.     }
  587. }
  588.  
  589. template <typename K, typename V>
  590. auto RedBlackTree<K, V>::begin() -> Iterator {
  591.     return Iterator{empty() ? nullptr : firstInOrder(), root};
  592. }
  593.  
  594. template <typename K, typename V>
  595. auto RedBlackTree<K, V>::end() -> Iterator {
  596.     return Iterator{nullptr, root};
  597. }
  598.  
  599. template <typename K, typename V>
  600. void RedBlackTree<K, V>::swap(RedBlackTree<K, V>& rhs) noexcept {
  601.     std::swap(root, rhs.root);
  602.     std::swap(treeSize, rhs.treeSize);
  603. }
  604.  
  605. template <typename K, typename V>
  606. auto RedBlackTree<K, V>::find(const K& key) -> Iterator {
  607.     return Iterator(findKey(root, key), root);
  608. }
  609.  
  610. /***************************Iterator methods*****************************/
  611.  
  612. template <typename K, typename V>
  613. RedBlackTree<K, V>::Iterator::Iterator(Node<K, V>* _p, Node<K, V>* _root) : p{_p}, itRoot(_root) {}
  614.  
  615. template <typename K, typename V>
  616. Node<K, V>* RedBlackTree<K, V>::Iterator::nextInOrder() {
  617.     if (p) {
  618.         if (p->right) {
  619.             p = p->right;
  620.             if (p->left)
  621.                 while (p->left) p = p->left;
  622.             return p;
  623.         }
  624.         if (p->parent && (p->parent->left == p)) return p->parent;
  625.         while (p->parent && (p->parent->right == p)) p = p->parent;
  626.         return p->parent;
  627.     }
  628.     return p;
  629. }
  630.  
  631. template <typename K, typename V>
  632. Node<K, V>* RedBlackTree<K, V>::Iterator::previousInOrder() {
  633.     if (p) {
  634.         if (p->left) {
  635.             p = p->left;
  636.             if (p->right)
  637.                 while (p->right) p = p->right;
  638.             return p;
  639.         }
  640.         if (p->parent && p->parent->right == p) return p->parent;
  641.         while (p->parent && (p->parent->left == p)) p = p->parent;
  642.         return !p->parent ? p->parent : p->parent->parent;
  643.     }
  644.     return nullptr;
  645. }
  646.  
  647. template <typename K, typename V>
  648. Node<K, V>* RedBlackTree<K, V>::Iterator::lastInOrder()  // root
  649. {
  650.     Node<K, V>* node = itRoot;
  651.     while (node->right) node = node->right;
  652.     return node;
  653. }
  654.  
  655. template <typename K, typename V>
  656. typename RedBlackTree<K, V>::Iterator& RedBlackTree<K, V>::Iterator::operator++() {
  657.     p = nextInOrder();
  658.     return *this;
  659. }
  660.  
  661. template <typename K, typename V>
  662. typename RedBlackTree<K, V>::Iterator RedBlackTree<K, V>::Iterator::operator++(int) {
  663.     auto temp = *this;
  664.     p = nextInOrder();
  665.     return temp;
  666. }
  667.  
  668. template <typename K, typename V>
  669. typename RedBlackTree<K, V>::Iterator& RedBlackTree<K, V>::Iterator::operator--() {
  670.     p = p == nullptr ? lastInOrder() : previousInOrder();
  671.     return *this;
  672. }
  673.  
  674. template <typename K, typename V>
  675. typename RedBlackTree<K, V>::Iterator RedBlackTree<K, V>::Iterator::operator--(int) {
  676.     auto temp = *this;
  677.     p = p == nullptr ? lastInOrder() : previousInOrder();
  678.     return temp;
  679. }
  680.  
  681. template <typename K, typename V>
  682. bool RedBlackTree<K, V>::Iterator::operator!=(const RedBlackTree<K, V>::Iterator& rhs) const {
  683.     return !operator==(rhs);
  684. }
  685.  
  686. template <typename K, typename V>
  687. bool RedBlackTree<K, V>::Iterator::operator==(const RedBlackTree<K, V>::Iterator& rhs) const {
  688.     return p == rhs.p;
  689. }
  690.  
  691. template <typename K, typename V>
  692. std::unique_ptr<std::pair<const K&, V&>> RedBlackTree<K, V>::Iterator::operator->() {
  693.     assert(p);
  694.     auto constKeyPairPtr = [&](const K& key, V& value) {
  695.         return std::make_unique<std::pair<const K&, V&>>(key, value);
  696.     };
  697.     return constKeyPairPtr(p->kvp.first, p->kvp.second);
  698. }
  699.  
  700. template <typename K, typename V>
  701. std::pair<const K&, V&> RedBlackTree<K, V>::Iterator::operator*() {
  702.     assert(p);
  703.     auto constKeyPair = [&](const K& key, V& value) { return std::pair<const K&, V&>(key, value); };
  704.     return constKeyPair(p->kvp.first, p->kvp.second);
  705. }
  706.  
  707. #endif  // RedBlackTree
  708.  
  709.  
Advertisement
Add Comment
Please, Sign In to add comment