$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r54754 - trunk/libs/serialization/src
From: ramey_at_[hidden]
Date: 2009-07-07 00:01:59
Author: ramey
Date: 2009-07-07 00:01:59 EDT (Tue, 07 Jul 2009)
New Revision: 54754
URL: http://svn.boost.org/trac/boost/changeset/54754
Log:
Fixed misc bugs
void cast
added dll tests
Text files modified: 
   trunk/libs/serialization/src/extended_type_info.cpp |    10 ++++++++                                
   trunk/libs/serialization/src/void_cast.cpp          |    46 ++++++++++++++++++++++++++++++--------- 
   2 files changed, 45 insertions(+), 11 deletions(-)
Modified: trunk/libs/serialization/src/extended_type_info.cpp
==============================================================================
--- trunk/libs/serialization/src/extended_type_info.cpp	(original)
+++ trunk/libs/serialization/src/extended_type_info.cpp	2009-07-07 00:01:59 EDT (Tue, 07 Jul 2009)
@@ -62,6 +62,16 @@
 
 class extended_type_info_arg : public extended_type_info
 {
+    virtual bool
+    is_less_than(const extended_type_info & /*rhs*/) const {
+        assert(false);
+        return false;
+    };
+    virtual bool
+    is_equal(const extended_type_info & /*rhs*/) const {
+        assert(false);
+        return false;
+    };
 public:
     extended_type_info_arg(const char * key) :
         extended_type_info()
Modified: trunk/libs/serialization/src/void_cast.cpp
==============================================================================
--- trunk/libs/serialization/src/void_cast.cpp	(original)
+++ trunk/libs/serialization/src/void_cast.cpp	2009-07-07 00:01:59 EDT (Tue, 07 Jul 2009)
@@ -34,6 +34,27 @@
 namespace serialization {
 namespace void_cast_detail {
 
+// note that void_casters are keyed on value of
+// member extended type info records - NOT their
+// addresses.  This is necessary in order for the
+// void cast operations to work across dll and exe
+// module boundries.
+bool void_caster::operator<(const void_caster & rhs) const {
+    // include short cut to save time and eliminate
+    // problems when when base class aren't virtual
+    if(m_derived != rhs.m_derived){
+        if(*m_derived < *rhs.m_derived)
+            return true;
+        if(*rhs.m_derived < *m_derived)
+            return false;
+    }
+    // m_derived == rhs.m_derived
+    if(m_base != rhs.m_base)
+        return *m_base < *rhs.m_base;
+    else
+        return false;
+}
+
 struct void_caster_compare {
     bool operator()(const void_caster * lhs, const void_caster * rhs) const {
         return *lhs < *rhs;
@@ -105,9 +126,11 @@
                 const void * t_new;
                 t_new = void_downcast(*(*it)->m_base, *m_base, t);
                 // if we were successful
-                if(NULL != t_new)
+                if(NULL != t_new){
                     // recast to our derived
-                    return (*it)->downcast(t_new);
+                    const void_caster * vc = *it;
+                    return vc->downcast(t_new);
+                }
             }
         }
     }
@@ -170,17 +193,16 @@
     s.insert(this);
 
     // generate all implied void_casts.
-
     void_cast_detail::set_type::const_iterator it;
     for(it = s.begin(); it != s.end(); ++it){
-        if(m_derived == (*it)->m_base)
+        if(* m_derived == * (*it)->m_base)
             new void_caster_shortcut(
                 (*it)->m_derived, 
                 m_base,
                 m_difference + (*it)->m_difference,
                 includes_virtual_base
             );
-        if((*it)->m_derived == m_base)
+        if(* (*it)->m_derived == * m_base)
             new void_caster_shortcut(
                 m_derived, 
                 (*it)->m_base, 
@@ -198,14 +220,18 @@
     void_cast_detail::set_type & s 
         = void_caster_registry::get_mutable_instance();
 
-    // delete all implied void_casts.
+    // delete all shortcuts which use this primitive
     void_cast_detail::set_type::iterator it;
     for(it = s.begin(); it != s.end(); ++it){
         if((*it)->is_shortcut()){
             if(m_derived == (*it)->m_base
             || (*it)->m_derived == m_base){
+                // save pointer to set member
+                const void_caster * vc = *it;
+                // and erase first
                 s.erase(it);
-                delete *it;
+                // since recursion could invalidate it
+                delete vc;
                 it = s.begin();
             }
         }
@@ -219,8 +245,6 @@
     s.erase(it);
 }
 
-
-
 } // namespace void_cast_detail
 
 // Given a void *, assume that it really points to an instance of one type
@@ -240,7 +264,7 @@
     // check to see if base/derived pair is found in the registry
     const void_cast_detail::set_type & s
         = void_cast_detail::void_caster_registry::get_const_instance();
-    void_cast_detail::void_caster_argument ca(& derived, & base);
+    const void_cast_detail::void_caster_argument ca(& derived, & base);
 
     void_cast_detail::set_type::const_iterator it;
     it = s.find(& ca);
@@ -263,7 +287,7 @@
     // check to see if base/derived pair is found in the registry
     const void_cast_detail::set_type & s
         = void_cast_detail::void_caster_registry::get_const_instance();
-    void_cast_detail::void_caster_argument ca(& derived, & base);
+    const void_cast_detail::void_caster_argument ca(& derived, & base);
 
     void_cast_detail::set_type::const_iterator it;
     it = s.find(&ca);