Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r52109 - branches/release/boost/serialization
From: ramey_at_[hidden]
Date: 2009-04-01 12:02:33


Author: ramey
Date: 2009-04-01 12:02:32 EDT (Wed, 01 Apr 2009)
New Revision: 52109
URL: http://svn.boost.org/trac/boost/changeset/52109

Log:
Merge changes from trunk to release
Text files modified:
   branches/release/boost/serialization/array.hpp | 3
   branches/release/boost/serialization/export.hpp | 13 ++-
   branches/release/boost/serialization/extended_type_info.hpp | 5
   branches/release/boost/serialization/static_warning.hpp | 4
   branches/release/boost/serialization/variant.hpp | 10 +-
   branches/release/boost/serialization/void_cast.hpp | 124 +++++++++++++++++++++++++++++++--------
   6 files changed, 115 insertions(+), 44 deletions(-)

Modified: branches/release/boost/serialization/array.hpp
==============================================================================
--- branches/release/boost/serialization/array.hpp (original)
+++ branches/release/boost/serialization/array.hpp 2009-04-01 12:02:32 EDT (Wed, 01 Apr 2009)
@@ -106,7 +106,6 @@
       return m_element_count;
     }
     
-
 private:
     value_type* m_t;
     std::size_t const m_element_count;
@@ -121,9 +120,7 @@
     return array<T>(t, s);
 }
 
-
 template <class Archive, class T, std::size_t N>
-
 void serialize(Archive& ar, boost::array<T,N>& a, const unsigned int /* version */)
 {
   ar & boost::serialization::make_nvp("elems",a.elems);

Modified: branches/release/boost/serialization/export.hpp
==============================================================================
--- branches/release/boost/serialization/export.hpp (original)
+++ branches/release/boost/serialization/export.hpp 2009-04-01 12:02:32 EDT (Wed, 01 Apr 2009)
@@ -86,7 +86,7 @@
 template <class Archive, class Serializable>
 struct ptr_serialization_support
 {
-# if defined(BOOST_MSVC)
+# if defined(BOOST_MSVC) || defined(__SUNPRO_CC)
     virtual BOOST_DLLEXPORT void instantiate() BOOST_USED;
 # elif defined(__BORLANDC__)
     static BOOST_DLLEXPORT void instantiate() BOOST_USED;
@@ -118,6 +118,8 @@
     );
 }
 
+namespace {
+
 template<class T>
 struct guid_initializer
 {
@@ -149,6 +151,7 @@
 template<typename T>
 struct init_guid;
 
+} // anonymous
 } // namespace detail
 } // namespace archive
 } // namespace boost
@@ -157,17 +160,18 @@
     namespace boost { \
     namespace archive { \
     namespace detail { \
+ namespace { \
     template<> \
     struct init_guid< T > { \
         static ::boost::archive::detail::guid_initializer< T > const \
             & guid_initializer; \
     }; \
- }}} \
     ::boost::archive::detail::guid_initializer< T > const & \
         ::boost::archive::detail::init_guid< T >::guid_initializer = \
            ::boost::serialization::singleton< \
                ::boost::archive::detail::guid_initializer< T > \
>::get_mutable_instance().export_guid(K); \
+ }}}} \
 /**/
 
 #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3205))
@@ -178,10 +182,9 @@
 // relationships for exported classes. On all other compilers, use of
 // this macro is entirely optional.
 # define BOOST_SERIALIZATION_MWERKS_BASE_AND_DERIVED(Base,Derived) \
-namespace \
-{ \
+namespace { \
   static int BOOST_PP_CAT(boost_serialization_mwerks_init_, __LINE__) = \
- (::boost::archive::detail::instantiate_ptr_serialization((Derived*)0,0), 3); \
+ (::boost::archive::detail::instantiate_ptr_serialization((Derived*)0,0), 3); \
   static int BOOST_PP_CAT(boost_serialization_mwerks_init2_, __LINE__) = ( \
       ::boost::serialization::void_cast_register((Derived*)0,(Base*)0) \
     , 3); \

Modified: branches/release/boost/serialization/extended_type_info.hpp
==============================================================================
--- branches/release/boost/serialization/extended_type_info.hpp (original)
+++ branches/release/boost/serialization/extended_type_info.hpp 2009-04-01 12:02:32 EDT (Wed, 01 Apr 2009)
@@ -22,6 +22,7 @@
 #include <cassert>
 #include <cstddef> // NULL
 #include <boost/config.hpp>
+#include <boost/noncopyable.hpp>
 #include <boost/serialization/config.hpp>
 
 #include <boost/config/abi_prefix.hpp> // must be the last header
@@ -34,8 +35,8 @@
 
 namespace boost {
 namespace serialization {
-
-class BOOST_SERIALIZATION_DECL(BOOST_PP_EMPTY()) extended_type_info
+class BOOST_SERIALIZATION_DECL(BOOST_PP_EMPTY()) extended_type_info :
+ private boost::noncopyable
 {
 private:
     // used to uniquely identify the type of class derived from this one

Modified: branches/release/boost/serialization/static_warning.hpp
==============================================================================
--- branches/release/boost/serialization/static_warning.hpp (original)
+++ branches/release/boost/serialization/static_warning.hpp 2009-04-01 12:02:32 EDT (Wed, 01 Apr 2009)
@@ -162,12 +162,12 @@
      // VC6; __LINE__ macro broken when -ZI is used see Q199057, so
      // non-conforming workaround is used.
 # define BOOST_STATIC_WARNING_IMPL(B) \
- struct { \
+ struct BOOST_JOIN(STATIC_WARNING, __LINE__) { \
         struct S { \
             typedef boost::serialization::static_warning_impl<(bool)( B )> f; \
             friend class f::STATIC_WARNING; \
         }; \
- } \
+ }; \
      /**/
 #elif defined(BOOST_HAS_DESCRIPTIVE_INCOMPLETE_TYPE_WARNING)
 # define BOOST_STATIC_WARNING_IMPL(B) \

Modified: branches/release/boost/serialization/variant.hpp
==============================================================================
--- branches/release/boost/serialization/variant.hpp (original)
+++ branches/release/boost/serialization/variant.hpp 2009-04-01 12:02:32 EDT (Wed, 01 Apr 2009)
@@ -81,7 +81,7 @@
             Archive & /*ar*/,
             int /*which*/,
             V & /*v*/,
- unsigned int /*version*/
+ const unsigned int /*version*/
         ){}
     };
 
@@ -91,7 +91,7 @@
             Archive & ar,
             int which,
             V & v,
- unsigned int version
+ const unsigned int version
         ){
             if(which == 0){
                 // note: A non-intrusive implementation (such as this one)
@@ -115,7 +115,7 @@
         Archive & ar,
         int which,
         V & v,
- unsigned int version
+ const unsigned int version
     ){
         typedef BOOST_DEDUCED_TYPENAME mpl::eval_if<mpl::empty<S>,
             mpl::identity<load_null>,
@@ -130,7 +130,7 @@
 void load(
     Archive & ar,
     boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>& v,
- unsigned int version
+ const unsigned int version
 ){
     int which;
     typedef BOOST_DEDUCED_TYPENAME boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>::types types;
@@ -149,7 +149,7 @@
 inline void serialize(
     Archive & ar,
     boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> & v,
- unsigned int file_version
+ const unsigned int file_version
 ){
     split_free(ar,v,file_version);
 }

Modified: branches/release/boost/serialization/void_cast.hpp
==============================================================================
--- branches/release/boost/serialization/void_cast.hpp (original)
+++ branches/release/boost/serialization/void_cast.hpp 2009-04-01 12:02:32 EDT (Wed, 01 Apr 2009)
@@ -17,12 +17,14 @@
 
 // See http://www.boost.org for updates, documentation, and revision history.
 
+#include <cstddef> // for ptrdiff_t
+#include <boost/serialization/config.hpp>
 #include <boost/serialization/smart_cast.hpp>
 #include <boost/serialization/singleton.hpp>
 #include <boost/serialization/force_include.hpp>
 #include <boost/serialization/type_info_implementation.hpp>
-#include <boost/serialization/config.hpp>
-#include <boost/serialization/force_include.hpp>
+#include <boost/type_traits/is_virtual_base_of.hpp>
+
 #include <boost/config/abi_prefix.hpp> // must be the last header
 
 #ifdef BOOST_MSVC
@@ -84,7 +86,6 @@
 
 class BOOST_SERIALIZATION_DECL(BOOST_PP_EMPTY()) void_caster
 {
- friend struct void_caster_compare ;
     friend
     BOOST_SERIALIZATION_DECL(void const *)
     boost::serialization::void_upcast(
@@ -99,27 +100,43 @@
         extended_type_info const & base,
         void const * const
     );
- // Data members
- const extended_type_info & m_derived;
- const extended_type_info & m_base;
- // each derived class must re-implement these;
- virtual void const * upcast(void const * const t) const = 0;
- virtual void const * downcast(void const * const t) const = 0;
     // cw 8.3 requires this!!
     void_caster& operator=(void_caster const &);
 protected:
- void
- static_register() const;
- void
- static_unregister() const;
+ void recursive_register(bool includes_virtual_base = false) const;
+ void recursive_unregister() const;
 public:
+ // Data members
+ const extended_type_info * m_derived;
+ const extended_type_info * m_base;
+ const std::ptrdiff_t m_difference;
+ virtual bool is_shortcut() const {
+ return false;
+ }
+ // note that void_casters are keyed on value of
+ // addresses to member extended type info records
+ bool operator<(const void_caster & lhs) const {
+ if(m_derived < lhs.m_derived)
+ return true;
+ if(m_derived == lhs.m_derived)
+ if(m_base < lhs.m_base)
+ return true;
+ return false;
+ }
+ // each derived class must re-implement these;
+ virtual void const * upcast(void const * const t) const = 0;
+ virtual void const * downcast(void const * const t) const = 0;
     // Constructor
     void_caster(
- extended_type_info const & derived,
- extended_type_info const & base
- );
- virtual ~void_caster(){};
- bool operator==(const void_caster & rhs) const;
+ extended_type_info const * derived,
+ extended_type_info const * base,
+ std::ptrdiff_t difference = 0
+ ) :
+ m_derived(derived),
+ m_base(base),
+ m_difference(difference)
+ {}
+ virtual ~void_caster(){}
 };
 
 template <class Derived, class Base>
@@ -141,23 +158,68 @@
         return b;
     }
 public:
- BOOST_DLLEXPORT void_caster_primitive() BOOST_USED;
+ void_caster_primitive();
     ~void_caster_primitive();
 };
 
 template <class Derived, class Base>
-BOOST_DLLEXPORT void_caster_primitive<Derived, Base>::void_caster_primitive() :
+void_caster_primitive<Derived, Base>::void_caster_primitive() :
     void_caster(
- type_info_implementation<Derived>::type::get_const_instance(),
- type_info_implementation<Base>::type::get_const_instance()
+ & type_info_implementation<Derived>::type::get_const_instance(),
+ & type_info_implementation<Base>::type::get_const_instance(),
+ // note:I wanted to display from 0 here, but at least one compiler
+ // treated 0 by not shifting it at all.
+ reinterpret_cast<std::ptrdiff_t>(
+ static_cast<Derived *>(
+ reinterpret_cast<Base *>(1)
+ )
+ ) - 1
     )
 {
- static_register();
+ recursive_register();
 }
 
 template <class Derived, class Base>
 void_caster_primitive<Derived, Base>::~void_caster_primitive(){
- static_unregister();
+ recursive_unregister();
+}
+
+template <class Derived, class Base>
+class void_caster_virtual_base :
+ public void_caster
+{
+public:
+ virtual void const * downcast(void const * const t) const {
+ const Derived * d =
+ dynamic_cast<const Derived *>(
+ static_cast<const Base *>(t)
+ );
+ return d;
+ }
+ virtual void const * upcast(void const * const t) const {
+ const Base * b =
+ dynamic_cast<const Base *>(
+ static_cast<const Derived *>(t)
+ );
+ return b;
+ }
+ void_caster_virtual_base();
+ ~void_caster_virtual_base();
+};
+
+template <class Derived, class Base>
+void_caster_virtual_base<Derived,Base>::void_caster_virtual_base() :
+ void_caster(
+ & type_info_implementation<Derived>::type::get_const_instance(),
+ & type_info_implementation<Base>::type::get_const_instance()
+ )
+{
+ recursive_register(true);
+}
+
+template <class Derived, class Base>
+void_caster_virtual_base<Derived,Base>::~void_caster_virtual_base(){
+ recursive_unregister();
 }
 
 } // void_cast_detail
@@ -179,9 +241,17 @@
     Derived const * /* dnull = NULL */,
     Base const * /* bnull = NULL */
 ){
- return singleton<void_cast_detail::void_caster_primitive<
- Derived, Base
- > >::get_const_instance();
+ typedef
+ BOOST_DEDUCED_TYPENAME mpl::eval_if<boost::is_virtual_base_of<Base,Derived>,
+ mpl::identity<
+ void_cast_detail::void_caster_virtual_base<Derived, Base>
+ >
+ ,// else
+ mpl::identity<
+ void_cast_detail::void_caster_primitive<Derived, Base>
+ >
+ >::type typex;
+ return singleton<typex>::get_const_instance();
 }
 
 } // namespace serialization


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk