Advertisement
Guest User

TreeContainer.h

a guest
Feb 22nd, 2016
31
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 17.94 KB | None | 0 0
  1. #ifndef TREECONTAINER_H
  2. #define TREECONTAINER_H
  3.  
  4. #include <map>
  5. #include <vector>
  6. #include <typeinfo>
  7. #include <typeindex>
  8. #include <memory>
  9.  
  10. namespace treeContainer {
  11. class tree_iterator;
  12. class node_iterator;
  13. class reverse_node_iterator;
  14. class child_iterator;
  15. class reverse_child_iterator;
  16. class deep_child_iterator;
  17. class reverse_deep_child_iterator;
  18. typedef const node_iterator const_node_iterator;
  19. typedef const reverse_node_iterator const_reverse_node_iterator;
  20. typedef const child_iterator const_child_iterator;
  21. typedef const reverse_child_iterator const_reverse_child_iterator;
  22. typedef const deep_child_iterator const_deep_child_iterator;
  23. typedef const reverse_deep_child_iterator const_reverse_deep_child_iterator;
  24.  
  25. class tree{
  26. private:    
  27.     friend class tree_iterator;
  28.     friend class node_iterator;
  29.     friend class reverse_node_iterator;
  30.     friend class child_iterator;
  31.     friend class reverse_child_iterator;
  32.     friend class deep_child_iterator;
  33.     friend class reverse_deep_child_iterator;
  34.  
  35.     class Node;
  36.  
  37. //structors
  38. public:
  39.     tree();
  40.     ~tree();
  41.  
  42. //functions
  43. public:
  44.     //find "value" in tree
  45.     template<typename T> node_iterator find(T value);
  46.     //find "value" in childnodes of "it"
  47.     template<typename T> node_iterator find(tree_iterator it, T value);
  48.  
  49.     //clear tree
  50.     void clear();
  51.     //clear node
  52.     void clear(tree_iterator it);
  53.  
  54.     //append node with value "value" to "it"
  55.     template<typename T> node_iterator appendNode(tree_iterator it, T value);
  56.  
  57.     //append existing "node" to "it"
  58.     node_iterator move(tree_iterator it, tree_iterator node);
  59.  
  60.     //append existing "node" to parent of "it" at position after "it"
  61.     node_iterator insertAfter(tree_iterator it, tree_iterator node);
  62.     //append existing "node" to parent of "it" at position previous to "it"
  63.     node_iterator insertPrevious(tree_iterator it, tree_iterator node);
  64.  
  65.     //swap nodes of "it_1" and "it_2"
  66.     void swap(tree_iterator it_1, tree_iterator it_2);
  67.  
  68.     //delete node
  69.     void remove(tree_iterator it);
  70.     //delete all nodes from "it" to end
  71.     void removeToEnd(tree_iterator it);
  72.     //delete all nodes from "it" to start
  73.     void removeToStart(tree_iterator it);
  74.  
  75.     //get depth of node, children of Root has Deep = 0
  76.     int getDepth(tree_iterator it);
  77.  
  78. private:
  79.     template<typename T> Node* find(T value, Node* node);
  80.  
  81. //Functions iterating
  82. public:
  83.     //begin() & end()
  84.     node_iterator begin();
  85.     const_node_iterator cbegin() const;
  86.  
  87.     reverse_node_iterator rbegin();
  88.     const_reverse_node_iterator crbegin() const;
  89.  
  90.     child_iterator begin(tree_iterator it);
  91.     const_child_iterator cbegin(tree_iterator it) const;
  92.  
  93.     reverse_child_iterator rbegin(tree_iterator it);
  94.     const_reverse_child_iterator crbegin(tree_iterator it) const;
  95.  
  96.     deep_child_iterator dbegin(tree_iterator it);
  97.     const_deep_child_iterator cdbegin(tree_iterator it) const;
  98.  
  99.     reverse_deep_child_iterator rdbegin(tree_iterator it);
  100.     const_reverse_deep_child_iterator crdbegin(tree_iterator it) const;
  101.  
  102.     node_iterator end();
  103.     const_node_iterator cend() const;
  104.  
  105.     reverse_node_iterator rend();
  106.     const_reverse_node_iterator crend() const;
  107.  
  108.     child_iterator end(tree_iterator it);
  109.     const_child_iterator cend(tree_iterator it) const;
  110.  
  111.     reverse_child_iterator rend(tree_iterator it);
  112.     const_reverse_child_iterator crend(tree_iterator it) const;
  113.  
  114.     deep_child_iterator dend(tree_iterator it);
  115.     const_deep_child_iterator cdend(tree_iterator it) const;
  116.  
  117.     reverse_deep_child_iterator rdend(tree_iterator it);
  118.     const_reverse_deep_child_iterator crdend(tree_iterator it) const;
  119.  
  120. //Classes
  121. private:
  122.     class Node{
  123.         friend class tree;
  124.     private:
  125.             class placeholder{
  126.             public:
  127.                 virtual ~placeholder() {}
  128.                 virtual std::type_index getType() = 0;
  129.             };
  130.  
  131.             template<typename T>
  132.             class holder : public placeholder{
  133.             public:
  134.                 holder(T value) : myValue(value) {}
  135.  
  136.                 std::type_index getType();
  137.  
  138.                 T myValue;
  139.             };
  140.     private:
  141.         std::shared_ptr<placeholder> myValue = nullptr;
  142.         std::shared_ptr<Node> mySentinelStart = nullptr;
  143.         std::shared_ptr<Node> mySentinelEnd = nullptr;
  144.  
  145.         Node* myParentNode = nullptr;
  146.         Node* myPrevNode = nullptr;
  147.         Node* myNextNode = nullptr;
  148.         Node* myFirstNode = nullptr;
  149.         Node* myLastNode = nullptr;
  150.  
  151.         std::vector<std::shared_ptr<Node>> myChildren;
  152.  
  153.     public:
  154.         Node();
  155.         template<typename T> Node(T value);
  156.         ~Node();
  157.  
  158.     public:
  159.         Node* getParent();
  160.         Node* getPrev();
  161.         Node* getNext();
  162.         Node* getFirst();
  163.         Node* getLast();
  164.         Node* getStart();
  165.         Node* getEnd();
  166.  
  167.         std::shared_ptr<Node> getPtr();
  168.  
  169.         node_iterator appendNode(std::shared_ptr<Node> node);
  170.         template<typename T> node_iterator appendNode(T value);
  171.  
  172.         node_iterator insertAfter(std::shared_ptr<Node> node);
  173.         node_iterator insertPrevious(std::shared_ptr<Node> node);
  174.  
  175.         void remove(int param);
  176.  
  177.         template<typename T> void setValue(T value);
  178.         template<typename T> T getValue();
  179.         std::type_index getValueType();
  180.  
  181.         template<typename T> void operator =(T value) { setValue(value); }
  182.  
  183.     private:
  184.  
  185.         void setParent(Node* parent);
  186.         void setPrev(Node* prev);
  187.         void setNext(Node* next);
  188.         void setFirst(Node* first);
  189.         void setLast(Node* last);
  190.  
  191.         void extract();
  192.         void erase(Node* node);
  193.         void erase(std::shared_ptr<Node> node);
  194.  
  195.         //Helper functions
  196.         std::shared_ptr<Node> pushNewNode(std::shared_ptr<Node> node);
  197.         void checkSentinels();
  198.         void linkNodes(Node* first, Node* second);
  199.     };
  200.  
  201.     class SentinelNode : public Node{
  202.     /* Values:
  203.      * 0: Root
  204.      * 1: Start
  205.      * 2: End
  206.     */
  207.         friend class tree;
  208.     public:
  209.         SentinelNode(int value);
  210.         ~SentinelNode();
  211.     };
  212.  
  213. //Storage
  214. private:
  215.     std::shared_ptr<Node> myRoot = nullptr;
  216.     //std::shared_ptr<Node> myStart = nullptr;
  217.     //std::shared_ptr<Node> myEnd = nullptr;
  218.  
  219. };
  220.  
  221.  
  222. //Iterators
  223. class tree_iterator
  224. {
  225. private:
  226.     friend class tree;
  227.     friend class node_iterator;
  228.     friend class reverse_node_iterator;
  229.     friend class child_iterator;
  230.     friend class reverse_child_iterator;
  231.     friend class deep_child_iterator;
  232.     friend class reverse_deep_child_iterator;
  233. public:
  234.     virtual ~tree_iterator() {}
  235.  
  236.     void operator =(tree::Node* node)
  237.     {
  238.         myNode = node;
  239.     }
  240.     void operator =(tree_iterator rhs)
  241.     {
  242.         myNode = rhs.myNode;
  243.     }
  244.     void operator =(tree_iterator& rhs)
  245.     {
  246.         myNode = rhs.myNode;
  247.     }
  248.  
  249.     bool operator ==(tree_iterator rhs)
  250.     {
  251.         return myNode == rhs.myNode;
  252.     }
  253.     bool operator !=(tree_iterator rhs)
  254.     {
  255.         return !(myNode == rhs.myNode);
  256.     }
  257.  
  258.     void Next()
  259.     {
  260.         if(myNode->getNext() != myNode->getParent()->getEnd()) myNode = myNode->getNext();
  261.         else Parent();
  262.     }
  263.     void Prev()
  264.     {
  265.         if(myNode->getPrev() != myNode->getParent()->getStart()) myNode = myNode->getPrev();
  266.         else Parent();
  267.     }
  268.     void First()
  269.     {
  270.         if(myNode->getFirst()) myNode = myNode->getFirst();
  271.     }
  272.     void Last()
  273.     {
  274.         if(myNode->getLast()) myNode = myNode->getLast();
  275.     }
  276.     void Parent()
  277.     {
  278.         myNode = myNode->getParent();
  279.     }
  280.  
  281.     template<typename T> void setValue(T value)
  282.     {
  283.         myNode->setValue(value);
  284.     }
  285.  
  286.     template<typename T> T getValue()
  287.     {
  288.         return myNode->getValue<T>();
  289.     }
  290.  
  291.     std::type_index getValueType()
  292.     {
  293.         return myNode->getValueType();
  294.     }
  295.  
  296.     bool hasChildren()
  297.     {
  298.         if(myNode->getFirst()) return true;
  299.         else return false;
  300.     }
  301.  
  302. protected:
  303.     void increment()
  304.     {
  305.         if(myNode->getFirst()) myNode = myNode->getFirst();
  306.         else if(myNode->getNext())
  307.         {
  308.             myNode = myNode->getNext();
  309.             if(!myNode->getNext()) getNext();
  310.         }
  311.         else getNext();
  312.     }
  313.     void decrement()
  314.     {
  315.         if(myNode->getLast()) myNode = myNode->getLast();
  316.         else if(myNode->getPrev())
  317.         {
  318.             myNode = myNode->getPrev();
  319.             if(!myNode->getPrev()) getPrev();
  320.         }
  321.         else getPrev();
  322.     }
  323.     void getNext()
  324.     {
  325.         if(myNode->getParent() == myNode) myNode = myNode->getEnd(); //is root?
  326.         else
  327.         {
  328.             if(myNode->getParent()->getNext()) myNode = myNode->getParent()->getNext();
  329.             else
  330.             {
  331.                 myNode = myNode->getParent();
  332.                 getNext();
  333.                 return;
  334.             }
  335.             if(!myNode->getNext()) getNext();
  336.         }
  337.     }
  338.     void getPrev()
  339.     {
  340.         if(myNode->getParent() == myNode) myNode = myNode->getStart(); //is root?
  341.         else
  342.         {
  343.             if(myNode->getParent()->getPrev()) myNode = myNode->getParent()->getPrev();
  344.             else
  345.             {
  346.                 myNode = myNode->getParent();
  347.                 getPrev();
  348.                 return;
  349.             }
  350.             if(!myNode->getPrev()) getPrev();
  351.         }
  352.     }
  353.  
  354. protected:
  355.     tree::Node* myNode;
  356. };
  357.  
  358. class node_iterator : public tree_iterator
  359. {
  360. private:
  361.     friend class tree;
  362.     node_iterator(tree::Node* node) { myNode = node; }
  363.  
  364. public:
  365.     node_iterator() {}
  366.     node_iterator(tree_iterator& it) {myNode = it.myNode; }
  367.  
  368.     ~node_iterator() {}
  369.  
  370.     node_iterator& operator ++()
  371.     {
  372.         increment();
  373.         return *this;
  374.     }
  375.     const node_iterator operator ++(int)
  376.     {
  377.         node_iterator ret(myNode);
  378.         ++(*this);
  379.         return ret;
  380.     }
  381.     node_iterator& operator --()
  382.     {
  383.         decrement();
  384.         return *this;
  385.     }
  386.     const node_iterator operator --(int)
  387.     {
  388.         node_iterator ret(myNode);
  389.         --(*this);
  390.         return ret;
  391.     }
  392. };
  393. class reverse_node_iterator : public tree_iterator
  394. {
  395. private:
  396.     friend class tree;
  397.     reverse_node_iterator(tree::Node* node) { myNode = node; }
  398. public:
  399.     reverse_node_iterator() {}
  400.     reverse_node_iterator(tree_iterator& it) {myNode = it.myNode; }
  401.  
  402.     ~reverse_node_iterator() {}
  403.  
  404.     reverse_node_iterator& operator ++()
  405.     {
  406.         decrement();
  407.         return *this;
  408.     }
  409.     const reverse_node_iterator operator ++(int)
  410.     {
  411.         reverse_node_iterator ret(myNode);
  412.         ++(*this);
  413.         return ret;
  414.     }
  415.     reverse_node_iterator& operator --()
  416.     {
  417.         increment();
  418.         return *this;
  419.     }
  420.     const reverse_node_iterator operator --(int)
  421.     {
  422.         reverse_node_iterator ret(myNode);
  423.         --(*this);
  424.         return ret;
  425.     }
  426. };
  427. class child_iterator : public tree_iterator
  428. {
  429. private:
  430.     friend class tree;
  431.     child_iterator(tree::Node* node) { myNode = node; }
  432. public:
  433.     child_iterator() {}
  434.     child_iterator(tree_iterator it) {myNode = it.myNode->getFirst(); }
  435.  
  436.     ~child_iterator() {}
  437.  
  438.     child_iterator& operator ++()
  439.     {
  440.         myNode = myNode->getNext();
  441.         return *this;
  442.     }
  443.     const child_iterator operator ++(int)
  444.     {
  445.         child_iterator ret(*this);
  446.         ++(*this);
  447.         return ret;
  448.     }
  449.     child_iterator& operator --()
  450.     {
  451.         myNode = myNode->getPrev();
  452.         return *this;
  453.     }
  454.     const child_iterator operator --(int)
  455.     {
  456.         child_iterator ret(*this);
  457.         --(*this);
  458.         return ret;
  459.     }
  460. };
  461. class reverse_child_iterator : public tree_iterator
  462. {
  463. private:
  464.     friend class tree;
  465.     reverse_child_iterator(tree::Node* node) { myNode = node; }
  466. public:
  467.     reverse_child_iterator() {}
  468.     reverse_child_iterator(tree_iterator& it) { myNode = it.myNode->getLast(); }
  469.  
  470.     ~reverse_child_iterator() {}
  471.  
  472.     reverse_child_iterator& operator ++()
  473.     {
  474.         myNode = myNode->getPrev();
  475.         return *this;
  476.     }
  477.     const reverse_child_iterator operator ++(int)
  478.     {
  479.         reverse_child_iterator ret(*this);
  480.         ++(*this);
  481.         return ret;
  482.     }
  483.     reverse_child_iterator& operator --()
  484.     {
  485.         myNode = myNode->getNext();
  486.         return *this;
  487.     }
  488.     const reverse_child_iterator operator --(int)
  489.     {
  490.         reverse_child_iterator ret(*this);
  491.         --(*this);
  492.         return ret;
  493.     }
  494. };
  495. class deep_child_iterator : public tree_iterator
  496. {
  497. private:
  498.     friend class tree;
  499.     deep_child_iterator(tree::Node* node)
  500.     {
  501.         myNode = node;
  502.         myEndNode = node->getEnd();
  503.         myStartNode = node->getStart();
  504.     }
  505. public:
  506.     deep_child_iterator() {}
  507.     deep_child_iterator(tree_iterator it)
  508.     {
  509.         myNode = it.myNode->getFirst();
  510.         myEndNode = it.myNode->getEnd();
  511.         myStartNode = it.myNode->getStart();
  512.     }
  513.  
  514.     ~deep_child_iterator() {}
  515.  
  516.     deep_child_iterator& operator ++()
  517.     {
  518.         if(myNode->getFirst()) myNode = myNode->getFirst();
  519.         else if(myNode->getNext() == myNode->getParent()->getEnd() && myNode->getNext() != myEndNode) myNode = myNode->getParent()->getNext();
  520.         else myNode = myNode->getNext();
  521.  
  522.         return *this;
  523.     }
  524.     const deep_child_iterator operator ++(int)
  525.     {
  526.         deep_child_iterator ret(*this);
  527.         ++(*this);
  528.         return ret;
  529.     }
  530.     deep_child_iterator& operator --()
  531.     {
  532.         if(myNode->getLast()) myNode = myNode->getLast();
  533.         else if(myNode->getPrev() == myNode->getParent()->getStart() && myNode->getPrev() != myStartNode) myNode = myNode->getParent()->getPrev();
  534.         else myNode = myNode->getPrev();
  535.         return *this;
  536.     }
  537.     const deep_child_iterator operator --(int)
  538.     {
  539.         deep_child_iterator ret(*this);
  540.         --(*this);
  541.         return ret;
  542.     }
  543. private:
  544.     tree::Node* myEndNode;
  545.     tree::Node* myStartNode;
  546. };
  547. class reverse_deep_child_iterator : public tree_iterator
  548. {
  549. private:
  550.     friend class tree;
  551.     reverse_deep_child_iterator(tree::Node* node)
  552.     {
  553.         myNode = node;
  554.         myEndNode = node->getEnd();
  555.         myStartNode = node->getStart();
  556.     }
  557. public:
  558.     reverse_deep_child_iterator() {}
  559.     reverse_deep_child_iterator(tree_iterator& it)
  560.     {
  561.         myNode = it.myNode->getFirst();
  562.         myEndNode = it.myNode->getEnd();
  563.         myStartNode = it.myNode->getStart();
  564.     }
  565.  
  566.     ~reverse_deep_child_iterator() {}
  567.  
  568.     reverse_deep_child_iterator& operator ++()
  569.     {
  570.         if(myNode->getLast()) myNode = myNode->getLast();
  571.         else if(myNode->getPrev() == myNode->getParent()->getStart() && myNode->getPrev() != myStartNode) myNode = myNode->getParent()->getPrev();
  572.         else myNode = myNode->getPrev();
  573.         return *this;
  574.     }
  575.     const reverse_deep_child_iterator operator ++(int)
  576.     {
  577.         reverse_child_iterator ret(*this);
  578.         ++(*this);
  579.         return ret;
  580.     }
  581.     reverse_deep_child_iterator& operator --()
  582.     {
  583.         if(myNode->getLast()) myNode = myNode->getLast();
  584.         else if(myNode->getPrev() == myNode->getParent()->getStart() && myNode->getPrev() != myStartNode) myNode = myNode->getParent()->getNext();
  585.         else myNode = myNode->getPrev();
  586.         return *this;
  587.     }
  588.     const reverse_deep_child_iterator operator --(int)
  589.     {
  590.         reverse_deep_child_iterator ret(*this);
  591.         --(*this);
  592.         return ret;
  593.     }
  594. private:
  595.     tree::Node* myEndNode;
  596.     tree::Node* myStartNode;
  597. };
  598. }
  599.  
  600.  
  601. /*--------------------------------------------------------------------------------------------------------------------------------------*/
  602.  
  603. //Functions
  604. template<typename T> treeContainer::node_iterator treeContainer::tree::find(T value)
  605. {
  606.     Node* ret = find(value, myRoot->getFirst());
  607.     if(!ret) ret = myRoot->getEnd();
  608.  
  609.     return node_iterator(ret);
  610. }
  611.  
  612. template<typename T> treeContainer::node_iterator treeContainer::tree::find(treeContainer::tree_iterator it, T value)
  613. {
  614.     Node* ret = find(value, it.myNode);
  615.     if(!ret) ret = myRoot->getEnd();
  616.  
  617.     return node_iterator(ret);
  618. }
  619. template<typename T> treeContainer::tree::Node* treeContainer::tree::find(T value, Node* node)
  620. {
  621.     Node* ret = nullptr;
  622.     if(node->getValueType() == typeid(T) && node->getValue<T>() == value) ret = node;
  623.     else if(node->getFirst()) ret = find(value, node->getFirst());
  624.     if(!ret && node->getNext() && node->getNext() != node->getParent()->getEnd()) ret = find(value, node->getNext());
  625.  
  626.     return ret;
  627. }
  628.  
  629. template<typename T> treeContainer::node_iterator treeContainer::tree::appendNode(tree_iterator it, T value)
  630. {
  631.     if(it.myNode == myRoot->getEnd()) it = myRoot.get();
  632.  
  633.     node_iterator ret = it.myNode->appendNode(std::make_shared<Node>(value));
  634.     return ret;
  635. }
  636.  
  637. /*--------------------------------------------------------------------------------------------------------------------------------------*/
  638.  
  639. //class TreeNode
  640. //structors
  641. template<typename T> treeContainer::tree::Node::Node(T value)
  642. {
  643.     setValue(value);
  644.  
  645.     //Add SentinalNodes
  646.     mySentinelStart = pushNewNode(std::make_shared<SentinelNode>(1));
  647.     mySentinelEnd = pushNewNode(std::make_shared<SentinelNode>(2));
  648.  
  649.     linkNodes(mySentinelStart.get(), mySentinelEnd.get());
  650. }
  651.  
  652. //functions
  653. template<typename T> treeContainer::node_iterator treeContainer::tree::Node::appendNode(T value)
  654. {
  655.     std::shared_ptr<Node> node = std::make_shared<Node>(value);
  656.     return appendNode(node);
  657. }
  658.  
  659. template<typename T> void treeContainer::tree::Node::setValue(T value)
  660. {
  661.     myValue = std::shared_ptr<placeholder>(new holder<T>(value));
  662. }
  663.  
  664. template<typename T> T treeContainer::tree::Node::getValue()
  665. {
  666.     return std::static_pointer_cast<holder<T>>(myValue)->myValue;
  667. }
  668.  
  669. template<typename T>
  670. std::type_index treeContainer::tree::Node::holder<T>::getType()
  671. {
  672.     return std::type_index(typeid(myValue));
  673. }
  674.  
  675. #endif // TREECONTAINER_H
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement