\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
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
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
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
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