X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2Fstlplus%2Fcontainers%2Fntree.tpp;h=9236327cea971ce7d95be461a051bf19c5dbce61;hp=6fd019d9f30b7eee6fe71ebd682e9667172060c4;hb=4f6e4488a55f7e3ba3f7485d78177f793c0eab9a;hpb=6b0a0d0efafe34d48ab344fca3b479553bd4e62c diff --git a/src/stlplus/containers/ntree.tpp b/src/stlplus/containers/ntree.tpp index 6fd019d..9236327 100644 --- a/src/stlplus/containers/ntree.tpp +++ b/src/stlplus/containers/ntree.tpp @@ -2,7 +2,7 @@ // Author: Andy Rushton // Copyright: (c) Southampton University 1999-2004 -// (c) Andy Rushton 2004-2009 +// (c) Andy Rushton 2004 onwards // License: BSD License, see ../docs/license.html //////////////////////////////////////////////////////////////////////////////// @@ -684,7 +684,9 @@ namespace stlplus TYPENAME ntree::iterator ntree::insert(const T& data) { // insert a new node as the root - return insert(ntree_iterator(this), 0, data); + erase(); + m_root = new ntree_node(this,data); + return ntree_iterator(m_root); } template @@ -692,31 +694,38 @@ namespace stlplus throw(wrong_object,null_dereference,end_dereference,std::out_of_range) { // if i is the end iterator, this means insert a new root - if (i.end()) - erase(); - else - { - i.assert_valid(this); - if (offset > children(i)) throw std::out_of_range("stlplus::ntree"); - } + // if (i.end()) + // return insert(data); + // otherwise, insert a new child + i.assert_valid(this); + if (offset > children(i)) throw std::out_of_range("stlplus::ntree"); ntree_node* new_node = new ntree_node(this,data); - if (i.end()) - { - m_root = new_node; - } - else - { - i.node()->m_children.insert(i.node()->m_children.begin()+offset,new_node); - new_node->m_parent = i.node(); - } + i.node()->m_children.insert(i.node()->m_children.begin()+offset,new_node); + new_node->m_parent = i.node(); return ntree_iterator(new_node); } + template + TYPENAME ntree::iterator ntree::insert(const TYPENAME ntree::iterator& i, const T& data) + throw(wrong_object,null_dereference,end_dereference) + { + return insert(i, children(i), data); + } + template TYPENAME ntree::iterator ntree::append(const TYPENAME ntree::iterator& i, const T& data) throw(wrong_object,null_dereference,end_dereference) { - return insert(i, i.node()->m_children.size(), data); + return insert(i, children(i), data); + } + + template + TYPENAME ntree::iterator ntree::insert(const ntree& tree) + { + // insert a whole tree as root + erase(); + m_root = ntree_copy(this, tree.m_root); + return ntree_iterator(m_root); } template @@ -732,6 +741,13 @@ namespace stlplus return ntree_iterator(new_node); } + template + TYPENAME ntree::iterator ntree::insert(const TYPENAME ntree::iterator& i, const ntree& tree) + throw(wrong_object,null_dereference,end_dereference) + { + return insert(i, children(i), tree); + } + template TYPENAME ntree::iterator ntree::append(const TYPENAME ntree::iterator& i, const ntree& tree) throw(wrong_object,null_dereference,end_dereference) @@ -739,6 +755,39 @@ namespace stlplus return insert(i, children(i), tree); } + template + TYPENAME ntree::iterator ntree::move(ntree& tree) + { + // insert a whole tree as root, removing it from source + erase(); + m_root = tree.m_root; + tree.m_root = 0; + if (m_root) m_root->change_owner(this); + return ntree_iterator(m_root); + } + + template + TYPENAME ntree::iterator ntree::move(const TYPENAME ntree::iterator& i, unsigned offset, ntree& tree) + throw(wrong_object,null_dereference,end_dereference,std::out_of_range) + { + // insert a whole tree as a child of i + i.assert_valid(this); + if (offset > children(i)) throw std::out_of_range("stlplus::ntree"); + ntree_node* new_node = tree.m_root; + tree.m_root = 0; + if (new_node) new_node->change_owner(this); + i.node()->m_children.insert(i.node()->m_children.begin()+offset,new_node); + new_node->m_parent = i.node(); + return ntree_iterator(new_node); + } + + template + TYPENAME ntree::iterator ntree::move(const TYPENAME ntree::iterator& i, ntree& tree) + throw(wrong_object,null_dereference,end_dereference) + { + return move(i, children(i), tree); + } + template TYPENAME ntree::iterator ntree::push(const TYPENAME ntree::iterator& node, const T& data) throw(wrong_object,null_dereference,end_dereference)