From f60df03e3cedb86508645357e17003eb9281f31a Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 22 Jan 2010 15:40:12 +0200 Subject: Add support for detaching subtrees in C++/Tree New option: --generate-detach. New test: cxx/tree/detach. --- libxsd/xsd/cxx/tree/containers.hxx | 59 +++++++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) (limited to 'libxsd/xsd/cxx/tree/containers.hxx') diff --git a/libxsd/xsd/cxx/tree/containers.hxx b/libxsd/xsd/cxx/tree/containers.hxx index 1399c5d..8ea04d2 100644 --- a/libxsd/xsd/cxx/tree/containers.hxx +++ b/libxsd/xsd/cxx/tree/containers.hxx @@ -6,7 +6,6 @@ #ifndef XSD_CXX_TREE_CONTAINERS_HXX #define XSD_CXX_TREE_CONTAINERS_HXX - #include // std::ptrdiff_t #include #include @@ -169,6 +168,15 @@ namespace xsd return x_ != 0; } + std::auto_ptr + detach () + { + T* x (x_); + x->_container (0); + x_ = 0; + return std::auto_ptr (x); + } + protected: T* x_; flags flags_; @@ -332,6 +340,15 @@ namespace xsd void reset (); + std::auto_ptr + detach () + { + T* x (x_); + x->_container (0); + x_ = 0; + return std::auto_ptr (x); + } + private: void true_ (); @@ -809,11 +826,25 @@ namespace xsd } type* + operator-> () const + { + return x_; + } + + type* get () const { return x_; } + type* + release () + { + type* x (x_); + x_ = 0; + return x; + } + private: mutable type* x_; }; @@ -1247,6 +1278,19 @@ namespace xsd v_.pop_back (); } + std::auto_ptr + detach_back (bool pop = true) + { + ptr& p (v_.back ()); + p->_container (0); + T* x (static_cast (p.release ())); + + if (pop) + v_.pop_back (); + + return std::auto_ptr (x); + } + iterator insert (iterator position, const T& x) { @@ -1289,6 +1333,19 @@ namespace xsd return iterator (v_.erase (begin.base (), end.base ())); } + iterator + detach (iterator position, std::auto_ptr& r, bool erase = true) + { + ptr& p (*position.base ()); + p->_container (0); + r.reset (static_cast (p.release ())); + + if (erase) + return iterator (v_.erase (position.base ())); + else + return ++position; + } + // Note that the container object of the two sequences being // swapped should be the same. // -- cgit v1.1