Advertisement
Guest User

TreeContainer.cpp

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