diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2009-12-02 12:26:05 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2009-12-02 12:26:05 +0200 |
commit | ee4eb695119bce96515b330f9fc83ddd67da5c62 (patch) | |
tree | 817bf37d4b0f0fb89e785004c41b4c6928228f79 /libxsd/xsd/cxx/parser | |
parent | c155e6925211747af9a13a5994c2f768c5048971 (diff) |
Implement de-registering polymorphic type information
This is required for DLL/shared library unloading.
Diffstat (limited to 'libxsd/xsd/cxx/parser')
-rw-r--r-- | libxsd/xsd/cxx/parser/substitution-map.hxx | 13 | ||||
-rw-r--r-- | libxsd/xsd/cxx/parser/substitution-map.txx | 8 | ||||
-rw-r--r-- | libxsd/xsd/cxx/parser/validating/inheritance-map.hxx | 11 | ||||
-rw-r--r-- | libxsd/xsd/cxx/parser/validating/inheritance-map.txx | 8 |
4 files changed, 38 insertions, 2 deletions
diff --git a/libxsd/xsd/cxx/parser/substitution-map.hxx b/libxsd/xsd/cxx/parser/substitution-map.hxx index 60c0ec8..0379164 100644 --- a/libxsd/xsd/cxx/parser/substitution-map.hxx +++ b/libxsd/xsd/cxx/parser/substitution-map.hxx @@ -137,6 +137,12 @@ namespace xsd map_.insert (std::pair<key, value> (k, v)); } + void + erase (const C* member_ns, const C* member_name) + { + map_.erase (key (member_ns, member_name)); + } + // Check and get the type set if found. // bool @@ -219,6 +225,12 @@ namespace xsd const C* root_ns, const C* root_name, const C* member_type); + + ~substitution_map_entry (); + + private: + const C* member_ns_; + const C* member_name_; }; } } @@ -227,4 +239,3 @@ namespace xsd #include <xsd/cxx/parser/substitution-map.txx> #endif // XSD_CXX_PARSER_SUBSTITUTION_MAP_HXX - diff --git a/libxsd/xsd/cxx/parser/substitution-map.txx b/libxsd/xsd/cxx/parser/substitution-map.txx index c9d4cb1..63d88b9 100644 --- a/libxsd/xsd/cxx/parser/substitution-map.txx +++ b/libxsd/xsd/cxx/parser/substitution-map.txx @@ -67,10 +67,18 @@ namespace xsd const C* root_ns, const C* root_name, const C* member_type) + : member_ns_ (member_ns), member_name_ (member_name) { substitution_map_instance<C> ().insert ( member_ns, member_name, root_ns, root_name, member_type); } + + template<typename C> + substitution_map_entry<C>:: + ~substitution_map_entry () + { + substitution_map_instance<C> ().erase (member_ns_, member_name_); + } } } } 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_); + } } } } |