Advertisement
Guest User

TreeContainer.cpp

a guest
Feb 29th, 2016
22
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.77 KB | None | 0 0
  1. #include "treeContainer.h"
  2.  
  3. //structors
  4. treeContainer::tree::tree()
  5. {
  6.     Root = std::make_shared<_Node>(0);
  7.     //link Root with itself
  8.     Root->ParentNode = Root.get();
  9.     Root->NextNode = Root.get();
  10.     Root->PrevNode = Root.get();
  11.  
  12.     _node_iterator = std::make_shared<_node_iterator_impl>();
  13.     _const_node_iterator = std::make_shared<_const_node_iterator_impl>();
  14.     _reverse_node_iterator = std::make_shared<_reverse_node_iterator_impl>();
  15.     _const_reverse_node_iterator = std::make_shared<_const_reverse_node_iterator_impl>();
  16.     _child_iterator = std::make_shared<_child_iterator_impl>();
  17.     _const_child_iterator = std::make_shared<_const_child_iterator_impl>();
  18.     _reverse_child_iterator = std::make_shared<_reverse_child_iterator_impl>();
  19.     _const_reverse_child_iterator = std::make_shared<_const_reverse_child_iterator_impl>();
  20. }
  21.  
  22. treeContainer::tree::~tree()
  23. {
  24.     clear();
  25.     Root = nullptr;
  26. }
  27.  
  28. /*--------------------------------------------------------------------------------------------------------------------------------------*/
  29.  
  30. //Functions
  31.  
  32. //Remove all Nodes from tree
  33. void treeContainer::tree::clear()
  34. {
  35.     clear(tree_iterator(_node_iterator, Root.get()));
  36. }
  37.  
  38. //Remove all childnodes from Node
  39. void treeContainer::tree::clear(const tree_iterator& node)
  40. {
  41.     if(node._node->FirstNode) remove(tree_iterator(_node_iterator, node._node->FirstNode), tree_iterator(_node_iterator, node._node->LastNode));
  42. }
  43.  
  44. //move "node" to end of "it"
  45. void treeContainer::tree::move(const tree_iterator& parent, const tree_iterator& node)
  46. {
  47.     parent._node->appendNode(node._node->getPtr());
  48. }
  49.  
  50. //move "node" to parent of "it" with position after "it"
  51. void treeContainer::tree::insertAfter(const tree_iterator& pos, const tree_iterator& node)
  52. {
  53.     pos._node->insertAfter(node._node->getPtr());
  54. }
  55.  
  56. //move "node" to parent of "it" with position before "it"
  57. void treeContainer::tree::insertPrevious(const tree_iterator& pos, const tree_iterator& node)
  58. {
  59.     pos._node->insertPrevious(node._node->getPtr());
  60. }
  61.  
  62. //swap two Nodes
  63. void treeContainer::tree::swap(const tree_iterator& it_1, const tree_iterator& it_2)
  64. {
  65.     tree_iterator temp(_node_iterator, it_2._node->PrevNode);
  66.  
  67.     insertPrevious(it_1, it_2);
  68.     insertAfter(temp, it_1);
  69. }
  70.  
  71. //Remove node
  72. treeContainer::tree::tree_iterator treeContainer::tree::remove(const tree_iterator& pos)
  73. {
  74.     return remove(pos, pos);
  75. }
  76.  
  77. //Remove nodes in range
  78. treeContainer::tree::tree_iterator treeContainer::tree::remove(const tree_iterator& first, const tree_iterator& last)
  79. {
  80.     tree_iterator it(_node_iterator,last._node), end(_node_iterator,first._node);
  81.     _Node* rem = it._node;
  82.  
  83.     while(rem != end._node)
  84.     {
  85.         --it;
  86.         rem->remove();
  87.         rem = it._node;
  88.     }
  89.     --it;
  90.     rem->remove();
  91.  
  92.     return tree_iterator(it);
  93. }
  94.  
  95. //Returns depth of Node
  96. int treeContainer::tree::getDepth(const tree_iterator& node)
  97. {
  98.     int deep = 0;
  99.     _Node* tmp = node._node;
  100.     while (tmp->ParentNode != tmp)
  101.     {
  102.         deep++;
  103.         tmp = tmp->ParentNode;
  104.     }
  105.  
  106.     return deep-1;
  107. }
  108.  
  109. /*--------------------------------------------------------------------------------------------------------------------------------------*/
  110.  
  111. //Functions begin()/end()
  112. treeContainer::tree::tree_iterator treeContainer::tree::begin()
  113. {
  114.     if(Root->FirstNode) return tree_iterator(_node_iterator, Root->FirstNode);
  115.     else return tree_iterator(_node_iterator, Root.get());
  116. }
  117. treeContainer::tree::tree_iterator treeContainer::tree::cbegin() const
  118. {
  119.     if(Root->FirstNode) return tree_iterator(_const_node_iterator, Root->FirstNode);
  120.     else return tree_iterator(_const_node_iterator, Root.get());
  121. }
  122. treeContainer::tree::tree_iterator treeContainer::tree::rbegin()
  123. {
  124.     tree_iterator ret(_reverse_node_iterator, Root.get());
  125.     return tree_iterator(++ret);
  126. }
  127. treeContainer::tree::tree_iterator treeContainer::tree::crbegin() const
  128. {
  129.     tree_iterator ret(_const_reverse_node_iterator, Root.get());
  130.     return tree_iterator(++ret);
  131. }
  132. treeContainer::tree::tree_iterator treeContainer::tree::begin(const tree_iterator& parent)
  133. {
  134.     return tree_iterator(_child_iterator, parent._node->FirstNode);
  135. }
  136. treeContainer::tree::tree_iterator treeContainer::tree::cbegin(const tree_iterator& parent) const
  137. {
  138.     return tree_iterator(_const_child_iterator, parent._node->FirstNode);
  139. }
  140. treeContainer::tree::tree_iterator treeContainer::tree::rbegin(const tree_iterator& parent)
  141. {
  142.     return tree_iterator(_reverse_child_iterator, parent._node->LastNode);
  143. }
  144. treeContainer::tree::tree_iterator treeContainer::tree::crbegin(const tree_iterator& parent) const
  145. {
  146.     return tree_iterator(_const_reverse_child_iterator, parent._node->LastNode);
  147. }
  148. treeContainer::tree::tree_iterator treeContainer::tree::end()
  149. {
  150.     return tree_iterator(_node_iterator, Root.get());
  151. }
  152. treeContainer::tree::tree_iterator treeContainer::tree::cend() const
  153. {
  154.     return tree_iterator(_const_node_iterator, Root.get());
  155. }
  156. treeContainer::tree::tree_iterator treeContainer::tree::rend()
  157. {
  158.     return tree_iterator(_reverse_node_iterator, Root.get());
  159. }
  160. treeContainer::tree::tree_iterator treeContainer::tree::crend() const
  161. {
  162.     return tree_iterator(_const_reverse_node_iterator, Root.get());
  163. }
  164. treeContainer::tree::tree_iterator treeContainer::tree::end(const tree_iterator& parent)
  165. {
  166.     tree_iterator tmp(_node_iterator, parent._node->LastNode);
  167.     ++tmp;
  168.     return tree_iterator(_child_iterator, tmp._node);
  169. }
  170. treeContainer::tree::tree_iterator treeContainer::tree::cend(const tree_iterator& parent) const
  171. {
  172.     tree_iterator tmp(_node_iterator, parent._node->LastNode);
  173.     ++tmp;
  174.     return tree_iterator(_const_child_iterator, tmp._node);
  175. }
  176. treeContainer::tree::tree_iterator treeContainer::tree::rend(const tree_iterator& parent)
  177. {
  178.     tree_iterator tmp(_node_iterator, parent._node->FirstNode);
  179.     --tmp;
  180.     return tree_iterator(_reverse_child_iterator, tmp._node);
  181. }
  182. treeContainer::tree::tree_iterator treeContainer::tree::crend(const tree_iterator& parent) const
  183. {
  184.     tree_iterator tmp(_node_iterator, parent._node->FirstNode);
  185.     --tmp;
  186.     return tree_iterator(_const_reverse_child_iterator, tmp._node);
  187. }
  188.  
  189. //Functions get iterator of type
  190. treeContainer::tree::tree_iterator treeContainer::tree::node_iterator(const tree_iterator& pos)
  191. {
  192.     return tree_iterator(_node_iterator, pos._node);
  193. }
  194. treeContainer::tree::tree_iterator treeContainer::tree::const_node_iterator(const tree_iterator& pos)
  195. {
  196.     return tree_iterator(_const_node_iterator, pos._node);
  197. }
  198. treeContainer::tree::tree_iterator treeContainer::tree::reverse_node_iterator(const tree_iterator& pos)
  199. {
  200.     return tree_iterator(_reverse_node_iterator, pos._node);
  201. }
  202. treeContainer::tree::tree_iterator treeContainer::tree::const_reverse_node_iterator(const tree_iterator& pos)
  203. {
  204.     return tree_iterator(_const_reverse_node_iterator, pos._node);
  205. }
  206. treeContainer::tree::tree_iterator treeContainer::tree::child_iterator(const tree_iterator& pos)
  207. {
  208.     return tree_iterator(_child_iterator, pos._node);
  209. }
  210. treeContainer::tree::tree_iterator treeContainer::tree::const_child_iterator(const tree_iterator& pos)
  211. {
  212.     return tree_iterator(_const_child_iterator, pos._node);
  213. }
  214. treeContainer::tree::tree_iterator treeContainer::tree::reverse_child_iterator(const tree_iterator& pos)
  215. {
  216.     return tree_iterator(_reverse_child_iterator, pos._node);
  217. }
  218. treeContainer::tree::tree_iterator treeContainer::tree::const_reverse_child_iterator(const tree_iterator& pos)
  219. {
  220.     return tree_iterator(_const_reverse_child_iterator, pos._node);
  221. }
  222.  
  223. /*--------------------------------------------------------------------------------------------------------------------------------------*/
  224.  
  225. //class Node
  226. //structors
  227. treeContainer::tree::_Node::_Node() {}
  228.  
  229. treeContainer::tree::_Node::~_Node() {}
  230.  
  231. /*--------------------------------------------------------------------------------------------------------------------------------------*/
  232.  
  233. //class Node
  234. //functions
  235.  
  236. //get shared_pointer of this
  237. std::shared_ptr<treeContainer::tree::_Node> treeContainer::tree::_Node::getPtr()
  238. {
  239.     for(auto it = ParentNode->Children.begin(); it != ParentNode->Children.end(); ++it)
  240.     {
  241.         if(it->get() == this) return *it;
  242.     }
  243.     return nullptr;
  244. }
  245.  
  246. //append node as last child of this
  247. treeContainer::tree::_Node* treeContainer::tree::_Node::appendNode(const std::shared_ptr<_Node>& node)
  248. {
  249.     pushNewNode(node);
  250.  
  251.     if(!FirstNode) FirstNode = LastNode = node.get();
  252.     else
  253.     {
  254.         linkNodes(LastNode, node.get());
  255.         LastNode = node.get();
  256.     }
  257.  
  258.     return node.get();
  259. }
  260.  
  261. //insert node after this to children of parent
  262. treeContainer::tree::_Node* treeContainer::tree::_Node::insertAfter(const std::shared_ptr<_Node>& node)
  263. {
  264.     ParentNode->pushNewNode(node);
  265.  
  266.     linkNodes(node.get(), NextNode);
  267.     linkNodes(this, node.get());
  268.  
  269.     if(ParentNode->LastNode == this) ParentNode->LastNode = node.get();
  270.  
  271.     return node.get();
  272. }
  273.  
  274. //insert node previous to this to children of parent
  275. treeContainer::tree::_Node* treeContainer::tree::_Node::insertPrevious(const std::shared_ptr<_Node>& node)
  276. {
  277.     ParentNode->pushNewNode(node);
  278.  
  279.     linkNodes(PrevNode, node.get());
  280.     linkNodes(node.get(), this);
  281.  
  282.     if(ParentNode->FirstNode == this) ParentNode->FirstNode = node.get();
  283.  
  284.     return node.get();
  285. }
  286.  
  287. //remove this
  288. void treeContainer::tree::_Node::remove()
  289. {
  290.     if(ParentNode != this) //is root?
  291.     {
  292.         ParentNode->erase(this);
  293.         extract();
  294.     }
  295. }
  296.  
  297. //erase this from children of parent
  298. void treeContainer::tree::_Node::erase(_Node* node)
  299. {
  300.     for(auto it = Children.begin(); it != Children.end(); ++it)
  301.     {
  302.         if(it->get() == node)
  303.         {
  304.             Children.erase(it);
  305.             return;
  306.         }
  307.     }
  308. }
  309.  
  310. //extract this from all linked nodes
  311. void treeContainer::tree::_Node::extract()
  312. {
  313.     linkNodes(PrevNode, NextNode);
  314.     if(ParentNode && ParentNode->FirstNode == this) ParentNode->FirstNode = NextNode;
  315.     if(ParentNode && ParentNode->LastNode == this) ParentNode->LastNode = PrevNode;
  316.  
  317.     PrevNode = NextNode = nullptr;
  318.     ParentNode = nullptr;
  319. }
  320.  
  321. //get type_index of stored value
  322. std::type_index treeContainer::tree::_Node::getValueType()
  323. {
  324.     return Value->getType();
  325. }
  326.  
  327. //add existing node to this
  328. void treeContainer::tree::_Node::pushNewNode(const std::shared_ptr<_Node>& node)
  329. {
  330.     Children.push_back(node);
  331.  
  332.     if(node->ParentNode) node->ParentNode->erase(node.get());
  333.  
  334.     node->extract();
  335.     node->ParentNode = this;
  336. }
  337.  
  338. //Link two nodes, first is the previuos node, second the next
  339. void treeContainer::tree::_Node::linkNodes(_Node *first, _Node *second)
  340. {
  341.     if(first != 0) first->NextNode = second;
  342.     if(second != 0) second->PrevNode = first;
  343. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement