summaryrefslogtreecommitdiff
path: root/libxsd/xsd/cxx/parser/validating
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2009-12-02 12:26:05 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2009-12-02 12:26:05 +0200
commitee4eb695119bce96515b330f9fc83ddd67da5c62 (patch)
tree817bf37d4b0f0fb89e785004c41b4c6928228f79 /libxsd/xsd/cxx/parser/validating
parentc155e6925211747af9a13a5994c2f768c5048971 (diff)
Implement de-registering polymorphic type information
This is required for DLL/shared library unloading.
Diffstat (limited to 'libxsd/xsd/cxx/parser/validating')
-rw-r--r--libxsd/xsd/cxx/parser/validating/inheritance-map.hxx11
-rw-r--r--libxsd/xsd/cxx/parser/validating/inheritance-map.txx8
2 files changed, 18 insertions, 1 deletions
diff --git a/libxsd/xsd/cxx/parser/validating/inheritance-map.hxx b/libxsd/xsd/cxx/parser/validating/inheritance-map.hxx
index ebd1d03..b3fc35a 100644
--- a/libxsd/xsd/cxx/parser/validating/inheritance-map.hxx
+++ b/libxsd/xsd/cxx/parser/validating/inheritance-map.hxx
@@ -39,6 +39,12 @@ namespace xsd
map_[derived] = base;
}
+ void
+ erase (const C* derived)
+ {
+ map_.erase (derived);
+ }
+
bool
check (const C* derived, const ro_string<C>& base) const;
@@ -80,6 +86,10 @@ namespace xsd
struct inheritance_map_entry
{
inheritance_map_entry (const C* derived, const C* base);
+ ~inheritance_map_entry ();
+
+ private:
+ const C* derived_;
};
}
}
@@ -89,4 +99,3 @@ namespace xsd
#include <xsd/cxx/parser/validating/inheritance-map.txx>
#endif // XSD_CXX_PARSER_VALIDATING_INHERITANCE_MAP_HXX
-
diff --git a/libxsd/xsd/cxx/parser/validating/inheritance-map.txx b/libxsd/xsd/cxx/parser/validating/inheritance-map.txx
index 5e70409..7982011 100644
--- a/libxsd/xsd/cxx/parser/validating/inheritance-map.txx
+++ b/libxsd/xsd/cxx/parser/validating/inheritance-map.txx
@@ -56,9 +56,17 @@ namespace xsd
template<typename C>
inheritance_map_entry<C>::
inheritance_map_entry (const C* derived, const C* base)
+ : derived_ (derived)
{
inheritance_map_instance<C> ().insert (derived, base);
}
+
+ template<typename C>
+ inheritance_map_entry<C>::
+ ~inheritance_map_entry ()
+ {
+ inheritance_map_instance<C> ().erase (derived_);
+ }
}
}
}