Advertisement
Guest User

unique_ptr impl

a guest
May 14th, 2018
915
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.01 KB | None | 0 0
  1.   #include <memory>
  2.  
  3.   class Tree
  4.   {
  5.   public:
  6.       Tree() = default;
  7.  
  8.       bool hasValue(int x);
  9.       void insert(int x);
  10.       void erase(int x);
  11.  
  12.   private:
  13.  
  14.       struct Node
  15.       {
  16.           Node(int x): x(x) {}
  17.           Node() {}
  18.  
  19.           int x = 0;
  20.           int y = rand();
  21.  
  22.           std::unique_ptr<Node> left;
  23.           std::unique_ptr<Node> right;
  24.       };
  25.  
  26.       using NodePtr = std::unique_ptr<Node>;
  27.  
  28.       static NodePtr && merge(NodePtr && lower, NodePtr && greater);
  29.       static NodePtr && merge(NodePtr && lower, NodePtr && equal, NodePtr && greater);
  30.       static void split(NodePtr && orig, NodePtr& lower, NodePtr& greaterOrEqual, int val);
  31.       static void split(NodePtr && orig, NodePtr& lower, NodePtr& equal, NodePtr& greater, int val);
  32.  
  33.       NodePtr mRoot;
  34.   };
  35.  
  36.   bool Tree::hasValue(int x)
  37.   {
  38.       NodePtr lower, equal, greater;
  39.       split(std::move(mRoot), lower, equal, greater, x);
  40.       bool res = equal != nullptr;
  41.       mRoot = merge(std::move(lower), std::move(equal), std::move(greater));
  42.       return res;
  43.   }
  44.  
  45.   void Tree::insert(int x)
  46.   {
  47.       NodePtr lower, equal, greater;
  48.       split(std::move(mRoot), lower, equal, greater, x);
  49.       if(!equal)
  50.           equal = std::make_unique<Node>(x);
  51.  
  52.       mRoot = merge(std::move(lower), std::move(equal), std::move(greater));
  53.   }
  54.  
  55.   void Tree::erase(int x)
  56.   {
  57.       NodePtr lower, equal, greater;
  58.       split(std::move(mRoot), lower, equal, greater, x);
  59.       mRoot = merge(std::move(lower), std::move(greater));
  60.   }
  61.  
  62.   Tree::NodePtr && Tree::merge(NodePtr && lower, NodePtr && greater)
  63.   {
  64.       if(!lower)
  65.           return std::move(greater);
  66.  
  67.       if(!greater)
  68.           return std::move(lower);
  69.  
  70.       if(lower->y < greater->y)
  71.       {
  72.           lower->right = merge(std::move(lower->right), std::move(greater));
  73.           return std::move(lower);
  74.       }
  75.       else
  76.       {
  77.           greater->left = merge(std::move(lower), std::move(greater->left));
  78.           return std::move(greater);
  79.       }
  80.   }
  81.  
  82.   Tree::NodePtr && Tree::merge(NodePtr && lower, NodePtr && equal, NodePtr && greater)
  83.   {
  84.       return merge(merge(std::move(lower), std::move(equal)), std::move(greater));
  85.   }
  86.  
  87.   void Tree::split(NodePtr && orig, NodePtr& lower, NodePtr& greaterOrEqual, int val)
  88.   {
  89.       if(!orig)
  90.       {
  91.           lower = nullptr;
  92.           greaterOrEqual = nullptr;
  93.           return;
  94.       }
  95.  
  96.       if(orig->x < val)
  97.       {
  98.           lower = std::move(orig);
  99.           split(std::move(lower->right), lower->right, greaterOrEqual, val);
  100.       }
  101.       else
  102.       {
  103.           greaterOrEqual = std::move(orig);
  104.           split(std::move(greaterOrEqual->left), lower, greaterOrEqual->left, val);
  105.       }
  106.   }
  107.  
  108.   void Tree::split(NodePtr && orig, NodePtr& lower, NodePtr& equal, NodePtr& greater, int val)
  109.   {
  110.       NodePtr equalOrGreater;
  111.       split(std::move(orig), lower, equalOrGreater, val);
  112.       split(std::move(equalOrGreater), equal, greater, val + 1);
  113.   }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement