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/elements.hxx | 58 +++++++++++++++++++++++++++++++--------- 1 file changed, 46 insertions(+), 12 deletions(-) (limited to 'libxsd/xsd/cxx/tree/elements.hxx') diff --git a/libxsd/xsd/cxx/tree/elements.hxx b/libxsd/xsd/cxx/tree/elements.hxx index 273e847..598a756 100644 --- a/libxsd/xsd/cxx/tree/elements.hxx +++ b/libxsd/xsd/cxx/tree/elements.hxx @@ -419,30 +419,64 @@ namespace xsd virtual void _container (container* c) { - assert (container_ == 0); + container* dr (0); if (c != 0) { - if (map_.get () != 0) - { - // Propagate our IDs to the new root. - // - container* r (c->_root ()); + dr = c->_root (); + + if (dr == 0) + dr = c; + } - if (r == 0) - r = c; + std::auto_ptr& m (dr ? dr->map_ : map_); - if (r->map_.get () != 0) + if (container_ == 0) + { + if (c != 0 && map_.get () != 0) + { + // Transfer our IDs to the new root. + // + if (m.get () != 0) { - r->map_->insert (map_->begin (), map_->end ()); + m->insert (map_->begin (), map_->end ()); map_.reset (); } else - r->map_ = map_; + m = map_; } + } + else + { + container* sr (_root ()); - container_ = c; + if (sr->map_.get () != 0) + { + // Transfer IDs that belong to this subtree. + // + for (map::iterator i (sr->map_->begin ()), e (sr->map_->end ()); + i != e;) + { + type* x (i->second); + for (; x != this && x != sr; x = x->_container ()) ; + + if (x != sr) + { + // Part of our subtree. + // + if (m.get () == 0) + m.reset (new map); + + m->insert (*i); + sr->map_->erase (i++); + } + else + ++i; + } + } } + + container_ = c; } /** -- cgit v1.1