]> Dogcows Code - chaz/yoink/blobdiff - src/stlplus/containers/ntree.tpp
import stlplus 3.7
[chaz/yoink] / src / stlplus / containers / ntree.tpp
index 6fd019d9f30b7eee6fe71ebd682e9667172060c4..9236327cea971ce7d95be461a051bf19c5dbce61 100644 (file)
@@ -2,7 +2,7 @@
 \r
 //   Author:    Andy Rushton\r
 //   Copyright: (c) Southampton University 1999-2004\r
-//              (c) Andy Rushton           2004-2009\r
+//              (c) Andy Rushton           2004 onwards\r
 //   License:   BSD License, see ../docs/license.html\r
 \r
 ////////////////////////////////////////////////////////////////////////////////\r
@@ -684,7 +684,9 @@ namespace stlplus
   TYPENAME ntree<T>::iterator ntree<T>::insert(const T& data)\r
   {\r
     // insert a new node as the root\r
-    return insert(ntree_iterator<T,T&,T*>(this), 0, data);\r
+    erase();\r
+    m_root = new ntree_node<T>(this,data);\r
+    return ntree_iterator<T,T&,T*>(m_root);\r
   }\r
 \r
   template<typename T>\r
@@ -692,31 +694,38 @@ namespace stlplus
     throw(wrong_object,null_dereference,end_dereference,std::out_of_range)\r
   {\r
     // if i is the end iterator, this means insert a new root\r
-    if (i.end())\r
-      erase();\r
-    else\r
-    {\r
-      i.assert_valid(this);\r
-      if (offset > children(i)) throw std::out_of_range("stlplus::ntree");\r
-    }\r
+    // if (i.end())\r
+    //   return insert(data);\r
+    // otherwise, insert a new child\r
+    i.assert_valid(this);\r
+    if (offset > children(i)) throw std::out_of_range("stlplus::ntree");\r
     ntree_node<T>* new_node = new ntree_node<T>(this,data);\r
-    if (i.end())\r
-    {\r
-      m_root = new_node;\r
-    }\r
-    else\r
-    {\r
-      i.node()->m_children.insert(i.node()->m_children.begin()+offset,new_node);\r
-      new_node->m_parent = i.node();\r
-    }\r
+    i.node()->m_children.insert(i.node()->m_children.begin()+offset,new_node);\r
+    new_node->m_parent = i.node();\r
     return ntree_iterator<T,T&,T*>(new_node);\r
   }\r
 \r
+  template<typename T>\r
+  TYPENAME ntree<T>::iterator ntree<T>::insert(const TYPENAME ntree<T>::iterator& i, const T& data)\r
+    throw(wrong_object,null_dereference,end_dereference)\r
+  {\r
+    return insert(i, children(i), data);\r
+  }\r
+\r
   template<typename T>\r
   TYPENAME ntree<T>::iterator ntree<T>::append(const TYPENAME ntree<T>::iterator& i, const T& data)\r
     throw(wrong_object,null_dereference,end_dereference)\r
   {\r
-    return insert(i, i.node()->m_children.size(), data);\r
+    return insert(i, children(i), data);\r
+  }\r
+\r
+  template<typename T>\r
+  TYPENAME ntree<T>::iterator ntree<T>::insert(const ntree<T>& tree)\r
+  {\r
+    // insert a whole tree as root\r
+    erase();\r
+    m_root = ntree_copy(this, tree.m_root);\r
+    return ntree_iterator<T,T&,T*>(m_root);\r
   }\r
 \r
   template<typename T>\r
@@ -732,6 +741,13 @@ namespace stlplus
     return ntree_iterator<T,T&,T*>(new_node);\r
   }\r
 \r
+  template<typename T>\r
+  TYPENAME ntree<T>::iterator ntree<T>::insert(const TYPENAME ntree<T>::iterator& i, const ntree<T>& tree)\r
+    throw(wrong_object,null_dereference,end_dereference)\r
+  {\r
+    return insert(i, children(i), tree);\r
+  }\r
+\r
   template<typename T>\r
   TYPENAME ntree<T>::iterator ntree<T>::append(const TYPENAME ntree<T>::iterator& i, const ntree<T>& tree)\r
     throw(wrong_object,null_dereference,end_dereference)\r
@@ -739,6 +755,39 @@ namespace stlplus
     return insert(i, children(i), tree);\r
   }\r
 \r
+  template<typename T>\r
+  TYPENAME ntree<T>::iterator ntree<T>::move(ntree<T>& tree)\r
+  {\r
+    // insert a whole tree as root, removing it from source\r
+    erase();\r
+    m_root = tree.m_root;\r
+    tree.m_root = 0;\r
+    if (m_root) m_root->change_owner(this);\r
+    return ntree_iterator<T,T&,T*>(m_root);\r
+  }\r
+\r
+  template<typename T>\r
+  TYPENAME ntree<T>::iterator ntree<T>::move(const TYPENAME ntree<T>::iterator& i, unsigned offset, ntree<T>& tree)\r
+    throw(wrong_object,null_dereference,end_dereference,std::out_of_range)\r
+  {\r
+    // insert a whole tree as a child of i\r
+    i.assert_valid(this);\r
+    if (offset > children(i)) throw std::out_of_range("stlplus::ntree");\r
+    ntree_node<T>* new_node = tree.m_root;\r
+    tree.m_root = 0;\r
+    if (new_node) new_node->change_owner(this);\r
+    i.node()->m_children.insert(i.node()->m_children.begin()+offset,new_node);\r
+    new_node->m_parent = i.node();\r
+    return ntree_iterator<T,T&,T*>(new_node);\r
+  }\r
+\r
+  template<typename T>\r
+  TYPENAME ntree<T>::iterator ntree<T>::move(const TYPENAME ntree<T>::iterator& i, ntree<T>& tree)\r
+    throw(wrong_object,null_dereference,end_dereference)\r
+  {\r
+    return move(i, children(i), tree);\r
+  }\r
+\r
   template<typename T>\r
   TYPENAME ntree<T>::iterator ntree<T>::push(const TYPENAME ntree<T>::iterator& node, const T& data)\r
     throw(wrong_object,null_dereference,end_dereference)\r
This page took 0.022553 seconds and 4 git commands to generate.