Advertisement
Guest User

TreeContainer.cpp

a guest
Feb 22nd, 2016
22
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.78 KB | None | 0 0
  1. #include "treeContainer.h"
  2.  
  3. //structors
  4. treeContainer::tree::tree()
  5. {
  6.     myRoot = std::make_shared<Node>(0);
  7.     myRoot->setParent(myRoot.get());
  8. }
  9.  
  10. treeContainer::tree::~tree()
  11. {
  12.     clear();
  13.     myRoot = nullptr;
  14. }
  15.  
  16. /*---------------------------------------------------------------------------------------------------------------------*/
  17.  
  18. //Functions
  19.  
  20. //Remove all Nodes from tree
  21. void treeContainer::tree::clear()
  22. {
  23.     myRoot->remove(1);
  24. }
  25.  
  26. //Remove all childnodes from Node
  27. void treeContainer::tree::clear(tree_iterator it)
  28. {
  29.     if(it.myNode->getFirst()) it.myNode->getFirst()->remove(1);
  30. }
  31.  
  32. //move "node" to end of "it"
  33. treeContainer::node_iterator treeContainer::tree::move(tree_iterator it, tree_iterator node)
  34. {
  35.     it.myNode->appendNode(node.myNode->getPtr());
  36.     return node_iterator(node);
  37. }
  38.  
  39. //move "node" to parent of "it" with position after "it"
  40. treeContainer::node_iterator treeContainer::tree::insertAfter(tree_iterator it, tree_iterator node)
  41. {
  42.     it.myNode->insertAfter(node.myNode->getPtr());
  43.     return node_iterator(node);
  44. }
  45.  
  46. //move "node" to parent of "it" with position before "it"
  47. treeContainer::node_iterator treeContainer::tree::insertPrevious(tree_iterator it, tree_iterator node)
  48. {
  49.     it.myNode->insertPrevious(node.myNode->getPtr());
  50.     return node_iterator(node);
  51. }
  52.  
  53. //swap two Nodes
  54. void treeContainer::tree::swap(tree_iterator it_1, tree_iterator it_2)
  55. {
  56.     node_iterator temp(it_2.myNode->getPrev());
  57.  
  58.     insertPrevious(it_1, it_2);
  59.     insertAfter(temp, it_1);
  60. }
  61.  
  62. //Remove node
  63. void treeContainer::tree::remove(tree_iterator it)
  64. {
  65.     it.myNode->remove(0);
  66. }
  67.  
  68. //Remove all childnodes from it to End
  69. void treeContainer::tree::removeToEnd(tree_iterator it)
  70. {
  71.     it.myNode->remove(1);
  72. }
  73.  
  74. //Remove all childnodes from it to Start
  75. void treeContainer::tree::removeToStart(tree_iterator it)
  76. {
  77.     it.myNode->remove(2);
  78. }
  79.  
  80. //Returns depth of Node
  81. int treeContainer::tree::getDepth(tree_iterator it)
  82. {
  83.     int deep = 0;
  84.     Node* node = it.myNode;
  85.     while (node->getParent() != node)
  86.     {
  87.         deep++;
  88.         node = node->getParent();
  89.     }
  90.  
  91.     return deep-1;
  92. }
  93.  
  94. /*---------------------------------------------------------------------------------------------------------------------*/
  95.  
  96. //Functions begin()/end()
  97. treeContainer::node_iterator treeContainer::tree::begin()
  98. {
  99.     if(myRoot->getFirst()) return node_iterator(myRoot->getFirst());
  100.     else return node_iterator(myRoot->getEnd());
  101.  
  102. }
  103. treeContainer::const_node_iterator treeContainer::tree::cbegin() const
  104. {
  105.     return const_node_iterator(myRoot->getFirst());;
  106. }
  107. treeContainer::reverse_node_iterator treeContainer::tree::rbegin()
  108. {
  109.     return reverse_node_iterator(myRoot->getEnd()->getPrev());
  110. }
  111. treeContainer::const_reverse_node_iterator treeContainer::tree::crbegin() const
  112. {
  113.     return const_reverse_node_iterator(myRoot->getEnd()->getPrev());
  114. }
  115. treeContainer::child_iterator treeContainer::tree::begin(tree_iterator it)
  116. {
  117.     return child_iterator(it);
  118. }
  119. treeContainer::const_child_iterator treeContainer::tree::cbegin(tree_iterator it) const
  120. {
  121.     return const_child_iterator(it);
  122. }
  123. treeContainer::reverse_child_iterator treeContainer::tree::rbegin(tree_iterator it)
  124. {
  125.     return reverse_child_iterator(it);
  126. }
  127. treeContainer::const_reverse_child_iterator treeContainer::tree::crbegin(tree_iterator it) const
  128. {
  129.     return const_reverse_child_iterator(it);
  130. }
  131. treeContainer::deep_child_iterator treeContainer::tree::dbegin(tree_iterator it)
  132. {
  133.     return deep_child_iterator(it);
  134. }
  135. treeContainer::const_deep_child_iterator treeContainer::tree::cdbegin(tree_iterator it) const
  136. {
  137.     return const_deep_child_iterator(it);
  138. }
  139. treeContainer::reverse_deep_child_iterator treeContainer::tree::rdbegin(tree_iterator it)
  140. {
  141.     return reverse_deep_child_iterator(it);
  142. }
  143. treeContainer::const_reverse_deep_child_iterator treeContainer::tree::crdbegin(tree_iterator it) const
  144. {
  145.     return const_reverse_deep_child_iterator(it);
  146. }
  147. treeContainer::node_iterator treeContainer::tree::end()
  148. {
  149.     return node_iterator(myRoot->getEnd());
  150. }
  151. treeContainer::const_node_iterator treeContainer::tree::cend() const
  152. {
  153.     return const_node_iterator(myRoot->getEnd());
  154. }
  155. treeContainer::reverse_node_iterator treeContainer::tree::rend()
  156. {
  157.     return reverse_node_iterator(myRoot->getStart());
  158. }
  159. treeContainer::const_reverse_node_iterator treeContainer::tree::crend() const
  160. {
  161.     return const_reverse_node_iterator(myRoot->getStart());
  162. }
  163. treeContainer::child_iterator treeContainer::tree::end(tree_iterator it)
  164. {
  165.     return child_iterator(it.myNode->mySentinelEnd.get());
  166. }
  167. treeContainer::const_child_iterator treeContainer::tree::cend(tree_iterator it) const
  168. {
  169.     return const_child_iterator(it.myNode->mySentinelEnd.get());
  170. }
  171. treeContainer::reverse_child_iterator treeContainer::tree::rend(tree_iterator it)
  172. {
  173.     return reverse_child_iterator(it.myNode->mySentinelStart.get());
  174. }
  175. treeContainer::const_reverse_child_iterator treeContainer::tree::crend(tree_iterator it) const
  176. {
  177.     return const_reverse_child_iterator(it.myNode->mySentinelStart.get());
  178. }
  179. treeContainer::deep_child_iterator treeContainer::tree::dend(tree_iterator it)
  180. {
  181.     return deep_child_iterator(it.myNode->mySentinelEnd.get());
  182. }
  183. treeContainer::const_deep_child_iterator treeContainer::tree::cdend(tree_iterator it) const
  184. {
  185.     return const_deep_child_iterator(it.myNode->mySentinelEnd.get());
  186. }
  187. treeContainer::reverse_deep_child_iterator treeContainer::tree::rdend(tree_iterator it)
  188. {
  189.     return reverse_deep_child_iterator(it.myNode->mySentinelStart.get());
  190. }
  191. treeContainer::const_reverse_deep_child_iterator treeContainer::tree::crdend(tree_iterator it) const
  192. {
  193.     return const_reverse_deep_child_iterator(it.myNode->mySentinelStart.get());
  194. }
  195. /*---------------------------------------------------------------------------------------------------------------------*/
  196.  
  197. //class Node
  198. //structors
  199. treeContainer::tree::Node::Node() {}
  200.  
  201. treeContainer::tree::Node::~Node() {}
  202.  
  203. /*---------------------------------------------------------------------------------------------------------------------*/
  204.  
  205. //class Node
  206. //functions
  207.  
  208. //get/set-functions
  209. treeContainer::tree::Node* treeContainer::tree::Node::getPrev()
  210. {
  211.     return myPrevNode;
  212. }
  213. treeContainer::tree::Node* treeContainer::tree::Node::getNext()
  214. {
  215.     return myNextNode;
  216. }
  217. treeContainer::tree::Node* treeContainer::tree::Node::getFirst()
  218. {
  219.     return myFirstNode;
  220. }
  221. treeContainer::tree::Node* treeContainer::tree::Node::getLast()
  222. {
  223.     return myLastNode;
  224. }
  225. treeContainer::tree::Node *treeContainer::tree::Node::getParent()
  226. {
  227.     return myParentNode;
  228. }
  229. treeContainer::tree::Node *treeContainer::tree::Node::getStart()
  230. {
  231.     return mySentinelStart.get();
  232. }
  233. treeContainer::tree::Node *treeContainer::tree::Node::getEnd()
  234. {
  235.     return mySentinelEnd.get();
  236. }
  237. void treeContainer::tree::Node::setPrev(Node* prev)
  238. {
  239.     myPrevNode = prev;
  240. }
  241. void treeContainer::tree::Node::setNext(Node* next)
  242. {
  243.     myNextNode = next;
  244. }
  245. void treeContainer::tree::Node::setFirst(Node* first)
  246. {
  247.     myFirstNode = first;
  248. }
  249. void treeContainer::tree::Node::setLast(Node* last)
  250. {
  251.     myLastNode = last;
  252. }
  253. void treeContainer::tree::Node::setParent(tree::Node* parent)
  254. {
  255.     myParentNode = parent;
  256. }
  257.  
  258. //get shared_pointer of this
  259. std::shared_ptr<treeContainer::tree::Node> treeContainer::tree::Node::getPtr()
  260. {
  261.     for(auto it = myParentNode->myChildren.begin(); it != myParentNode->myChildren.end(); ++it)
  262.     {
  263.         if(it->get() == this) return *it;
  264.     }
  265.     return nullptr;
  266. }
  267.  
  268. //append node as last child of this
  269. treeContainer::node_iterator treeContainer::tree::Node::appendNode(std::shared_ptr<Node> node)
  270. {
  271.     pushNewNode(node);
  272.  
  273.     if(!myFirstNode) myFirstNode = myLastNode = node.get();
  274.     else
  275.     {
  276.         linkNodes(getLast(), node.get());
  277.         myLastNode = node.get();
  278.     }
  279.  
  280.     checkSentinels();
  281.     return node_iterator(node.get());
  282. }
  283.  
  284. //insert node after this to children of parent
  285. treeContainer::node_iterator treeContainer::tree::Node::insertAfter(std::shared_ptr<Node> node)
  286. {
  287.     myParentNode->pushNewNode(node);
  288.  
  289.     linkNodes(node.get(), getNext());
  290.     linkNodes(this, node.get());
  291.  
  292.     if(myParentNode->getLast() == this) myParentNode->setLast(node.get());
  293.  
  294.     return node_iterator(node.get());
  295. }
  296.  
  297. //insert node previous to this to children of parent
  298. treeContainer::node_iterator treeContainer::tree::Node::insertPrevious(std::shared_ptr<Node> node)
  299. {
  300.     myParentNode->pushNewNode(node);
  301.  
  302.     linkNodes(getPrev(), node.get());
  303.     linkNodes(node.get(), this);
  304.  
  305.     if(myParentNode->getFirst() == this) myParentNode->setFirst(node.get());
  306.  
  307.     return node_iterator(node.get());
  308. }
  309.  
  310. //remove this
  311. /* Parameter:
  312. * 0: Append next node to previous
  313. * 1: Remove all nodes from this to end
  314. * 2: Remove all nodes from this to start
  315. */
  316. void treeContainer::tree::Node::remove(int param)
  317. {
  318.     if(myFirstNode) myFirstNode->remove(1);
  319.     if(param == 1) if(myNextNode && myNextNode != myParentNode->getEnd()) myNextNode->remove(1);
  320.     if(param == 2) if(myPrevNode && myPrevNode != myParentNode->getStart()) myPrevNode->remove(2);
  321.  
  322.     if(myParentNode != this) //is root?
  323.     {
  324.         erase(mySentinelStart);
  325.         erase(mySentinelEnd);
  326.         mySentinelStart = nullptr;
  327.         mySentinelEnd = nullptr;
  328.         myParentNode->erase(this);
  329.         extract();
  330.     }
  331. }
  332.  
  333. //erase this from children of parent
  334. void treeContainer::tree::Node::erase(Node* node)
  335. {
  336.     for(auto it = myChildren.begin(); it != myChildren.end(); ++it)
  337.     {
  338.         if(it->get() == node)
  339.         {
  340.             myChildren.erase(it);
  341.             return;
  342.         }
  343.     }
  344. }
  345. void treeContainer::tree::Node::erase(std::shared_ptr<Node> node)
  346. {
  347.     for(auto it = myChildren.begin(); it != myChildren.end(); ++it)
  348.     {
  349.         if(it->get() == node.get())
  350.         {
  351.             myChildren.erase(it);
  352.             return;
  353.         }
  354.     }
  355. }
  356.  
  357. //extract this from all linked nodes
  358. void treeContainer::tree::Node::extract()
  359. {
  360.     linkNodes(myPrevNode, myNextNode);
  361.     if(myParentNode && myParentNode->getFirst() == this)
  362.     {
  363.         if(myNextNode != myParentNode->getEnd()) myParentNode->setFirst(myNextNode);
  364.         else myParentNode->setFirst(NULL);
  365.     }
  366.     if(myParentNode && myParentNode->getLast() == this)
  367.     {
  368.         if(myPrevNode != myParentNode->getStart()) myParentNode->setLast(myPrevNode);
  369.         else myParentNode->setLast(NULL);
  370.     }
  371.  
  372.     myPrevNode = myNextNode = nullptr;
  373.     myParentNode = nullptr;
  374. }
  375.  
  376. //get type_index of stored value
  377. std::type_index treeContainer::tree::Node::getValueType()
  378. {
  379.     return myValue->getType();
  380. }
  381.  
  382. //add existing node to this
  383. std::shared_ptr<treeContainer::tree::Node> treeContainer::tree::Node::pushNewNode(std::shared_ptr<Node> node)
  384. {
  385.     myChildren.push_back(node);
  386.  
  387.     if(node->getParent()) node->getParent()->erase(node);
  388.  
  389.     node->extract();
  390.     node->setParent(this);
  391.  
  392.     return node;
  393. }
  394.  
  395. //Link Sentinels correctly
  396. void treeContainer::tree::Node::checkSentinels()
  397. {
  398.     if(myFirstNode)
  399.     {
  400.         if(getStart()->getNext() != getFirst()) linkNodes(getStart(), getFirst());
  401.         if(getEnd()->getPrev() != getLast()) linkNodes(getLast(), getEnd());
  402.     }
  403.     else linkNodes(getStart(), getEnd());
  404. }
  405.  
  406. //Link two nodes, first is the previuos node, second the next
  407. void treeContainer::tree::Node::linkNodes(Node *first, Node *second)
  408. {
  409.     if(first != 0) first->setNext(second);
  410.     if(second != 0) second->setPrev(first);
  411. }
  412.  
  413. /*---------------------------------------------------------------------------------------------------------------------*/
  414.  
  415. //class SentinalNode
  416. //structors
  417.  
  418. treeContainer::tree::SentinelNode::SentinelNode(int value)
  419. {
  420.     setValue(value);
  421. }
  422. treeContainer::tree::SentinelNode::~SentinelNode() {}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement