summaryrefslogtreecommitdiff
path: root/libxsd/xsd/cxx/tree/elements.hxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2010-01-22 15:40:12 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2010-01-22 15:40:12 +0200
commitf60df03e3cedb86508645357e17003eb9281f31a (patch)
treed65c9cd62a6500b7d0f8303caf64797d08f508c0 /libxsd/xsd/cxx/tree/elements.hxx
parent55ffb84acf75d3fa475dfe21d053e404eb753e5a (diff)
Add support for detaching subtrees in C++/Tree
New option: --generate-detach. New test: cxx/tree/detach.
Diffstat (limited to 'libxsd/xsd/cxx/tree/elements.hxx')
-rw-r--r--libxsd/xsd/cxx/tree/elements.hxx58
1 files changed, 46 insertions, 12 deletions
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<map>& 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;
}
/**