From ee4eb695119bce96515b330f9fc83ddd67da5c62 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 2 Dec 2009 12:26:05 +0200 Subject: Implement de-registering polymorphic type information This is required for DLL/shared library unloading. --- libxsd/xsd/cxx/tree/type-serializer-map.txx | 47 ++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 5 deletions(-) (limited to 'libxsd/xsd/cxx/tree/type-serializer-map.txx') diff --git a/libxsd/xsd/cxx/tree/type-serializer-map.txx b/libxsd/xsd/cxx/tree/type-serializer-map.txx index 797cb13..232e239 100644 --- a/libxsd/xsd/cxx/tree/type-serializer-map.txx +++ b/libxsd/xsd/cxx/tree/type-serializer-map.txx @@ -263,6 +263,13 @@ namespace xsd template void type_serializer_map:: + unregister_type (const type_id& tid) + { + type_map_.erase (&tid); + } + + template + void type_serializer_map:: register_element (const qualified_name& root, const qualified_name& subst, const type_id& tid, @@ -273,6 +280,21 @@ namespace xsd template void type_serializer_map:: + unregister_element (const qualified_name& root, const type_id& tid) + { + typename element_map::iterator i (element_map_.find (root)); + + if (i != element_map_.end ()) + { + i->second.erase (&tid); + + if (i->second.empty ()) + element_map_.erase (root); + } + } + + template + void type_serializer_map:: serialize (const C* name, // element name const C* ns, // element namespace bool global, @@ -508,7 +530,6 @@ namespace xsd e << static_cast (x); } - // type_serializer_initializer // template @@ -523,10 +544,18 @@ namespace xsd template type_serializer_initializer:: - type_serializer_initializer (const C* root_name, - const C* root_ns, - const C* subst_name, - const C* subst_ns) + ~type_serializer_initializer () + { + type_serializer_map_instance ().unregister_type (typeid (T)); + } + + // element_serializer_initializer + // + template + element_serializer_initializer:: + element_serializer_initializer (const C* root_name, const C* root_ns, + const C* subst_name, const C* subst_ns) + : root_name_ (root_name), root_ns_ (root_ns) { type_serializer_map_instance ().register_element ( xml::qualified_name (root_name, root_ns), @@ -534,6 +563,14 @@ namespace xsd typeid (T), &serializer_impl); } + + template + element_serializer_initializer:: + ~element_serializer_initializer () + { + type_serializer_map_instance ().unregister_element ( + xml::qualified_name (root_name_, root_ns_), typeid (T)); + } } } } -- cgit v1.1