$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: ramey_at_[hidden]
Date: 2007-11-22 01:09:41
Author: ramey
Date: 2007-11-22 01:09:40 EST (Thu, 22 Nov 2007)
New Revision: 41294
URL: http://svn.boost.org/trac/boost/changeset/41294
Log:
tested with statically loaded dlls
Text files modified: 
   branches/serialization_next_release/boost/libs/serialization/src/basic_iarchive.cpp            |    25 +++++---                                
   branches/serialization_next_release/boost/libs/serialization/src/basic_oarchive.cpp            |    11 +++                                     
   branches/serialization_next_release/boost/libs/serialization/src/codecvt_null.cpp              |     1                                         
   branches/serialization_next_release/boost/libs/serialization/src/extended_type_info.cpp        |   112 +++++++++++++++++++++++---------------- 
   branches/serialization_next_release/boost/libs/serialization/src/extended_type_info_typeid.cpp |    73 +++++++++++++++++--------               
   branches/serialization_next_release/boost/libs/serialization/src/void_cast.cpp                 |     6 -                                       
   6 files changed, 143 insertions(+), 85 deletions(-)
Modified: branches/serialization_next_release/boost/libs/serialization/src/basic_iarchive.cpp
==============================================================================
--- branches/serialization_next_release/boost/libs/serialization/src/basic_iarchive.cpp	(original)
+++ branches/serialization_next_release/boost/libs/serialization/src/basic_iarchive.cpp	2007-11-22 01:09:40 EST (Thu, 22 Nov 2007)
@@ -23,20 +23,23 @@
 } // namespace std
 #endif
 
-#define BOOST_ARCHIVE_SOURCE
-#include <boost/archive/detail/auto_link_archive.hpp>
-
 #include <boost/limits.hpp>
 #include <boost/state_saver.hpp>
 #include <boost/throw_exception.hpp>
+#include <boost/serialization/tracking.hpp>
+
+#include <boost/archive/archive_exception.hpp>
+
+#define BOOST_ARCHIVE_SOURCE
+#define BOOST_SERIALIZATION_SOURCE
 
+#include <boost/archive/detail/decl.hpp>
+#include <boost/archive/basic_archive.hpp>
 #include <boost/archive/detail/basic_iserializer.hpp>
 #include <boost/archive/detail/basic_pointer_iserializer.hpp>
 #include <boost/archive/detail/basic_iarchive.hpp>
-#include <boost/archive/archive_exception.hpp>
 
-#include <boost/serialization/tracking.hpp>
-#include <boost/serialization/extended_type_info.hpp>
+#include <boost/archive/detail/auto_link_archive.hpp>
 
 using namespace boost::serialization;
 
@@ -44,9 +47,6 @@
 namespace archive {
 namespace detail {
 
-class basic_iserializer;
-class basic_pointer_iserializer;
-
 class basic_iarchive_impl {
     friend class basic_iarchive;
     version_type m_archive_library_version;
@@ -486,8 +486,15 @@
     return bpis_ptr;
 }
 
+} // namespace detail
+} // namespace archive
+} // namespace boost
+
 //////////////////////////////////////////////////////////////////////
 // implementation of basic_iarchive functions
+namespace boost {
+namespace archive {
+namespace detail {
 
 BOOST_ARCHIVE_DECL(void)
 basic_iarchive::next_object_pointer(void *t){
Modified: branches/serialization_next_release/boost/libs/serialization/src/basic_oarchive.cpp
==============================================================================
--- branches/serialization_next_release/boost/libs/serialization/src/basic_oarchive.cpp	(original)
+++ branches/serialization_next_release/boost/libs/serialization/src/basic_oarchive.cpp	2007-11-22 01:09:40 EST (Thu, 22 Nov 2007)
@@ -20,8 +20,9 @@
 // including this here to work around an ICC in intel 7.0
 // normally this would be part of basic_oarchive.hpp below.
 #define BOOST_ARCHIVE_SOURCE
-#include <boost/archive/basic_archive.hpp>
+#define BOOST_SERIALIZATION_SOURCE
 
+#include <boost/archive/basic_archive.hpp>
 #include <boost/archive/detail/basic_oserializer.hpp>
 #include <boost/archive/detail/basic_pointer_oserializer.hpp>
 #include <boost/archive/detail/basic_oarchive.hpp>
@@ -385,9 +386,17 @@
     stored_pointers.insert(oid);
 }
 
+} // namespace detail
+} // namespace archive
+} // namespace boost
+
 //////////////////////////////////////////////////////////////////////
 // implementation of basic_oarchive functions
 
+namespace boost {
+namespace archive {
+namespace detail {
+
 BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) 
 basic_oarchive::basic_oarchive(unsigned int flags)
     : pimpl(new basic_oarchive_impl(flags))
Modified: branches/serialization_next_release/boost/libs/serialization/src/codecvt_null.cpp
==============================================================================
--- branches/serialization_next_release/boost/libs/serialization/src/codecvt_null.cpp	(original)
+++ branches/serialization_next_release/boost/libs/serialization/src/codecvt_null.cpp	2007-11-22 01:09:40 EST (Thu, 22 Nov 2007)
@@ -7,6 +7,7 @@
 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
 // http://www.boost.org/LICENSE_1_0.txt)
 
+#define BOOST_ARCHIVE_SOURCE
 #include <boost/archive/codecvt_null.hpp>
 
 // codecvt implementation for passing wchar_t objects to char output
Modified: branches/serialization_next_release/boost/libs/serialization/src/extended_type_info.cpp
==============================================================================
--- branches/serialization_next_release/boost/libs/serialization/src/extended_type_info.cpp	(original)
+++ branches/serialization_next_release/boost/libs/serialization/src/extended_type_info.cpp	2007-11-22 01:09:40 EST (Thu, 22 Nov 2007)
@@ -19,6 +19,8 @@
 
 #include <boost/config.hpp> // msvc needs this to suppress warning
 
+#include "bidirectional_map.hpp"
+
 #include <cstring>
 #if defined(BOOST_NO_STDC_NAMESPACE)
 namespace std{ using ::strcmp; }
@@ -42,25 +44,38 @@
         const extended_type_info * lhs, 
         const extended_type_info * rhs
     ) const {
-        return *lhs < *rhs;
+        const char * l = lhs->get_key();
+        assert(NULL != l);
+        const char * r = rhs->get_key();
+        assert(NULL != r);
+        // performance shortcut
+        // shortcut to exploit string pooling
+        if(l == r)
+            return false;
+        // for exported types, use the string key so that
+        // multiple instances in different translation units
+        // can be matched up
+        return -1 == std::strcmp(l, r);
     }
 };
-typedef std::set<
-    const extended_type_info *, 
-    key_compare
-> ktmap;
 
-//template ktmap;
+typedef std::multiset<const extended_type_info *, key_compare> ktmap;
 
 class extended_type_info_arg : public extended_type_info
 {
 public:
-    extended_type_info_arg(const char * key){
+    extended_type_info_arg(const char * key) :
+        extended_type_info(NULL)
+    {
         m_key = key;
     }
     ~extended_type_info_arg(){
         m_key = NULL;
     }
+    virtual bool less_than(const extended_type_info &rhs) const {
+        key_compare kc;
+        return kc(this, & rhs);
+    }
 };
 
 } // namespace detail
@@ -69,17 +84,31 @@
 extended_type_info::key_register(const char *key) {
     assert(NULL != key);
     m_key = key;
-    std::pair<detail::ktmap::const_iterator, bool> result;
-    // prohibit duplicates and multiple registrations
-    result = singleton<detail::ktmap>::get_mutable_instance().insert(this);
-    assert(result.second);
-    // would like to throw and exception here but I don't
-    // have one conveniently defined
-    // throw(?)
+    singleton<detail::ktmap>::get_mutable_instance().insert(this);
+}
+
+BOOST_SERIALIZATION_DECL(void)  
+extended_type_info::key_unregister() {
+    assert(NULL != m_key);
+    detail::ktmap & x = singleton<detail::ktmap>::get_mutable_instance();
+    detail::ktmap::iterator start = x.lower_bound(this);
+    detail::ktmap::iterator end = x.upper_bound(this);
+    assert(start != end);
+
+    // remove entry in map which corresponds to this type
+    do{
+        if(this == *start){
+            x.erase(start);
+            break;
+        }
+    }while(++start != end);
+
+    m_key = NULL;
 }
 
 BOOST_SERIALIZATION_DECL(const extended_type_info *) 
 extended_type_info::find(const char *key) {
+    assert(NULL != key);
     const detail::ktmap & k = singleton<detail::ktmap>::get_const_instance();
     const detail::extended_type_info_arg eti_key(key);
     const detail::ktmap::const_iterator it = k.find(& eti_key);
@@ -88,7 +117,11 @@
     return *(it);
 }
 
-extended_type_info::extended_type_info() : 
+BOOST_SERIALIZATION_DECL(BOOST_PP_EMPTY())  
+extended_type_info::extended_type_info(
+    const unsigned int type_info_key
+) :
+    m_type_info_key(type_info_key),
     m_key(NULL)
 {
     // make sure that the ktmap is instantiated before 
@@ -98,44 +131,31 @@
 
 BOOST_SERIALIZATION_DECL(BOOST_PP_EMPTY()) 
 extended_type_info::~extended_type_info(){
-    if(NULL != m_key){
-        unsigned int erase_count;
-        erase_count = 
-            singleton<detail::ktmap>::get_mutable_instance().erase(this);
-        assert(1 == erase_count);
-    }
+    if(NULL == m_key)
+        return;
+    key_unregister();
 }
 
-BOOST_SERIALIZATION_DECL(bool)  
-operator==(
-    const extended_type_info & lhs, 
-    const extended_type_info & rhs
-){
-    return (& lhs == & rhs);
+BOOST_SERIALIZATION_DECL(bool)
+extended_type_info::operator<(const extended_type_info &rhs) const {
+    if(m_type_info_key == rhs.m_type_info_key){
+        return less_than(rhs);
+    }
+    if(m_type_info_key < rhs.m_type_info_key)
+        return true;
+    return false;
 }
 
 BOOST_SERIALIZATION_DECL(bool)
-operator<(
-    const extended_type_info & lhs, 
-    const extended_type_info & rhs
-){
-    // shortcut to exploit string pooling
-    const char * l = lhs.get_key();
-    const char * r = rhs.get_key();
-    // neither have been exported
-    if(NULL == l && NULL == r)
-        // order by address
-        return & lhs < & rhs;
-    // exported types are "higher" than non-exported types
-    if(NULL == l)
+extended_type_info::operator==(const extended_type_info &rhs) const {
+    if(this == & rhs)
         return true;
-    if(NULL == r)
+    if(*this < rhs)
         return false;
-    // for exported types, use the string key so that
-    // multiple instances in different translation units
-    // can be matched up
-    return -1 == std::strcmp(l, r); 
-}
+    if(rhs < *this)
+        return false;
+    return true;
+};
 
 } // namespace serialization
 } // namespace boost
Modified: branches/serialization_next_release/boost/libs/serialization/src/extended_type_info_typeid.cpp
==============================================================================
--- branches/serialization_next_release/boost/libs/serialization/src/extended_type_info_typeid.cpp	(original)
+++ branches/serialization_next_release/boost/libs/serialization/src/extended_type_info_typeid.cpp	2007-11-22 01:09:40 EST (Thu, 22 Nov 2007)
@@ -25,6 +25,8 @@
 namespace serialization { 
 namespace detail {
 
+#define EXTENDED_TYPE_INFO_TYPE_KEY 1
+
 struct type_compare
 {
     bool
@@ -32,45 +34,68 @@
         const extended_type_info_typeid_0 * lhs,
         const extended_type_info_typeid_0 * rhs
     ) const {
-        const std::type_info & l = lhs->get_typeid();
-        const std::type_info & r = rhs->get_typeid();
-        return l.before(r);
+        return lhs->less_than(*rhs);
     }
 };
-typedef std::set<
+
+typedef std::multiset<
     const extended_type_info_typeid_0 *,
     type_compare
 > tkmap;
-    
-//template tkmap;
+
+BOOST_SERIALIZATION_DECL(bool) 
+extended_type_info_typeid_0::less_than(
+    const boost::serialization::extended_type_info & rhs
+) const {
+    //assert(this->m_type_info_key == rhs.m_type_info_key);
+    return m_ti->before(
+        *(static_cast<const extended_type_info_typeid_0 &>(rhs).m_ti)
+    );
+}
+
+BOOST_SERIALIZATION_DECL(BOOST_PP_EMPTY())
+extended_type_info_typeid_0::extended_type_info_typeid_0() :
+    extended_type_info(EXTENDED_TYPE_INFO_TYPE_KEY),
+    m_ti(NULL)
+{}
+
+BOOST_SERIALIZATION_DECL(BOOST_PP_EMPTY())
+extended_type_info_typeid_0::~extended_type_info_typeid_0()
+{}
 
 BOOST_SERIALIZATION_DECL(void) 
 extended_type_info_typeid_0::type_register(const std::type_info & ti){
     m_ti = & ti;
-    std::pair<tkmap::const_iterator, bool> result;
-    result = singleton<tkmap>::get_mutable_instance().insert(this);
-    assert(result.second);
-    // would like to throw and exception here but I don't
-    // have one conveniently defined
-    // throw(?)
+    singleton<tkmap>::get_mutable_instance().insert(this);
 }
 
-BOOST_SERIALIZATION_DECL(BOOST_PP_EMPTY()) 
-extended_type_info_typeid_0::~extended_type_info_typeid_0()
+BOOST_SERIALIZATION_DECL(void) 
+extended_type_info_typeid_0::type_unregister()
 {
-    if(NULL != m_ti){
-        // remove entries in maps which correspond to this type
-        unsigned int erase_count;
-        erase_count 
-            = singleton<tkmap>::get_mutable_instance().erase(this);
-        assert(1 == erase_count);
-    }
+    if(NULL == m_ti)
+        return;
+    
+    tkmap & x = singleton<tkmap>::get_mutable_instance();
+    tkmap::iterator start = x.lower_bound(this);
+    tkmap::iterator end = x.upper_bound(this);
+    assert(start != end);
+
+    // remove entry in map which corresponds to this type
+    do{
+        if(this == *start){
+            x.erase(start);
+            break;
+        }
+    }while(++start != end);
+
+    m_ti = NULL;
 }
 
 // this derivation is used for creating search arguments
 class extended_type_info_typeid_arg : 
     public extended_type_info_typeid_0
 {
+private:
 public:
     extended_type_info_typeid_arg(const std::type_info & ti){ 
         // note absense of self register and key as this is used only as
@@ -84,10 +109,10 @@
 };
 
 BOOST_SERIALIZATION_DECL(const extended_type_info *)
-extended_type_info_typeid_0::get_derived_extended_type_info(
+extended_type_info_typeid_0::get_extended_type_info(
     const std::type_info & ti
-){
-    detail::extended_type_info_typeid_arg etia(ti);
+) const {
+	detail::extended_type_info_typeid_arg etia(ti);
     const tkmap & t = singleton<tkmap>::get_const_instance();
     const tkmap::const_iterator it = t.find(& etia);
     if(t.end() == it)
Modified: branches/serialization_next_release/boost/libs/serialization/src/void_cast.cpp
==============================================================================
--- branches/serialization_next_release/boost/libs/serialization/src/void_cast.cpp	(original)
+++ branches/serialization_next_release/boost/libs/serialization/src/void_cast.cpp	2007-11-22 01:09:40 EST (Thu, 22 Nov 2007)
@@ -22,9 +22,9 @@
 #include <cassert>
 
 // BOOST
+#define BOOST_SERIALIZATION_SOURCE
 #include <boost/serialization/singleton.hpp>
 #include <boost/serialization/extended_type_info.hpp>
-#define BOOST_SERIALIZATION_SOURCE
 #include <boost/serialization/void_cast.hpp>
 
 namespace boost { 
@@ -41,8 +41,6 @@
     ) const {
         if( lhs->m_derived < rhs->m_derived )
             return true;
-        if( rhs->m_derived < lhs->m_derived)
-            return false;   
         if( lhs->m_base < rhs->m_base )
             return true;
         return false;
@@ -52,8 +50,6 @@
 typedef std::set<const void_caster *, void_caster_compare> set_type;
 typedef boost::serialization::singleton<set_type> void_caster_registry;
 
-//template void_caster_registry;
-
 // implementation of void caster base class
 BOOST_SERIALIZATION_DECL(BOOST_PP_EMPTY())
 void_caster::void_caster(