$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r54752 - trunk/boost/archive
From: ramey_at_[hidden]
Date: 2009-07-07 00:00:11
Author: ramey
Date: 2009-07-07 00:00:10 EDT (Tue, 07 Jul 2009)
New Revision: 54752
URL: http://svn.boost.org/trac/boost/changeset/54752
Log:
Fixed misc bugs
Text files modified: 
   trunk/boost/archive/archive_exception.hpp          |    17 ++++++---                               
   trunk/boost/archive/basic_binary_oarchive.hpp      |    19 ++++++++--                              
   trunk/boost/archive/polymorphic_text_wiarchive.hpp |    12 +++++-                                  
   trunk/boost/archive/polymorphic_xml_wiarchive.hpp  |    12 +++++-                                  
   trunk/boost/archive/shared_ptr_helper.hpp          |    69 ++++++++++++++++++++++++--------------- 
   5 files changed, 85 insertions(+), 44 deletions(-)
Modified: trunk/boost/archive/archive_exception.hpp
==============================================================================
--- trunk/boost/archive/archive_exception.hpp	(original)
+++ trunk/boost/archive/archive_exception.hpp	2009-07-07 00:00:10 EDT (Tue, 07 Jul 2009)
@@ -39,11 +39,10 @@
         unsupported_version,// archive created with library version
                             // subsequent to this one
         pointer_conflict,   // an attempt has been made to directly
-                            // serialization::detail an object
-                            // after having already serialzed the same
-                            // object through a pointer.  Were this permited,
-                            // it the archive load would result in the
-                            // creation of an extra copy of the obect.
+                            // serialize an object which has
+                            // already been serialzed through a pointer.  
+                            // Were this permited, the archive load would result 
+                            // in the creation of an extra copy of the obect.
         incompatible_native_format, // attempt to read native binary format
                             // on incompatible platform
         array_size_too_short,// array being loaded doesn't fit in array allocated
@@ -53,9 +52,11 @@
                             // to insert virus via buffer overrun method.
         unregistered_cast,   // base - derived relationship not registered with 
                             // void_cast_register
-        unsupported_class_version // type saved with a version # greater than the 
+        unsupported_class_version, // type saved with a version # greater than the 
                             // one used by the program.  This indicates that the proggram
                             // needs to be rebuilt.
+        inconsistent_pointer_serialization // an object as been serialized
+                            // more than once through pointers of different types.
     } exception_code;
     exception_code code;
     archive_exception(exception_code c) : 
@@ -103,6 +104,10 @@
             // was sliced by passing by value in catch
             msg = "unknown derived exception";
             break;
+        case inconsistent_pointer_serialization:
+            // same object saved through different kinds of pointers
+            msg = "inconsistent_pointer_serialization";
+            break;
         default:
             assert(false);
             break;
Modified: trunk/boost/archive/basic_binary_oarchive.hpp
==============================================================================
--- trunk/boost/archive/basic_binary_oarchive.hpp	(original)
+++ trunk/boost/archive/basic_binary_oarchive.hpp	2009-07-07 00:00:10 EDT (Tue, 07 Jul 2009)
@@ -23,6 +23,10 @@
 // IN GENERAL, ARCHIVES CREATED WITH THIS CLASS WILL NOT BE READABLE
 // ON PLATFORM APART FROM THE ONE THEY ARE CREATE ON
 
+#include <cassert>
+#include <boost/integer.hpp>
+#include <boost/integer_traits.hpp>
+
 #include <boost/config.hpp>
 #include <boost/serialization/pfto.hpp>
 
@@ -69,27 +73,32 @@
     void save_override(const version_type & t, int){
         // upto 255 versions
         // note:t.t resolves borland ambguity
-        const unsigned char x = t.t;
+        assert(t.t <= boost::integer_traits<unsigned char>::const_max);
+        const unsigned char x = static_cast<const unsigned char>(t.t);
         * this->This() << x;
     }
     void save_override(const class_id_type & t, int){
         // upto 32K classes
-        const int_least16_t x = t.t;
+        assert(t.t <= boost::integer_traits<boost::int_least16_t>::const_max);
+        const boost::int_least16_t x = static_cast<const boost::int_least16_t>(t.t); 
         * this->This() << x;
     }
     void save_override(const class_id_reference_type & t, int){
         // upto 32K classes
-        const int_least16_t x = t.t;
+        assert(t.t <= boost::integer_traits<boost::uint_least32_t>::const_max);
+        const boost::uint_least16_t x = t.t;
         * this->This() << x;
     }
     void save_override(const object_id_type & t, int){
         // upto 2G objects
-        const uint_least32_t x = t.t;
+        assert(t.t <= boost::integer_traits<boost::uint_least32_t>::const_max);
+        const boost::uint_least32_t x = t.t;
         * this->This() << x;
     }
     void save_override(const object_reference_type & t, int){
         // upto 2G objects
-        uint_least32_t x = t.t;
+        assert(t.t <= boost::integer_traits<boost::uint_least32_t>::const_max);
+        const boost::uint_least32_t x = t.t;
         * this->This() << x;
     }
     void save_override(const tracking_type & t, int){
Modified: trunk/boost/archive/polymorphic_text_wiarchive.hpp
==============================================================================
--- trunk/boost/archive/polymorphic_text_wiarchive.hpp	(original)
+++ trunk/boost/archive/polymorphic_text_wiarchive.hpp	2009-07-07 00:00:10 EDT (Tue, 07 Jul 2009)
@@ -27,9 +27,15 @@
 namespace boost { 
 namespace archive {
 
-typedef detail::polymorphic_iarchive_route<
-        text_wiarchive_impl<naked_text_wiarchive> 
-> polymorphic_text_wiarchive;
+class polymorphic_text_wiarchive : 
+    public detail::polymorphic_iarchive_route<naked_text_wiarchive>
+{
+public:
+    polymorphic_text_wiarchive(std::wistream & is, unsigned int flags = 0) :
+        detail::polymorphic_iarchive_route<naked_text_wiarchive>(is, flags)
+    {}
+    ~polymorphic_text_wiarchive(){}
+};
 
 } // namespace archive
 } // namespace boost
Modified: trunk/boost/archive/polymorphic_xml_wiarchive.hpp
==============================================================================
--- trunk/boost/archive/polymorphic_xml_wiarchive.hpp	(original)
+++ trunk/boost/archive/polymorphic_xml_wiarchive.hpp	2009-07-07 00:00:10 EDT (Tue, 07 Jul 2009)
@@ -27,9 +27,15 @@
 namespace boost { 
 namespace archive {
 
-typedef detail::polymorphic_iarchive_route<
-        xml_wiarchive_impl<naked_xml_wiarchive> 
-> polymorphic_xml_wiarchive;
+class polymorphic_xml_wiarchive : 
+    public detail::polymorphic_iarchive_route<naked_xml_wiarchive>
+{
+public:
+    polymorphic_xml_wiarchive(std::wistream & is, unsigned int flags = 0) :
+        detail::polymorphic_iarchive_route<naked_xml_wiarchive>(is, flags)
+    {}
+    ~polymorphic_xml_wiarchive(){}
+};
 
 } // namespace archive
 } // namespace boost
Modified: trunk/boost/archive/shared_ptr_helper.hpp
==============================================================================
--- trunk/boost/archive/shared_ptr_helper.hpp	(original)
+++ trunk/boost/archive/shared_ptr_helper.hpp	2009-07-07 00:00:10 EDT (Tue, 07 Jul 2009)
@@ -9,7 +9,7 @@
 /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
 // shared_ptr_helper.hpp: serialization for boost shared pointer
 
-// (C) Copyright 2004 Robert Ramey and Martin Ecker
+// (C) Copyright 2004-2009 Robert Ramey, Martin Ecker and Takatoshi Kondo
 // Use, modification and distribution is subject to the Boost Software
 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
 // http://www.boost.org/LICENSE_1_0.txt)
@@ -18,10 +18,12 @@
 
 #include <map>
 #include <list>
+#include <utility>
 #include <cstddef> // NULL
 
 #include <boost/config.hpp>
 #include <boost/shared_ptr.hpp>
+
 #include <boost/serialization/type_info_implementation.hpp>
 #include <boost/serialization/shared_ptr_132.hpp>
 #include <boost/serialization/throw_exception.hpp>
@@ -54,7 +56,10 @@
 // a common class for holding various types of shared pointers
 
 class shared_ptr_helper {
-    typedef std::map<const void *, shared_ptr<void> > collection_type;
+    typedef std::map<
+        const void *,
+        boost::shared_ptr<const void>
+    > collection_type;
     typedef collection_type::const_iterator iterator_type;
     // list of shared_pointers create accessable by raw pointer. This
     // is used to "match up" shared pointers loaded at different
@@ -74,6 +79,7 @@
     );
 #endif
 
+//  #ifdef BOOST_SERIALIZATION_SHARED_PTR_132_HPP
     // list of loaded pointers.  This is used to be sure that the pointers
     // stay around long enough to be "matched" with other pointers loaded
     // by the same archive.  These are created with a "null_deleter" so that
@@ -83,10 +89,17 @@
     // by a change in load_construct_data below.  It makes this file suitable
     // only for loading pointers into a 1.33 or later boost system.
     std::list<boost_132::shared_ptr<void> > * m_pointers_132;
+//  #endif
 
-    // return a void pointer to the most derived type
+public:
     template<class T>
-    const void * object_identifier(T * t) const {
+    void reset(shared_ptr<T> & s, T * t){
+        if(NULL == t){
+            s.reset();
+            return;
+        }
+        // get pointer to the most derived object.  This is effectively
+        // the object identifer
         const boost::serialization::extended_type_info * true_type 
             = boost::serialization::type_info_implementation<T>::type
                 ::get_const_instance().get_derived_extended_type_info(*t);
@@ -94,59 +107,61 @@
         // is either registered or exported.
         if(NULL == true_type)
             boost::serialization::throw_exception(
-                boost::archive::archive_exception(
-                    boost::archive::archive_exception::unregistered_class
-                )
+                archive_exception(archive_exception::unregistered_class)
             );
         const boost::serialization::extended_type_info * this_type
             = & boost::serialization::type_info_implementation<T>::type
                     ::get_const_instance();
-        const void * vp = void_downcast(
+
+        // get void pointer to the most derived type
+        // this uniquely identifies the object referred to
+        const void * od = void_downcast(
             *true_type, 
             *this_type, 
             static_cast<const void *>(t)
         );
-        return vp;
-    }
-public:
-    template<class T>
-    void reset(shared_ptr<T> & s, T * r){
-        if(NULL == r){
-            s.reset();
-            return;
-        }
-        // get pointer to the most derived object.  This is effectively
-        // the object identifer
-        const void * od = object_identifier(r);
 
+        // make tracking array if necessary
         if(NULL == m_pointers)
             m_pointers = new collection_type;
 
         iterator_type it = m_pointers->find(od);
 
+        // create a new shared pointer to a void
         if(it == m_pointers->end()){
-            s.reset(r);
-            m_pointers->insert(collection_type::value_type(od,s));
-        }
-        else{
-            s = static_pointer_cast<T>((*it).second);
+            s.reset(t);
+            shared_ptr<const void> sp(s, od);
+            m_pointers->insert(collection_type::value_type(od, sp));
+            return;
         }
+        t = static_cast<T *>(const_cast<void *>(void_upcast(
+            *true_type, 
+            *this_type, 
+            ((*it).second.get())
+        )));
+        s = shared_ptr<T>((*it).second, t); // aliasing 
     }
+//  #ifdef BOOST_SERIALIZATION_SHARED_PTR_132_HPP
     void append(const boost_132::shared_ptr<void> & t){
         if(NULL == m_pointers_132)
             m_pointers_132 = new std::list<boost_132::shared_ptr<void> >;
         m_pointers_132->push_back(t);
     }
+//  #endif
 public:
     shared_ptr_helper() : 
-        m_pointers(NULL), 
-        m_pointers_132(NULL)
+        m_pointers(NULL)
+        #ifdef BOOST_SERIALIZATION_SHARED_PTR_132_HPP
+            , m_pointers_132(NULL)
+        #endif
     {}
     ~shared_ptr_helper(){
         if(NULL != m_pointers)
             delete m_pointers;
+        #ifdef BOOST_SERIALIZATION_SHARED_PTR_132_HPP
         if(NULL != m_pointers_132)
             delete m_pointers_132;
+        #endif
     }
 };