$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r59455 - trunk/boost/archive/detail
From: ramey_at_[hidden]
Date: 2010-02-03 16:33:22
Author: ramey
Date: 2010-02-03 16:33:20 EST (Wed, 03 Feb 2010)
New Revision: 59455
URL: http://svn.boost.org/trac/boost/changeset/59455
Log:
address const T * serialization
Text files modified: 
   trunk/boost/archive/detail/check.hpp       |    10 +++++-----                              
   trunk/boost/archive/detail/iserializer.hpp |    34 ++++++++++++++++++++--------------      
   2 files changed, 25 insertions(+), 19 deletions(-)
Modified: trunk/boost/archive/detail/check.hpp
==============================================================================
--- trunk/boost/archive/detail/check.hpp	(original)
+++ trunk/boost/archive/detail/check.hpp	2010-02-03 16:33:20 EST (Wed, 03 Feb 2010)
@@ -48,7 +48,7 @@
 // checks for objects
 
 template<class T>
-void inline check_object_level(){
+inline void check_object_level(){
     typedef 
         BOOST_DEDUCED_TYPENAME mpl::greater_equal<
             serialization::implementation_level<T>,
@@ -61,7 +61,7 @@
 }
 
 template<class T>
-void inline check_object_versioning(){
+inline void check_object_versioning(){
     typedef 
         BOOST_DEDUCED_TYPENAME mpl::or_<
             BOOST_DEDUCED_TYPENAME mpl::greater<
@@ -79,7 +79,7 @@
 }
 
 template<class T>
-void inline check_object_tracking(){
+inline void check_object_tracking(){
     // presume it has already been determined that
     // T is not a const
     BOOST_STATIC_ASSERT(! boost::is_const<T>::value);
@@ -101,7 +101,7 @@
 // checks for pointers
 
 template<class T>
-void inline check_pointer_level(){
+inline void check_pointer_level(){
     // we should only invoke this once we KNOW that T
     // has been used as a pointer!!
     typedef 
@@ -149,7 +149,7 @@
 }
 
 template<class T>
-void inline check_const_loading(){
+inline void check_const_loading(){
     typedef
         BOOST_DEDUCED_TYPENAME mpl::or_<
             BOOST_DEDUCED_TYPENAME boost::serialization::is_wrapper<T>,
Modified: trunk/boost/archive/detail/iserializer.hpp
==============================================================================
--- trunk/boost/archive/detail/iserializer.hpp	(original)
+++ trunk/boost/archive/detail/iserializer.hpp	2010-02-03 16:33:20 EST (Wed, 03 Feb 2010)
@@ -455,7 +455,7 @@
     };
 
     template<class T>
-    static const basic_pointer_iserializer * register_type(Archive &ar, T & /*t*/){
+    static const basic_pointer_iserializer * register_type(Archive &ar, const T & /*t*/){
         // there should never be any need to load an abstract polymorphic 
         // class pointer.  Inhibiting code generation for this
         // permits abstract base classes to be used - note: exception
@@ -472,30 +472,32 @@
     template<class T>
     static T * pointer_tweak(
         const boost::serialization::extended_type_info & eti,
-        void * t,
-        T &
+        void const * const t,
+        const T &
     ) {
         // tweak the pointer back to the base class
         return static_cast<T *>(
-            boost::serialization::void_upcast(
-                eti,
-                boost::serialization::singleton<
-                    BOOST_DEDUCED_TYPENAME 
-                    boost::serialization::type_info_implementation<T>::type
-                >::get_const_instance(),
-                t
+            const_cast<void *>(
+                boost::serialization::void_upcast(
+                    eti,
+                    boost::serialization::singleton<
+                        BOOST_DEDUCED_TYPENAME 
+                        boost::serialization::type_info_implementation<T>::type
+                    >::get_const_instance(),
+                    t
+                )
             )
         );
     }
 
     template<class T>
-    static void load(Archive & /* ar */ , T & /* t */){
+    static void check_load(T & /* t */){
         check_pointer_level<T>();
         check_pointer_tracking<T>();
     }
 
     static const basic_pointer_iserializer *
-        find(const boost::serialization::extended_type_info & type){
+    find(const boost::serialization::extended_type_info & type){
         return static_cast<const basic_pointer_iserializer *>(
             archive_serializer_map<Archive>::find(type)
         );
@@ -503,10 +505,14 @@
 
     template<class Tptr>
     static void invoke(Archive & ar, Tptr & t){
-        load(ar, *t);
+        check_load(*t);
         const basic_pointer_iserializer * bpis_ptr = register_type(ar, *t);
         const basic_pointer_iserializer * newbpis_ptr = ar.load_pointer(
-            * reinterpret_cast<void **>(&t),
+            // note major hack here !!!
+            // I tried every way to convert Tptr &t (where Tptr might
+            // include const) to void * &.  This is the only way
+            // I could make it work. RR
+            (void * & )t,
             bpis_ptr,
             find
         );