Advertisement
cherup

Untitled

Nov 14th, 2015
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.32 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.  
  11. namespace treeContainer {
  12. class tree_iterator;
  13. class node_iterator;
  14. class reverse_node_iterator;
  15. class child_iterator;
  16. class reverse_child_iterator;
  17. typedef const node_iterator const_node_iterator;
  18. typedef const reverse_node_iterator const_reverse_node_iterator;
  19. typedef const child_iterator const_child_iterator;
  20. typedef const reverse_child_iterator const_reverse_child_iterator;
  21.  
  22. class tree{
  23. private:    
  24.     friend class tree_iterator;
  25.     friend class node_iterator;
  26.     friend class reverse_node_iterator;
  27.     friend class child_iterator;
  28.     friend class reverse_child_iterator;
  29.  
  30.     class Node;
  31.     typedef std::shared_ptr<Node> ptrNode;
  32.  
  33. public:
  34.     enum Parameter
  35.     {
  36.         APPENDNEXT,
  37.         REMOVENEXT,
  38.  
  39.         ROOT,
  40.         END
  41.     };
  42.  
  43. //structors
  44. public:
  45.     tree();
  46.     ~tree();
  47.  
  48. //functions
  49. public:
  50.     template<typename T> node_iterator find(T value);
  51.     void clear();
  52.  
  53.     template<typename T> node_iterator appendNode(tree_iterator it, T value);
  54.  
  55.     node_iterator move(tree_iterator it, tree_iterator node);
  56.  
  57.     void remove(tree_iterator it);
  58.     void remove(tree_iterator it, Parameter param);
  59.  
  60. private:
  61.     template<typename T> Node* find(T value, Node* node);
  62.  
  63. //Functions iterating
  64. public:
  65.     //begin() & end()
  66.     node_iterator begin();
  67.     const_node_iterator cbegin() const;
  68.  
  69.     reverse_node_iterator rbegin();
  70.     const_reverse_node_iterator crbegin() const;
  71.  
  72.     child_iterator begin(tree_iterator node);
  73.     const_child_iterator cbegin(tree_iterator node) const;
  74.  
  75.     reverse_child_iterator rbegin(tree_iterator node);
  76.     const_reverse_child_iterator crbegin(tree_iterator node) const;
  77.  
  78.     node_iterator end();
  79.     const_node_iterator cend() const;
  80.  
  81.     reverse_node_iterator rend();
  82.     const_reverse_node_iterator crend() const;
  83.  
  84.     child_iterator end(tree_iterator node);
  85.     const_child_iterator cend(tree_iterator node) const;
  86.  
  87.     reverse_child_iterator rend(tree_iterator node);
  88.     const_reverse_child_iterator crend(tree_iterator node) const;
  89.  
  90. //Classes
  91. private:
  92.     class Node{
  93.         friend class tree;
  94.     private:
  95.             class placeholder{
  96.             public:
  97.                 virtual ~placeholder() {}
  98.                 virtual std::type_index getType() = 0;
  99.             };
  100.  
  101.             template<typename T>
  102.             class holder : public placeholder{
  103.             public:
  104.                 holder(T value) : myValue(value) {}
  105.  
  106.                 std::type_index getType();
  107.  
  108.                 T myValue;
  109.             };
  110.     private:
  111.         std::shared_ptr<placeholder> myValue = nullptr;
  112.  
  113.         Node* myParentNode = nullptr;
  114.  
  115.         Node* myPrevNode = nullptr;
  116.         Node* myNextNode = nullptr;
  117.  
  118.         Node* myFirstNode = nullptr;
  119.         Node* myLastNode = nullptr;
  120.  
  121.         std::vector<std::shared_ptr<Node>> myChildren;
  122.  
  123.     private:
  124.  
  125.     public:
  126.         Node();
  127.         template<typename T> Node(T value);
  128.         ~Node();
  129.  
  130.     public:
  131.         Node* getPrev();
  132.         Node* getNext();
  133.         Node* getFirst();
  134.         Node* getLast();
  135.         Node* getParent();
  136.  
  137.         node_iterator appendNode(std::shared_ptr<Node> node);
  138.         template<typename T> node_iterator appendNode(T value);
  139.  
  140.         void remove(Parameter param);
  141.  
  142.         template<typename T> void setValue(T value);
  143.         template<typename T> T getValue();
  144.         std::type_index getValueType();
  145.  
  146.         template<typename T> void operator =(T value) { setValue(value); }
  147.     private:
  148.         void setPrev(Node* prev);
  149.         void setNext(Node* next);
  150.         void setFirst(Node* first);
  151.         void setLast(Node* last);
  152.         void setParent(Node* parent);
  153.  
  154.         void extract();
  155.         void erase(Node* node);
  156.         void erase(std::shared_ptr<Node> node);
  157.     };
  158.  
  159. //Storage
  160. private:
  161.     ptrNode myRoot = nullptr;
  162.     ptrNode myEnd = nullptr;
  163.  
  164. };
  165.  
  166.  
  167. //Iterators
  168. class tree_iterator
  169. {
  170. private:
  171.     friend class tree;
  172.     friend class node_iterator;
  173.     friend class reverse_node_iterator;
  174.     friend class child_iterator;
  175.     friend class reverse_child_iterator;
  176. public:
  177.     virtual ~tree_iterator() {}
  178.  
  179.     void operator =(tree::Node* node)
  180.     {
  181.         myNode = node;
  182.     }
  183.     void operator =(tree_iterator rhs)
  184.     {
  185.         myNode = rhs.myNode;
  186.     }
  187.  
  188.     bool operator ==(tree_iterator& rhs)
  189.     {
  190.         return myNode == rhs.myNode;
  191.     }
  192.     bool operator !=(tree_iterator rhs)
  193.     {
  194.         return !(myNode == rhs.myNode);
  195.     }
  196.  
  197.     void Next()
  198.     {
  199.         if(myNode->getNext()) myNode = myNode->getNext();
  200.     }
  201.     void Prev()
  202.     {
  203.         if(myNode->getPrev()) myNode = myNode->getPrev();
  204.     }
  205.     void First()
  206.     {
  207.         if(myNode->getFirst()) myNode = myNode->getFirst();
  208.     }
  209.     void Last()
  210.     {
  211.         if(myNode->getLast()) myNode = myNode->getLast();
  212.     }
  213.     void Parent()
  214.     {
  215.         myNode = myNode->getParent();
  216.     }
  217.  
  218.     template<typename T> void setValue(T value)
  219.     {
  220.         myNode->setValue(value);
  221.     }
  222.  
  223.     template<typename T> T getValue()
  224.     {
  225.         return myNode->getValue<T>();
  226.     }
  227.  
  228.     std::type_index getValueType()
  229.     {
  230.         return myNode->getValueType();
  231.     }
  232.  
  233. protected:
  234.     void increment()
  235.     {
  236.         if(myNode->getFirst()) myNode = myNode->getFirst();
  237.         else if(myNode->getNext()) myNode = myNode->getNext();
  238.         else getNext();
  239.     }
  240.     void decrement()
  241.     {
  242.         if(myNode->getLast()) myNode = myNode->getLast();
  243.         else if(myNode->getPrev()) myNode = myNode->getPrev();
  244.         else getPrev();
  245.     }
  246.     void getNext()
  247.     {
  248.         if(myNode->getParent() == myNode) return; //is root?
  249.         else
  250.         {
  251.             if(!myNode->getParent()->getNext())
  252.             {
  253.                 myNode = myNode->getParent();
  254.                 getNext();
  255.             }
  256.             else myNode = myNode->getParent()->getNext();
  257.         }
  258.     }
  259.     void getPrev()
  260.     {
  261.         if(myNode->getParent() == myNode) return; //is root?
  262.         else
  263.         {
  264.             if(!myNode->getParent()->getPrev())
  265.             {
  266.                 myNode = myNode->getParent();
  267.                 getPrev();
  268.             }
  269.             else myNode = myNode->getParent()->getPrev();
  270.         }
  271.     }
  272.  
  273. protected:
  274.     tree::Node* myNode;
  275. };
  276.  
  277. class node_iterator : public tree_iterator
  278. {
  279. private:
  280.     friend class tree;
  281.     node_iterator(tree::Node* node) { myNode = node; }
  282.  
  283. public:
  284.     node_iterator() {}
  285.     node_iterator(tree_iterator& it) {myNode = it.myNode; }
  286.  
  287.     ~node_iterator() {}
  288.  
  289.     node_iterator& operator ++()
  290.     {
  291.         increment();
  292.         return *this;
  293.     }
  294.     const node_iterator operator ++(int)
  295.     {
  296.         node_iterator ret(myNode);
  297.         ++(*this);
  298.         return ret;
  299.     }
  300.     node_iterator& operator --()
  301.     {
  302.         decrement();
  303.         return *this;
  304.     }
  305.     const node_iterator operator --(int)
  306.     {
  307.         node_iterator ret(myNode);
  308.         --(*this);
  309.         return ret;
  310.     }
  311. };
  312. class reverse_node_iterator : public tree_iterator
  313. {
  314. private:
  315.     friend class tree;
  316.     reverse_node_iterator(tree::Node* node) { myNode = node; }
  317. public:
  318.     reverse_node_iterator() {}
  319.     reverse_node_iterator(tree_iterator& it) {myNode = it.myNode; }
  320.  
  321.     ~reverse_node_iterator() {}
  322.  
  323.     reverse_node_iterator& operator ++()
  324.     {
  325.         decrement();
  326.         return *this;
  327.     }
  328.     const reverse_node_iterator operator ++(int)
  329.     {
  330.         reverse_node_iterator ret(myNode);
  331.         ++(*this);
  332.         return ret;
  333.     }
  334.     reverse_node_iterator& operator --()
  335.     {
  336.         increment();
  337.         return *this;
  338.     }
  339.     const reverse_node_iterator operator --(int)
  340.     {
  341.         reverse_node_iterator ret(myNode);
  342.         --(*this);
  343.         return ret;
  344.     }
  345. };
  346. class child_iterator : public tree_iterator
  347. {
  348. private:
  349.     friend class tree;
  350.     child_iterator(tree::Node* node) { myNode = node; }
  351. public:
  352.     child_iterator() {}
  353.     child_iterator(tree_iterator it) {myNode = it.myNode->getFirst(); }
  354.  
  355.     ~child_iterator() {}
  356.  
  357.     child_iterator& operator ++()
  358.     {
  359.         myNode = myNode->getNext();
  360.         return *this;
  361.     }
  362.     const child_iterator operator ++(int)
  363.     {
  364.         child_iterator ret(*this);
  365.         ++(*this);
  366.         return ret;
  367.     }
  368.     child_iterator& operator --()
  369.     {
  370.         myNode = myNode->getPrev();
  371.         return *this;
  372.     }
  373.     const child_iterator operator --(int)
  374.     {
  375.         child_iterator ret(*this);
  376.         --(*this);
  377.         return ret;
  378.     }
  379. };
  380. class reverse_child_iterator : public tree_iterator
  381. {
  382. private:
  383.     friend class tree;
  384.     reverse_child_iterator(tree::Node* node) { myNode = node; }
  385. public:
  386.     reverse_child_iterator() {}
  387.     reverse_child_iterator(tree_iterator& it) { myNode = it.myNode->getLast(); }
  388.  
  389.     ~reverse_child_iterator() {}
  390.  
  391.     reverse_child_iterator& operator ++()
  392.     {
  393.         myNode = myNode->getPrev();
  394.         return *this;
  395.     }
  396.     const reverse_child_iterator operator ++(int)
  397.     {
  398.         reverse_child_iterator ret(*this);
  399.         ++(*this);
  400.         return ret;
  401.     }
  402.     reverse_child_iterator& operator --()
  403.     {
  404.         myNode = myNode->getNext();
  405.         return *this;
  406.     }
  407.     const reverse_child_iterator operator --(int)
  408.     {
  409.         reverse_child_iterator ret(*this);
  410.         --(*this);
  411.         return ret;
  412.     }
  413. };
  414. }
  415.  
  416.  
  417. /*--------------------------------------------------------------------------------------------------------------------------------------*/
  418.  
  419. //Functions
  420. template<typename T> treeContainer::node_iterator treeContainer::tree::find(T value)
  421. {
  422.     return node_iterator(find(value, myRoot.get()));
  423. }
  424.  
  425. template<typename T> treeContainer::tree::Node* treeContainer::tree::find(T value, Node* node)
  426. {
  427.     Node* ret = nullptr;
  428.     if(node->getValueType() == typeid(T) && node->getValue<T>() == value) ret = node;
  429.     else if(node->getFirst()) ret = find(value, node->getFirst());
  430.     if(!ret && node->getNext()) ret = find(value, node->getNext());
  431.  
  432.     return ret;
  433. }
  434.  
  435. template<typename T> treeContainer::node_iterator treeContainer::tree::appendNode(tree_iterator it, T value)
  436. {
  437.     node_iterator ret = it.myNode->appendNode(std::make_shared<Node>(value));
  438.     if(it.myNode == myRoot.get()) it.myNode->appendNode(myEnd);
  439.     return ret;
  440. }
  441.  
  442. /*--------------------------------------------------------------------------------------------------------------------------------------*/
  443.  
  444. //class Node
  445. //structors
  446. template<typename T> treeContainer::tree::Node::Node(T value)
  447. {
  448.     setValue(value);
  449. }
  450.  
  451. //functions
  452. template<typename T> treeContainer::node_iterator treeContainer::tree::Node::appendNode(T value)
  453. {
  454.     std::shared_ptr<Node> node = std::make_shared<Node>(value);
  455.     return appendNode(node);
  456. }
  457.  
  458. template<typename T> void treeContainer::tree::Node::setValue(T value)
  459. {
  460.     myValue = std::shared_ptr<placeholder>(new holder<T>(value));
  461. }
  462.  
  463. template<typename T> T treeContainer::tree::Node::getValue()
  464. {
  465.     return std::static_pointer_cast<holder<T>>(myValue)->myValue;
  466. }
  467.  
  468. template<typename T>
  469. std::type_index treeContainer::tree::Node::holder<T>::getType()
  470. {
  471.     return std::type_index(typeid(myValue));
  472. }
  473.  
  474. #endif // TREECONTAINER_H
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement