Advertisement
Guest User

TreeContainer.cpp

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