Advertisement
ludaludaed

hse_rb_tree

Dec 20th, 2022 (edited)
708
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 30.49 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. #include <utility>
  4. #include <cassert>
  5. #include <cstdint>
  6.  
  7.  
  8. struct StrategyTypes {
  9. private:
  10.     struct CopyTag {
  11.     };
  12.     struct MoveTag {
  13.     };
  14.  
  15. public:
  16.     using copy = CopyTag;
  17.     using move = MoveTag;
  18. };
  19.  
  20. enum class Color { RED, BLACK };
  21.  
  22. template<class TValue>
  23. struct Node {
  24.     using value_type = TValue;
  25.     using node_pointer = Node *;
  26.  
  27.     node_pointer parent;
  28.     node_pointer left;
  29.     node_pointer right;
  30.  
  31.     value_type key;
  32.  
  33.     bool is_nil;
  34.     Color color;
  35.  
  36.     static node_pointer createHead() {
  37.         auto new_node = reinterpret_cast<node_pointer>(new uint8_t[sizeof(Node)]);
  38.  
  39.         new_node->parent = new_node;
  40.         new_node->left = new_node;
  41.         new_node->right = new_node;
  42.  
  43.         new_node->is_nil = true;
  44.         new_node->color = Color::BLACK;
  45.         return new_node;
  46.     }
  47.  
  48.     template<class... Args>
  49.     static node_pointer createNode(node_pointer head, Args &&... args) {
  50.         auto new_node = reinterpret_cast<node_pointer>(new uint8_t[sizeof(Node)]);
  51.  
  52.         std::construct_at(std::addressof(new_node->key), std::forward<Args>(args)...);
  53.         new_node->parent = head;
  54.         new_node->left = head;
  55.         new_node->right = head;
  56.  
  57.         new_node->is_nil = false;
  58.         new_node->color = Color::RED;
  59.  
  60.         return new_node;
  61.     }
  62.  
  63.     static void destroyHead(node_pointer node) {
  64.         delete[] reinterpret_cast<uint8_t *>(node);
  65.     }
  66.  
  67.     static void destroyNode(node_pointer node) {
  68.         std::destroy_at(std::addressof(node->key));
  69.         destroyHead(node);
  70.     }
  71. };
  72.  
  73. enum TreeChild {
  74.     RIGHT, LEFT
  75. };
  76.  
  77. template<class NodePtr>
  78. struct TreeNodePosition {
  79.     NodePtr parent_;
  80.     TreeChild child_;
  81. };
  82.  
  83. template<class NodePtr>
  84. struct FindResult {
  85.     TreeNodePosition<NodePtr> position_;
  86.     NodePtr bound_;
  87. };
  88.  
  89. template<class Tree>
  90. class TreeVal {
  91. public:
  92.     using node_type = typename Tree::node_type;
  93.     using pointer = typename Tree::node_pointer;
  94.     using const_pointer = typename Tree::node_const_pointer;
  95.     using size_type = typename Tree::size_type;
  96.  
  97. public:
  98.     pointer head_;
  99.     size_type size_;
  100.  
  101.     TreeVal() : head_(), size_(0) {}
  102.  
  103.     static pointer min(pointer node) noexcept {
  104.         while (!node->left->is_nil) {
  105.             node = node->left;
  106.         }
  107.         return node;
  108.     }
  109.  
  110.     static pointer max(pointer node) noexcept {
  111.         while (!node->right->is_nil) {
  112.             node = node->right;
  113.         }
  114.         return node;
  115.     }
  116.  
  117.     static const_pointer min(const_pointer node) noexcept {
  118.         while (!node->left->is_nil) {
  119.             node = node->left;
  120.         }
  121.         return node;
  122.     }
  123.  
  124.     static const_pointer max(const_pointer node) noexcept {
  125.         while (!node->right->is_nil) {
  126.             node = node->right;
  127.         }
  128.         return node;
  129.     }
  130.  
  131.     void leftRotate(pointer node) noexcept {
  132.         pointer new_root = node->right;
  133.         node->right = new_root->left;
  134.  
  135.         if (!new_root->left->is_nil) {
  136.             new_root->left->parent = node;
  137.         }
  138.         new_root->parent = node->parent;
  139.  
  140.         if (node == head_->parent) {
  141.             head_->parent = new_root;
  142.         } else if (node == node->parent->left) {
  143.             node->parent->left = new_root;
  144.         } else {
  145.             node->parent->right = new_root;
  146.         }
  147.  
  148.         new_root->left = node;
  149.         node->parent = new_root;
  150.     }
  151.  
  152.     void rightRotate(pointer node) noexcept {
  153.         pointer new_root = node->left;
  154.         node->left = new_root->right;
  155.  
  156.         if (!new_root->right->is_nil) {
  157.             new_root->right->parent = node;
  158.         }
  159.         new_root->parent = node->parent;
  160.  
  161.         if (node == head_->parent) {
  162.             head_->parent = new_root;
  163.         } else if (node == node->parent->left) {
  164.             node->parent->left = new_root;
  165.         } else {
  166.             node->parent->right = new_root;
  167.         }
  168.  
  169.         new_root->right = node;
  170.         node->parent = new_root;
  171.     }
  172.  
  173.     pointer insertNode(const TreeNodePosition<pointer> position, pointer new_node) noexcept {
  174.         size_++;
  175.         new_node->parent = position.parent_;
  176.         if (position.parent_ == head_) {
  177.             head_->parent = new_node;
  178.             head_->left = new_node;
  179.             head_->right = new_node;
  180.             new_node->color = Color::BLACK;
  181.             return new_node;
  182.         }
  183.  
  184.         if (position.child_ == LEFT) {
  185.             position.parent_->left = new_node;
  186.             if (position.parent_ == head_->left) {
  187.                 head_->left = new_node;
  188.             }
  189.         } else {
  190.             position.parent_->right = new_node;
  191.             if (position.parent_ == head_->right) {
  192.                 head_->right = new_node;
  193.             }
  194.         }
  195.  
  196.         pointer current_node = new_node;
  197.         while (current_node->parent->color ==Color:: RED) {
  198.             if (current_node->parent == current_node->parent->parent->left) {
  199.                 pointer parent_sibling = current_node->parent->parent->right;
  200.                 if (parent_sibling->color == Color::RED) {
  201.                     current_node->parent->color = Color::BLACK;
  202.                     parent_sibling->color = Color::BLACK;
  203.                     current_node->parent->parent->color =Color:: RED;
  204.                     current_node = current_node->parent->parent;
  205.                 } else {
  206.                     if (current_node == current_node->parent->right) {
  207.                         current_node = current_node->parent;
  208.                         leftRotate(current_node);
  209.                     }
  210.  
  211.                     current_node->parent->color = Color::BLACK;
  212.                     current_node->parent->parent->color = Color::RED;
  213.                     rightRotate(current_node->parent->parent);
  214.                 }
  215.             } else {
  216.                 pointer parent_sibling = current_node->parent->parent->left;
  217.                 if (parent_sibling->color == Color::RED) {
  218.                     current_node->parent->color = Color::BLACK;
  219.                     parent_sibling->color = Color::BLACK;
  220.                     current_node->parent->parent->color = Color::RED;
  221.                     current_node = current_node->parent->parent;
  222.                 } else {
  223.                     if (current_node == current_node->parent->left) {
  224.                         current_node = current_node->parent;
  225.                         rightRotate(current_node);
  226.                     }
  227.  
  228.                     current_node->parent->color = Color::BLACK;
  229.                     current_node->parent->parent->color = Color::RED;
  230.                     leftRotate(current_node->parent->parent);
  231.                 }
  232.             }
  233.         }
  234.  
  235.         head_->parent->color = Color::BLACK;
  236.         return new_node;
  237.     }
  238.  
  239.     pointer extract(pointer node) {
  240.         pointer erased_node = node;
  241.         pointer fix_node;
  242.         pointer fix_node_parent;
  243.         if (node->left->is_nil) {
  244.             fix_node = node->right;
  245.         } else if (node->right->is_nil) {
  246.             fix_node = node->left;
  247.         } else {
  248.             node = min(node->right);
  249.             fix_node = node->right;
  250.         }
  251.  
  252.         if (node == erased_node) {
  253.             fix_node_parent = erased_node->parent;
  254.             if (!fix_node->is_nil) {
  255.                 fix_node->parent = fix_node_parent;
  256.             }
  257.             if (head_->parent == erased_node) {
  258.                 head_->parent = fix_node;
  259.             } else if (fix_node_parent->left == erased_node) {
  260.                 fix_node_parent->left = fix_node;
  261.             } else {
  262.                 fix_node_parent->right = fix_node;
  263.             }
  264.  
  265.             if (head_->right == erased_node) {
  266.                 if (fix_node->is_nil) {
  267.                     head_->right = fix_node_parent;
  268.                 } else {
  269.                     head_->right = max(fix_node);
  270.                 }
  271.             } else if (head_->left == erased_node) {
  272.                 if (fix_node->is_nil) {
  273.                     head_->left = fix_node_parent;
  274.                 } else {
  275.                     head_->left = min(fix_node);
  276.                 }
  277.             }
  278.         } else {
  279.             erased_node->left->parent = node;
  280.             node->left = erased_node->left;
  281.             if (node == erased_node->right) {
  282.                 fix_node_parent = node;
  283.             } else {
  284.                 fix_node_parent = node->parent;
  285.                 if (!fix_node->is_nil) {
  286.                     fix_node->parent = fix_node_parent;
  287.                 }
  288.  
  289.                 fix_node_parent->left = fix_node;
  290.                 node->right = erased_node->right;
  291.                 erased_node->right->parent = node;
  292.             }
  293.  
  294.             if (head_->parent == erased_node) {
  295.                 head_->parent = node;
  296.             } else if (erased_node->parent->left == erased_node) {
  297.                 erased_node->parent->left = node;
  298.             } else {
  299.                 erased_node->parent->right = node;
  300.             }
  301.  
  302.             node->parent = erased_node->parent;
  303.             std::swap(node->color, erased_node->color);
  304.         }
  305.  
  306.         if (erased_node->color == Color::BLACK) {
  307.             while (fix_node != head_->parent && fix_node->color == Color::BLACK) {
  308.                 if (fix_node == fix_node_parent->left) {
  309.                     pointer brother = fix_node_parent->right;
  310.                     if (brother->color == Color::RED) {
  311.                         brother->color = Color::BLACK;
  312.                         fix_node_parent->color = Color::RED;
  313.                         leftRotate(fix_node_parent);
  314.                         brother = fix_node_parent->right;
  315.                     }
  316.  
  317.                     if (brother->is_nil) {
  318.                         fix_node = fix_node_parent;
  319.                     } else if (brother->left->color == Color::BLACK && brother->right->color == Color::BLACK) {
  320.                         brother->color = Color::RED;
  321.                         fix_node = fix_node_parent;
  322.                     } else {
  323.                         if (brother->right->color == Color::BLACK) {
  324.                             brother->left->color = Color::BLACK;
  325.                             brother->color = Color::RED;
  326.                             rightRotate(brother);
  327.                             brother = fix_node_parent->right;
  328.                         }
  329.  
  330.                         brother->color = fix_node_parent->color;
  331.                         fix_node_parent->color = Color::BLACK;
  332.                         brother->right->color = Color::BLACK;
  333.                         leftRotate(fix_node_parent);
  334.                         break;
  335.                     }
  336.                 } else {
  337.                     pointer brother = fix_node_parent->left;
  338.                     if (brother->color == Color::RED) {
  339.                         brother->color = Color::BLACK;
  340.                         fix_node_parent->color = Color::RED;
  341.                         rightRotate(fix_node_parent);
  342.                         brother = fix_node_parent->left;
  343.                     }
  344.  
  345.                     if (brother->is_nil) {
  346.                         fix_node = fix_node_parent;
  347.                     } else if (brother->left->color == Color::BLACK && brother->right->color == Color::BLACK) {
  348.                         brother->color = Color::RED;
  349.                         fix_node = fix_node_parent;
  350.                     } else {
  351.                         if (brother->left->color == Color::BLACK) {
  352.                             brother->right->color = Color::BLACK;
  353.                             brother->color = Color::RED;
  354.                             leftRotate(brother);
  355.                             brother = fix_node_parent->left;
  356.                         }
  357.  
  358.                         brother->color = fix_node_parent->color;
  359.                         fix_node_parent->color = Color::BLACK;
  360.                         brother->right->color = Color::BLACK;
  361.                         rightRotate(fix_node_parent);
  362.                         break;
  363.                     }
  364.                 }
  365.                 fix_node_parent = fix_node->parent;
  366.             }
  367.             fix_node->color = Color::BLACK;
  368.         }
  369.  
  370.         if (size_ > 0) {
  371.             size_--;
  372.         }
  373.  
  374.         return erased_node;
  375.     }
  376.  
  377.     void clearNodes(pointer root_node) {
  378.         while (!root_node->is_nil) {
  379.             clearNodes(root_node->right);
  380.             pointer new_root_node = root_node->left;
  381.             node_type::destroy_node(root_node);
  382.             root_node = new_root_node;
  383.         }
  384.     }
  385.  
  386.     void clearNodes() {
  387.         clearNodes(head_->parent);
  388.         head_->parent = head_;
  389.         head_->left = head_;
  390.         head_->right = head_;
  391.         size_ = 0;
  392.     }
  393.  
  394.     void clearHead() {
  395.         clearNodes(head_->parent);
  396.         node_type::destroy_head(head_);
  397.         size_ = 0;
  398.     }
  399.  
  400.     void swap(TreeVal &other) {
  401.         std::swap(head_, other.head_);
  402.         std::swap(size_, other.size_);
  403.     }
  404. };
  405.  
  406. template<class TNode>
  407. class TreeNodeWrapper {
  408.     using node_type = TNode;
  409.     using pointer = node_type *;
  410.     using const_pointer = const node_type *;
  411.  
  412. private:
  413.     pointer pointer_;
  414.  
  415. public:
  416.     template<class ...Args>
  417.     explicit TreeNodeWrapper(pointer head, Args &&...args) {
  418.         pointer_ = node_type::create_node(head, std::forward<Args>(args)...);
  419.     }
  420.  
  421.     TreeNodeWrapper(const TreeNodeWrapper &other) = delete;
  422.  
  423.     ~TreeNodeWrapper() {
  424.         if (pointer_ != nullptr) {
  425.             node_type::destroy_node(pointer_);
  426.         }
  427.     }
  428.  
  429.     pointer ptr() noexcept {
  430.         return pointer_;
  431.     }
  432.  
  433.     const_pointer ptr() const noexcept {
  434.         return pointer_;
  435.     }
  436.  
  437.     TreeNodeWrapper &operator=(const TreeNodeWrapper &other) = delete;
  438.  
  439.     pointer release() noexcept {
  440.         pointer released_pointer = pointer_;
  441.         pointer_ = nullptr;
  442.         return released_pointer;
  443.     }
  444. };
  445.  
  446. template<class TreeVal>
  447. class TreeValWrapper {
  448.     using node_type = typename TreeVal::node_type;
  449.     TreeVal *tree_val_;
  450.  
  451. public:
  452.     explicit TreeValWrapper(TreeVal *tree_val)
  453.             : tree_val_(tree_val) {
  454.         tree_val->head_ = node_type::create_head();
  455.     }
  456.  
  457.     TreeValWrapper(const TreeValWrapper &other) = delete;
  458.  
  459.     ~TreeValWrapper() {
  460.         if (tree_val_ != nullptr) {
  461.             tree_val_->clearHead();
  462.         }
  463.     }
  464.  
  465.     TreeValWrapper &operator=(const TreeValWrapper &other) = delete;
  466.  
  467.     void release() noexcept {
  468.         tree_val_ = nullptr;
  469.     }
  470. };
  471.  
  472. template<class Traits>
  473. class Tree {
  474.     template<class Item>
  475.     class TreeIterator;
  476.  
  477. public:
  478.     using node_type = Node<typename Traits::value_type>;
  479.  
  480.     using node_pointer = node_type *;
  481.     using node_const_pointer = const node_type *;
  482.     using node_reference = node_type &;
  483.     using node_const_reference = const node_type &;
  484.  
  485. private:
  486.     using traits_type = Traits;
  487.     using tree_val_type = TreeVal<Tree>;
  488.  
  489. public:
  490.     using key_compare = typename traits_type::key_compare;
  491.     using key_type = typename traits_type::key_type;
  492.     using value_type = typename traits_type::value_type;
  493.     using size_type = size_t;
  494.     using difference_type = ptrdiff_t;
  495.     using reference = value_type &;
  496.     using const_reference = const value_type &;
  497.     using pointer = value_type *;
  498.     using const_pointer = const value_type *;
  499.  
  500.     using iterator = TreeIterator<value_type>;
  501.     using const_iterator = TreeIterator<const value_type>;
  502.  
  503. private:
  504.     key_compare compare_;
  505.     tree_val_type tree_;
  506.  
  507. private:
  508.     bool lowerBoundDuplicate(node_pointer bound, const key_type &key) const {
  509.         return !bound->is_nil && !compare_(key, traits_type::select_key(bound->key));
  510.     }
  511.  
  512.     node_pointer internalFind(const key_type &key) const {
  513.         FindResult<node_pointer> result = findLowerBound(key);
  514.         if (lowerBoundDuplicate(result.bound_, key)) {
  515.             return result.bound_;
  516.         }
  517.         return tree_.head_;
  518.     }
  519.  
  520.     FindResult<node_pointer> findUpperBound(const key_type &key) const {
  521.         FindResult<node_pointer> result{{tree_.head_->parent, TreeChild::RIGHT}, tree_.head_};
  522.         node_pointer try_node = result.position_.parent_;
  523.         while (!try_node->is_nil) {
  524.             result.position_.parent_ = try_node;
  525.             if (compare_(key, traits_type::select_key(try_node->key))) {
  526.                 result.position_.child_ = TreeChild::LEFT;
  527.                 result.bound_ = try_node;
  528.                 try_node = try_node->left;
  529.             } else {
  530.                 result.position_.child_ = TreeChild::RIGHT;
  531.                 try_node = try_node->right;
  532.             }
  533.         }
  534.         return result;
  535.     }
  536.  
  537.     FindResult<node_pointer> findLowerBound(const key_type &key) const {
  538.         FindResult<node_pointer> result{{tree_.head_->parent, TreeChild::RIGHT}, tree_.head_};
  539.         node_pointer try_node = result.position_.parent_;
  540.         while (!try_node->is_nil) {
  541.             result.position_.parent_ = try_node;
  542.             if (compare_(traits_type::select_key(try_node->key), key)) {
  543.                 result.position_.child_ = TreeChild::RIGHT;
  544.                 try_node = try_node->right;
  545.             } else {
  546.                 result.position_.child_ = TreeChild::LEFT;
  547.                 result.bound_ = try_node;
  548.                 try_node = try_node->left;
  549.             }
  550.         }
  551.         return result;
  552.     }
  553.  
  554.     std::pair<node_pointer, node_pointer> internalEqualRange(const key_type &key) const {
  555.         node_pointer parent_node = tree_.head_->parent;
  556.         node_pointer lower_node = tree_.head_;
  557.         node_pointer upper_node = tree_.head_;
  558.  
  559.         while (!parent_node->is_nil) {
  560.             const key_type &node_key = traits_type::select_key(parent_node->key);
  561.             if (compare_(node_key, key)) {
  562.                 parent_node = parent_node->right;
  563.             } else {
  564.                 if (upper_node->is_nil && compare_(key, node_key)) {
  565.                     upper_node = parent_node;
  566.                 }
  567.  
  568.                 lower_node = parent_node;
  569.                 parent_node = parent_node->left;
  570.             }
  571.         }
  572.  
  573.         if (upper_node->is_nil) {
  574.             parent_node = tree_.head_->parent;
  575.         } else {
  576.             parent_node = upper_node->left;
  577.         }
  578.  
  579.         while (!parent_node->is_nil) {
  580.             const key_type &node_key = traits_type::select_key(parent_node->key);
  581.             if (compare_(key, node_key)) {
  582.                 upper_node = parent_node;
  583.                 parent_node = parent_node->left;
  584.             } else {
  585.                 parent_node = parent_node->right;
  586.             }
  587.         }
  588.  
  589.         return std::make_pair(lower_node, upper_node);
  590.     }
  591.  
  592.     template<class Tag>
  593.     void copy(const Tree &other, Tag tag) {
  594.         tree_.head_->parent = copyNodes(other.head_->parent, tree_.head_, tag);
  595.         tree_.head_ = other.size_;
  596.         if (!tree_.head_->parent->is_nil) {
  597.             tree_.head_->left = tree_val_type::min(tree_.head_->parent);
  598.             tree_.head_->right = tree_val_type::max(tree_.head_->parent);
  599.         } else {
  600.             tree_.head_->left = tree_.head_;
  601.             tree_.head_->right = tree_.head_;
  602.         }
  603.     }
  604.  
  605.     node_pointer copyOrMoveNode(node_pointer other_node, StrategyTypes::copy) const {
  606.         return node_type::createNode(tree_.head_, other_node->key);
  607.     }
  608.  
  609.     node_pointer copyOrMoveNode(node_pointer other_node, StrategyTypes::move) const {
  610.         if constexpr (std::is_same<key_type, value_type>::value) {
  611.             return node_type::createNode(tree_.head_, std::move(other_node->key));
  612.         } else {
  613.             return node_type::createNode(tree_.head_,
  614.                                          std::move(const_cast<key_type &>(other_node->key.first)),
  615.                                          std::move(other_node->key.second));
  616.         }
  617.     }
  618.  
  619.     template<class Tag>
  620.     node_pointer copyNodes(node_pointer from_node, node_pointer to_node, Tag tag) {
  621.         if (from_node->is_nil) {
  622.             return tree_.head_;
  623.         }
  624.         node_pointer copied_node = copyOrMoveNode(from_node, tag);
  625.         copied_node->parent = to_node;
  626.         copied_node->color = from_node->color;
  627.  
  628.         try {
  629.             copied_node->left = copyNodes(from_node->left, copied_node, tag);
  630.             copied_node->right = copyNodes(from_node->right, copied_node, tag);
  631.         } catch (...) {
  632.             tree_.clearNodes(copied_node);
  633.             throw;
  634.         }
  635.         return copied_node;
  636.     }
  637.  
  638.     template<class ...Args>
  639.     std::pair<node_pointer, bool> internalEmplace(Args &&...args) {
  640.         TreeNodeWrapper node_wrapper(tree_.head_, std::forward<Args>(args)...);
  641.         node_pointer new_node = node_wrapper.ptr();
  642.  
  643.         const key_type &key = traits_type::select_key(new_node->key);
  644.         FindResult<node_pointer> result = findLowerBound(key);
  645.  
  646.         if (lowerBoundDuplicate(result.bound_, key)) {
  647.             return std::make_pair(result.bound_, false);
  648.         }
  649.         new_node = node_wrapper.release();
  650.         return std::make_pair(tree_.insertNode(result.position_, new_node), true);
  651.     }
  652.  
  653.     node_pointer internalErase(const_iterator where) {
  654.         const_iterator successor(where);
  655.         ++successor;
  656.         node_pointer erased = tree_.extract(where.node_);
  657.         node_type::destroyNode(erased);
  658.         return successor.node_;
  659.     }
  660.  
  661.     node_pointer internalErase(iterator where) {
  662.         iterator successor(where);
  663.         ++successor;
  664.         node_pointer erased = tree_.extract(where.node_);
  665.         node_type::destroyNode(erased);
  666.         return successor.node_;
  667.     }
  668.  
  669.     node_pointer internalErase(const_iterator begin, const_iterator end) {
  670.         if (begin == cbegin() && end == cend()) {
  671.             clear();
  672.             return tree_.head_;
  673.         }
  674.         while (begin != end) {
  675.             internalErase(begin++);
  676.         }
  677.         return end.node_;
  678.     }
  679.  
  680. public:
  681.     explicit Tree(const key_compare &compare = key_compare{})
  682.             : tree_(), compare_(compare) {
  683.         tree_.head_ = node_type::createHead();
  684.     }
  685.  
  686.     Tree(const Tree &other)
  687.             : tree_(),
  688.               compare_(other.compare_) {
  689.         TreeValWrapper tree_val_temp(&tree_);
  690.         copy(other, StrategyTypes::copy{});
  691.         tree_val_temp.release();
  692.     }
  693.  
  694.     Tree(Tree &&other) noexcept
  695.             : tree_(),
  696.               compare_(other.compare_) {
  697.         tree_.head_ = node_type::createHead();
  698.         tree_.swap(other.tree_);
  699.     }
  700.  
  701.     template<class Iter>
  702.     Tree(Iter begin, Iter end)
  703.             : tree_(), compare_() {
  704.         insert(begin, end);
  705.     }
  706.  
  707.     template<class Iter>
  708.     Tree(Iter begin, Iter end, const key_compare &compare)
  709.             : tree_(), compare_(compare) {
  710.         insert(begin, end);
  711.     }
  712.  
  713.     Tree(std::initializer_list<value_type> list)
  714.             : tree_(), compare_() {
  715.         insert(list.begin(), list.end());
  716.     }
  717.  
  718.     ~Tree() {
  719.         tree_.clearHead();
  720.     }
  721.  
  722.     Tree &operator=(const Tree &other) {
  723.         if (this != *other) {
  724.             clear();
  725.             compare_ = other.compare_;
  726.             copy(other, StrategyTypes::copy{});
  727.         }
  728.         return *this;
  729.     }
  730.  
  731.     Tree &operator=(Tree &&other)
  732.     noexcept(std::is_nothrow_move_assignable<traits_type>::value) {
  733.         if (this != *other) {
  734.             clear();
  735.             compare_ = std::move(other.compare_);
  736.             tree_.swap(other.tree_);
  737.         }
  738.         return *this;
  739.     }
  740.  
  741.     void swap(Tree &other) noexcept(std::is_nothrow_swappable<key_compare>::value) {
  742.         if (this != &other) {
  743.             tree_.swap(other.tree_);
  744.             std::swap(compare_, other.compare_);
  745.         }
  746.     }
  747.  
  748.     template<class... Args>
  749.     std::pair<iterator, bool> emplace(Args &&... args) {
  750.         auto result = internalEmplace(std::forward<Args>(args)...);
  751.         return std::make_pair(iterator(result.first), result.second);
  752.     }
  753.  
  754.     std::pair<iterator, bool> insert(const value_type &value) {
  755.         auto result = internalEmplace(value);
  756.         return std::make_pair(iterator(result.first), result.second);
  757.     }
  758.  
  759.     std::pair<iterator, bool> insert(value_type &&value) {
  760.         auto result = internalEmplace(std::move(value));
  761.         return std::make_pair(iterator(result.first), result.second);
  762.     }
  763.  
  764.     template<class Iterator>
  765.     void insert(Iterator begin, Iterator end) {
  766.         for (auto it = begin; it != end; ++it) {
  767.             internalEmplace(*it);
  768.         }
  769.     }
  770.  
  771.     void insert(std::initializer_list<value_type> list) {
  772.         insert(list.begin(), list.end());
  773.     }
  774.  
  775.     iterator erase(iterator where) {
  776.         return iterator(internalErase(where));
  777.     }
  778.  
  779.     iterator erase(const_iterator where) {
  780.         return iterator(internalErase(where));
  781.     }
  782.  
  783.     iterator erase(const_iterator begin, const_iterator end) {
  784.         return iterator(internalErase(begin, end));
  785.     }
  786.  
  787.     size_type erase(const key_type &key) {
  788.         auto where = internalEqualRange(key);
  789.         const_iterator begin(where.first);
  790.         const_iterator end(where.second);
  791.         size_type count = std::distance(begin, end);
  792.         internalErase(begin, end);
  793.         return count;
  794.     }
  795.  
  796.     iterator find(const key_type &key) {
  797.         return iterator(internalFind(key));
  798.     }
  799.  
  800.     const_iterator find(const key_type &key) const {
  801.         return const_iterator(internalFind(key));
  802.     }
  803.  
  804.     bool contains(const key_type &key) const {
  805.         return lowerBoundDuplicate(findLowerBound(key).bound_, key);
  806.     }
  807.  
  808.     size_type count(const key_type &key) const {
  809.         return lowerBoundDuplicate(findLowerBound(key).bound_, key);
  810.     }
  811.  
  812.     iterator lowerBound(const key_type &key) {
  813.         return iterator(findLowerBound(key).bound_);
  814.     }
  815.  
  816.     const_iterator lowerBound(const key_type &key) const {
  817.         return const_iterator(findLowerBound(key).bound_);
  818.     }
  819.  
  820.     iterator upperBound(const key_type &key) {
  821.         return iterator(findUpperBound(key).bound_);
  822.     }
  823.  
  824.     const_iterator upperBound(const key_type &key) const {
  825.         return const_iterator(findUpperBound(key).bound_);
  826.     }
  827.  
  828.     std::pair<iterator, iterator> equalRange(const key_type &key) {
  829.         auto result = internalEqualRange(key);
  830.         return std::make_pair(iterator(result.first), iterator(result.second));
  831.     }
  832.  
  833.     std::pair<const_iterator, const_iterator> equalRange(const key_type &key) const {
  834.         auto result = internalEqualRange(key);
  835.         return std::make_pair(const_iterator(result.first), const_iterator(result.second));
  836.     }
  837.  
  838.     iterator begin() {
  839.         return iterator(tree_.head_->left);
  840.     }
  841.  
  842.     iterator end() {
  843.         return iterator(tree_.head_);
  844.     }
  845.  
  846.     const_iterator begin() const {
  847.         return const_iterator(tree_.head_->left);
  848.     }
  849.  
  850.     const_iterator end() const {
  851.         return const_iterator(tree_.head_);
  852.     }
  853.  
  854.     const_iterator cbegin() {
  855.         return const_iterator(tree_.head_->left);
  856.     }
  857.  
  858.     const_iterator cend() {
  859.         return const_iterator(tree_.head_);
  860.     }
  861.  
  862.     key_compare keyComp() const {
  863.         return compare_;
  864.     }
  865.  
  866.     void clear() noexcept {
  867.         tree_.clearNodes();
  868.     }
  869.  
  870.     bool empty() const noexcept {
  871.         return tree_.size_ == 0;
  872.     }
  873.  
  874.     size_type size() const noexcept {
  875.         return tree_.size_;
  876.     }
  877.  
  878. private:
  879.     template<class Item>
  880.     class TreeIterator {
  881.         friend class tree;
  882.  
  883.     public:
  884.         using iterator_category = std::bidirectional_iterator_tag;
  885.         using value_type = Item;
  886.         using difference_type = std::ptrdiff_t;
  887.         using reference = value_type &;
  888.         using pointer = value_type *;
  889.  
  890.     private:
  891.         using node_pointer = typename Tree::node_pointer;
  892.  
  893.     private:
  894.         node_pointer node_;
  895.  
  896.     public:
  897.         TreeIterator() noexcept
  898.                 : node_(nullptr) {}
  899.  
  900.         explicit TreeIterator(node_pointer node) noexcept
  901.                 : node_(node) {}
  902.  
  903.         TreeIterator(const TreeIterator &other) noexcept
  904.                 : node_(other.node_) {}
  905.  
  906.         TreeIterator &operator=(const TreeIterator &other) noexcept {
  907.             node_ = other.node_;
  908.         }
  909.  
  910.         bool operator==(const TreeIterator &other) const noexcept {
  911.             return node_ == other.node_;
  912.         }
  913.  
  914.         bool operator!=(const TreeIterator &other) const noexcept {
  915.             return node_ != other.node_;
  916.         }
  917.  
  918.         reference operator*() const noexcept {
  919.             return const_cast<reference>(node_->key);
  920.         }
  921.  
  922.         pointer operator->() const noexcept {
  923.             return const_cast<pointer>(&node_->key);
  924.         }
  925.  
  926.         TreeIterator &operator++() noexcept {
  927.             if (node_->right->is_nil) {
  928.                 node_pointer node;
  929.                 while (!(node = node_->parent)->is_nil && node_ == node->right) {
  930.                     node_ = node;
  931.                 }
  932.                 node_ = node;
  933.             } else {
  934.                 node_ = tree_val_type::min(node_->right);
  935.             }
  936.             return *this;
  937.         }
  938.  
  939.         TreeIterator operator++(int) noexcept {
  940.             TreeIterator iter_copy = *this;
  941.             ++*this;
  942.             return iter_copy;
  943.         }
  944.  
  945.         TreeIterator &operator--() noexcept {
  946.             if (node_->is_nil) {
  947.                 node_ = node_->right;
  948.             } else if (node_->left->is_nil) {
  949.                 node_pointer node;
  950.                 while (!(node = node_->parent)->is_nil && node_ == node->left) {
  951.                     node_ = node;
  952.                 }
  953.                 if (!node_->is_nil) {
  954.                     node_ = node;
  955.                 }
  956.             } else {
  957.                 node_ = tree_val_type::max(node_->left);
  958.             }
  959.             return *this;
  960.         }
  961.  
  962.         TreeIterator operator--(int) noexcept {
  963.             TreeIterator iter_copy = *this;
  964.             --*this;
  965.             return iter_copy;
  966.         }
  967.     };
  968. };
  969.  
  970. template<class TKey, class TValue, class KeyCompare>
  971. class map_traits {
  972. public:
  973.     using key_type = TKey;
  974.     using value_type = std::pair<const TKey, TValue>;
  975.     using key_compare = KeyCompare;
  976.  
  977.     template<class TFirst, class TSecond>
  978.     static const TFirst &select_key(const std::pair<TFirst, TSecond> &pair) {
  979.         return pair.first;
  980.     }
  981. };
  982.  
  983. template<class TKey, class KeyCompare>
  984. class set_traits {
  985. public:
  986.     using key_type = TKey;
  987.     using value_type = TKey;
  988.     using key_compare = KeyCompare;
  989.  
  990.     static const value_type &select_key(const value_type &value) {
  991.         return value;
  992.     }
  993. };
  994.  
  995. int main() {
  996.     std::cout << "Hello, World!" << std::endl;
  997.     return 0;
  998. }
  999.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement