$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: ramey_at_[hidden]
Date: 2007-09-26 21:53:47
Author: ramey
Date: 2007-09-26 21:53:46 EDT (Wed, 26 Sep 2007)
New Revision: 39562
URL: http://svn.boost.org/trac/boost/changeset/39562
Log:
improvements to extended type info system - unfortunately, these break the export.
Text files modified: 
   branches/serialization_next_release/boost/boost/serialization/base_object.hpp                |    28 +++++++---------                        
   branches/serialization_next_release/boost/boost/serialization/config.hpp                     |     2                                         
   branches/serialization_next_release/boost/boost/serialization/export.hpp                     |     9 ++---                                   
   branches/serialization_next_release/boost/boost/serialization/extended_type_info.hpp         |    54 +++++++++++----------------------       
   branches/serialization_next_release/boost/boost/serialization/extended_type_info_no_rtti.hpp |    61 +++++--------------------------------   
   branches/serialization_next_release/boost/boost/serialization/extended_type_info_typeid.hpp  |    65 ++++++++++++++++++++------------------- 
   branches/serialization_next_release/boost/boost/serialization/optional.hpp                   |     2                                         
   branches/serialization_next_release/boost/boost/serialization/void_cast.hpp                  |    41 +++++++++----------------               
   8 files changed, 94 insertions(+), 168 deletions(-)
Modified: branches/serialization_next_release/boost/boost/serialization/base_object.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/serialization/base_object.hpp	(original)
+++ branches/serialization_next_release/boost/boost/serialization/base_object.hpp	2007-09-26 21:53:46 EDT (Wed, 26 Sep 2007)
@@ -27,10 +27,10 @@
 #include <boost/mpl/int.hpp>
 #include <boost/type_traits/is_base_and_derived.hpp>
 #include <boost/type_traits/is_pointer.hpp>
+#include <boost/type_traits/is_polymorphic.hpp>
 #include <boost/type_traits/is_const.hpp>
 
 #include <boost/static_assert.hpp>
-#include <boost/serialization/type_info_implementation.hpp>
 #include <boost/serialization/force_include.hpp>
 #include <boost/serialization/void_cast_fwd.hpp>
 
@@ -45,33 +45,29 @@
   {
       static void const* execute(mpl::false_) { return 0; }
 
-      static void const* execute(mpl::true_)
-      {
-          return &void_cast_register((Derived const*)0, (Base const*)0);
+      static void const* execute(mpl::true_){
+          return & void_cast_register((Derived const*)0, (Base const*)0);
       }
             
-      static void const* invoke()
-      {
-          typedef mpl::bool_<
-              type_info_implementation<Base>::type::is_polymorphic::value
-          > is_polymorphic;
-          
-          return execute(is_polymorphic());
+      static void const* invoke(){
+          return execute(
+              BOOST_DEDUCED_TYPENAME boost::is_polymorphic<Base>::type()
+          );
       }
   };
 
   // get the base type for a given derived type
   // preserving the const-ness
-  template<class B, class D>
+  template<class Base, class Derived>
   struct base_cast
   {
       typedef BOOST_DEDUCED_TYPENAME
       mpl::if_<
-          is_const<D>,
-          const B,
-          B
+          is_const<Derived>,
+          const Base,
+          Base
       >::type type;
-      BOOST_STATIC_ASSERT(is_const<type>::value == is_const<D>::value);
+      BOOST_STATIC_ASSERT(is_const<type>::value == is_const<Derived>::value);
   };
 } // namespace detail
 
Modified: branches/serialization_next_release/boost/boost/serialization/config.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/serialization/config.hpp	(original)
+++ branches/serialization_next_release/boost/boost/serialization/config.hpp	2007-09-26 21:53:46 EDT (Wed, 26 Sep 2007)
@@ -65,7 +65,7 @@
 //
 // And include the header that does the work:
 //
-#include <boost/config/auto_link.hpp>
+#include <boost/archive/detail/auto_link_archive.hpp>
 
 #endif  // !defined(BOOST_SERIALIZATION_SOURCE) && !defined(BOOST_ARCHIVE_SOURCE)
 
Modified: branches/serialization_next_release/boost/boost/serialization/export.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/serialization/export.hpp	(original)
+++ branches/serialization_next_release/boost/boost/serialization/export.hpp	2007-09-26 21:53:46 EDT (Wed, 26 Sep 2007)
@@ -26,8 +26,8 @@
 #include <boost/config.hpp>
 #include <boost/static_assert.hpp>
 #include <boost/preprocessor/stringize.hpp>
+#include <boost/type_traits/is_polymorphic.hpp>
 
-#include <boost/archive/detail/dynamically_initialized.hpp>
 #include <boost/serialization/type_info_implementation.hpp>
 #include <boost/serialization/is_abstract.hpp>
 #include <boost/serialization/force_include.hpp>
@@ -76,7 +76,7 @@
     
     static void export_register(const char *key)
     {
-        eti_type::export_register(key);
+        eti_type::find()->key_register(key);
     }
     
     static const guid_initializer& get_instance(char const* key)
@@ -188,9 +188,8 @@
 // need to export it.
 #define BOOST_CLASS_EXPORT_CHECK(T)                              \
     BOOST_STATIC_WARNING(                                        \
-        boost::serialization::type_info_implementation< T >      \
-            ::type::is_polymorphic::value                        \
-    );                                                           \
+        BOOST_DEDUCED_TYPENAME boost::is_polymorphic<T>::value   \
+    );                                                         
     /**/
 
 // the default exportable class identifier is the class name
Modified: branches/serialization_next_release/boost/boost/serialization/extended_type_info.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/serialization/extended_type_info.hpp	(original)
+++ branches/serialization_next_release/boost/boost/serialization/extended_type_info.hpp	2007-09-26 21:53:46 EDT (Wed, 26 Sep 2007)
@@ -36,52 +36,34 @@
 class BOOST_SERIALIZATION_DECL(BOOST_PP_EMPTY()) extended_type_info : 
     private boost::noncopyable 
 {
-private:
-    virtual bool
-    less_than(const extended_type_info &rhs) const = 0;
-    int type_info_key_cmp(const extended_type_info & rhs) const;
-    
-    // used to uniquely identify the type of class derived from this one
-    // so that different derivations of this class can be simultaneously
-    // included in implementation of sets and maps.
-    const char * m_type_info_key;
-    // flag to indicate wheter its been registered by type;
-    bool m_self_registered;
-    // flag to indicate wheter its been registered by type;
-    bool m_key_registered;
-    // flag indicating that no virtual function should be called here
-    // this is necessary since it seems that at least one compiler (borland
-    // and one version of gcc call less_than above when erasing even
-    // when given an iterator argument.
-    bool m_is_destructing;
 protected:
-    const char * m_key;
-    extended_type_info(const char * type_info_key);
-    // account for bogus gcc warning
-    #if defined(__GNUC__)
-    virtual
-    #endif
+    // this class can't be used as is. It's just the 
+    // common functionality for all type_info replacement
+    // systems.  Hence, make these protected
+    extended_type_info();
     ~extended_type_info();
+    const char * m_key;
 public:
-    void self_register();
     void key_register(const char *key);
-    bool is_destructing() const {
-        return m_is_destructing;
-    }
-    bool operator<(const extended_type_info &rhs) const;
-    bool operator==(const extended_type_info &rhs) const {
-        return this == & rhs;
-    }
-    bool operator!=(const extended_type_info &rhs) const {
-        return this != & rhs;
-    }
     const char * get_key() const {
         return m_key;
     }
     static const extended_type_info * find(const char *key);
-    static const extended_type_info * find(const extended_type_info * t);
 };
 
+// in order
+BOOST_SERIALIZATION_DECL(bool)  
+operator==(
+    const extended_type_info & lhs, 
+    const extended_type_info & rhs
+);
+
+BOOST_SERIALIZATION_DECL(bool)  
+operator<(
+    const extended_type_info & lhs, 
+    const extended_type_info & rhs
+);
+
 } // namespace serialization 
 } // namespace boost
 
Modified: branches/serialization_next_release/boost/boost/serialization/extended_type_info_no_rtti.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/serialization/extended_type_info_no_rtti.hpp	(original)
+++ branches/serialization_next_release/boost/boost/serialization/extended_type_info_no_rtti.hpp	2007-09-26 21:53:46 EDT (Wed, 26 Sep 2007)
@@ -32,42 +32,16 @@
 
 namespace boost {
 namespace serialization {
-namespace detail {
-///////////////////////////////////////////////////////////////////////
-// define a special type_info that doesn't depend on rtti which is not
-// available in all situations.
-
-// common base class to share type_info_key.  This is used to 
-// identify the method used to keep track of the extended type
-class BOOST_SERIALIZATION_DECL(BOOST_PP_EMPTY()) extended_type_info_no_rtti_0 : 
-    public extended_type_info
-{
-    virtual bool
-    less_than(const boost::serialization::extended_type_info &rhs) const ;
-protected:
-    extended_type_info_no_rtti_0();
-    // account for bogus gcc warning
-    #if defined(__GNUC__)
-    virtual
-    #endif
-    ~extended_type_info_no_rtti_0();
-public:
-    struct is_polymorphic
-    {
-        typedef boost::mpl::bool_<true> type;
-        BOOST_STATIC_CONSTANT(bool, value = is_polymorphic::type::value);
-    };
-};
 
 template<class T>
-class extended_type_info_no_rtti_1 : 
-    public extended_type_info_no_rtti_0
+class extended_type_info_no_rtti : 
+    public extended_type_info
 {
-protected:
-    extended_type_info_no_rtti_1(){}
+    // private constructor to inhibit any existence other than the 
+    // static one
+    extended_type_info_no_rtti(){}
+    ~extended_type_info_no_rtti(){};
 public:
-    // note borland complains at making this destructor protected
-    ~extended_type_info_no_rtti_1(){};
     static const boost::serialization::extended_type_info *
     get_derived_extended_type_info(const T & t){
         // find the type that corresponds to the most derived type.
@@ -80,28 +54,11 @@
         return boost::serialization::extended_type_info::find(derived_key);
     }
     static boost::serialization::extended_type_info *
-    get_instance(){
-        static extended_type_info_no_rtti_1<T> instance;
+    find(){
+        // is this thread safe? probably not - does it need to be?
+        static extended_type_info_no_rtti<T> instance;
         return & instance;
     }
-    static void
-    export_register(const char * key){
-        boost::serialization::extended_type_info * eti;
-        eti = get_instance();
-        eti->key_register(key);  // initialize key and add to table
-        eti->self_register();    // add type to type table
-    }
-};
-} // namespace detail
-
-template<class T>
-class extended_type_info_no_rtti : 
-    public detail::extended_type_info_no_rtti_1<const T>
-{
-    // private constructor to inhibit any existence other than the 
-    // static one
-    extended_type_info_no_rtti(){}
-    ~extended_type_info_no_rtti(){};
 };
 
 } // namespace serialization
Modified: branches/serialization_next_release/boost/boost/serialization/extended_type_info_typeid.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/serialization/extended_type_info_typeid.hpp	(original)
+++ branches/serialization_next_release/boost/boost/serialization/extended_type_info_typeid.hpp	2007-09-26 21:53:46 EDT (Wed, 26 Sep 2007)
@@ -19,10 +19,10 @@
 
 #include <typeinfo>
 #include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
 
 //#include <boost/static_warning.hpp>
 #include <boost/static_assert.hpp>
-#include <boost/type_traits/is_polymorphic.hpp>
 #include <boost/type_traits/is_const.hpp>
 #include <boost/preprocessor/stringize.hpp>
 
@@ -36,26 +36,24 @@
 
 namespace boost {
 namespace serialization {
-
 namespace detail {
 
 class BOOST_SERIALIZATION_DECL(BOOST_PP_EMPTY()) extended_type_info_typeid_0 : 
     public extended_type_info
 {
-private:
-    virtual bool
-    less_than(const extended_type_info &rhs) const;
 protected:
+    const std::type_info * m_ti;
+    extended_type_info_typeid_0() :
+        m_ti(NULL)
+    {}
+    ~extended_type_info_typeid_0();
+    void type_register(const std::type_info & ti);
     static const extended_type_info *
     get_derived_extended_type_info(const std::type_info & ti);
-    extended_type_info_typeid_0();
-    // account for bogus gcc warning
-    #if defined(__GNUC__)
-    virtual
-    #endif
-    ~extended_type_info_typeid_0();
 public:
-    virtual const std::type_info & get_eti() const = 0;
+    const std::type_info & get_typeid() const {
+        return *m_ti;
+    }
 };
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -64,24 +62,17 @@
 class extended_type_info_typeid_1 : 
     public detail::extended_type_info_typeid_0
 {
-private:
-    virtual const std::type_info & get_eti() const {
-        return typeid(T);
-    }
 protected:
-    // private constructor to inhibit any existence other than the 
-    // static one
     extended_type_info_typeid_1() :
         detail::extended_type_info_typeid_0()
     {
-        self_register();    // add type to type table
+        type_register(typeid(T));
     }
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x560))
+public:
+#endif
+    ~extended_type_info_typeid_1(){}
 public:
-    struct is_polymorphic
-    {
-        typedef BOOST_DEDUCED_TYPENAME boost::is_polymorphic<T>::type type;
-        BOOST_STATIC_CONSTANT(bool, value = is_polymorphic::type::value);
-    };
     static const extended_type_info *
     get_derived_extended_type_info(const T & t){
         // note: this implementation - based on usage of typeid (rtti)
@@ -89,17 +80,17 @@
 //      BOOST_STATIC_WARNING(
 //          static_cast<bool>(is_polymorphic::value)
 //      );
-        return detail::extended_type_info_typeid_0::get_derived_extended_type_info(typeid(t));
+        return 
+            detail::extended_type_info_typeid_0::get_derived_extended_type_info(
+                typeid(t)
+            );
     }
     static extended_type_info *
-    get_instance(){
+    find(){
+        // is this thread safe? probably not - does it need to be?
         static extended_type_info_typeid_1<T> instance;
         return & instance;
     }
-    static void
-    export_register(const char * key){
-        get_instance()->key_register(key);
-    }
 };
 
 } // namespace detail
@@ -108,7 +99,19 @@
 template<class T>
 class extended_type_info_typeid : 
     public detail::extended_type_info_typeid_1<const T>
-{};
+{
+public:
+    static const extended_type_info *
+    get_derived_extended_type_info(const T & t){
+        return detail::extended_type_info_typeid_1<T>
+            ::get_derived_extended_type_info(t);
+    }
+    static extended_type_info *
+    find(){
+        // is this thread safe? probably not - does it need to be?
+        return detail::extended_type_info_typeid_1<T>::find();
+    }
+};
 
 } // namespace serialization
 } // namespace boost
Modified: branches/serialization_next_release/boost/boost/serialization/optional.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/serialization/optional.hpp	(original)
+++ branches/serialization_next_release/boost/boost/serialization/optional.hpp	2007-09-26 21:53:46 EDT (Wed, 26 Sep 2007)
@@ -53,7 +53,7 @@
     bool tflag;
     ar >> boost::serialization::make_nvp("initialized", tflag);
     if (tflag){
-        unsigned int v;
+        unsigned int v = 0;
         if(3 < ar.get_library_version()){
             ar >> make_nvp("item_version", v);
         }
Modified: branches/serialization_next_release/boost/boost/serialization/void_cast.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/serialization/void_cast.hpp	(original)
+++ branches/serialization_next_release/boost/boost/serialization/void_cast.hpp	2007-09-26 21:53:46 EDT (Wed, 26 Sep 2007)
@@ -89,32 +89,17 @@
 // note: can't be abstract because an instance is used as a search argument
 class BOOST_SERIALIZATION_DECL(BOOST_PP_EMPTY()) void_caster
 {
-    friend struct void_caster_compare ;
-    friend 
-    BOOST_SERIALIZATION_DECL(void const *)  
-    boost::serialization::void_upcast(
-        const extended_type_info & derived_type,
-        const extended_type_info & base_type,
-        const void * t,
-        bool top
-    );
-    friend 
-    BOOST_SERIALIZATION_DECL(void const *)  
-    boost::serialization::void_downcast(
-        const extended_type_info & derived_type,
-        const extended_type_info & base_type,
-        const void * t,
-        bool top
-    );
-    // each derived class must re-implement these;
-    virtual void const * upcast(void const * t) const = 0;
-    virtual void const * downcast(void const * t) const = 0;
-    // Data members
-    extended_type_info const & m_derived_type;
-    extended_type_info const & m_base_type;
+    friend BOOST_SERIALIZATION_DECL(bool)
+    operator<(const void_caster & lhs, const void_caster & rhs);
 protected:
     static void static_register(const void_caster *);
 public:
+    // Data members
+    extended_type_info const & m_derived_type;
+    extended_type_info const & m_base_type;
+    // each derived class must re-implement these;
+    virtual void const * upcast(void const * t) const = 0;
+    virtual void const * downcast(void const * t) const = 0;
     // Constructor
     void_caster(
         extended_type_info const & derived_type_,
@@ -122,13 +107,16 @@
     );
     // predicate used to determine if this void caster includes
     // a particular eti *
-    bool includes(const extended_type_info * eti) const;
+//    bool includes(const extended_type_info * eti) const;
     virtual ~void_caster();
 private:
     // cw 8.3 requires this!!
     void_caster& operator=(void_caster const&);
 };
 
+BOOST_SERIALIZATION_DECL(bool)
+operator<(const void_caster & lhs, const void_caster & rhs);
+
 template <class Derived, class Base>
 class void_caster_primitive : 
     public void_caster
@@ -179,8 +167,8 @@
 template <class Derived, class Base>
 BOOST_DLLEXPORT void_caster_primitive<Derived, Base>::void_caster_primitive() :
     void_caster( 
-        * type_info_implementation<Derived>::type::get_instance(), 
-        * type_info_implementation<Base>::type::get_instance() 
+        * type_info_implementation<Derived>::type::find(), 
+        * type_info_implementation<Base>::type::find() 
     )
 {
     // calling get_instance() causes infinite recursion, and the
@@ -207,6 +195,7 @@
     const Derived * dnull, 
     const Base * bnull
 ) BOOST_USED;
+
 template<class Derived, class Base>
 BOOST_DLLEXPORT 
 inline const void_cast_detail::void_caster & void_cast_register(