$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: ramey_at_[hidden]
Date: 2007-08-15 14:33:18
Author: ramey
Date: 2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
New Revision: 38693
URL: http://svn.boost.org/trac/boost/changeset/38693
Log:
Changes made over the course of the year while 1.34 was being worked on
Text files modified: 
   branches/serialization_next_release/boost/boost/archive/basic_archive.hpp                |    10 ---                                     
   branches/serialization_next_release/boost/boost/archive/basic_binary_iarchive.hpp        |    32 ++++++-----                             
   branches/serialization_next_release/boost/boost/archive/basic_binary_iprimitive.hpp      |    18 +++++                                   
   branches/serialization_next_release/boost/boost/archive/basic_binary_oarchive.hpp        |    37 ++++++++----                            
   branches/serialization_next_release/boost/boost/archive/basic_binary_oprimitive.hpp      |    14 +++++                                   
   branches/serialization_next_release/boost/boost/archive/basic_text_iarchive.hpp          |     4                                         
   branches/serialization_next_release/boost/boost/archive/basic_text_oarchive.hpp          |    21 ++++---                                 
   branches/serialization_next_release/boost/boost/archive/basic_text_oprimitive.hpp        |     2                                         
   branches/serialization_next_release/boost/boost/archive/basic_xml_archive.hpp            |     2                                         
   branches/serialization_next_release/boost/boost/archive/basic_xml_iarchive.hpp           |    15 +++--                                   
   branches/serialization_next_release/boost/boost/archive/basic_xml_oarchive.hpp           |    26 +++++---                                
   branches/serialization_next_release/boost/boost/archive/binary_iarchive.hpp              |    45 ++++++++++++++-                         
   branches/serialization_next_release/boost/boost/archive/binary_iarchive_impl.hpp         |     2                                         
   branches/serialization_next_release/boost/boost/archive/binary_oarchive.hpp              |     7 +-                                      
   branches/serialization_next_release/boost/boost/archive/binary_oarchive_impl.hpp         |     2                                         
   branches/serialization_next_release/boost/boost/archive/binary_wiarchive.hpp             |    45 ++++++++++++++--                        
   branches/serialization_next_release/boost/boost/archive/binary_woarchive.hpp             |     7 +-                                      
   branches/serialization_next_release/boost/boost/archive/codecvt_null.hpp                 |     6 +                                       
   branches/serialization_next_release/boost/boost/archive/detail/abi_prefix.hpp            |     5 +                                       
   branches/serialization_next_release/boost/boost/archive/detail/abi_suffix.hpp            |     5 +                                       
   branches/serialization_next_release/boost/boost/archive/detail/basic_archive_impl.hpp    |    43 ---------------                         
   branches/serialization_next_release/boost/boost/archive/detail/basic_iarchive.hpp        |    22 ++-----                                 
   branches/serialization_next_release/boost/boost/archive/detail/basic_oarchive.hpp        |    19 ++----                                  
   branches/serialization_next_release/boost/boost/archive/detail/common_iarchive.hpp       |     4 +                                       
   branches/serialization_next_release/boost/boost/archive/detail/common_oarchive.hpp       |     5 +                                       
   branches/serialization_next_release/boost/boost/archive/detail/interface_iarchive.hpp    |    24 +------                                 
   branches/serialization_next_release/boost/boost/archive/detail/interface_oarchive.hpp    |    23 +------                                 
   branches/serialization_next_release/boost/boost/archive/detail/iserializer.hpp           |   111 ++++++++++++++++++--------------------- 
   branches/serialization_next_release/boost/boost/archive/detail/oserializer.hpp           |    82 ++++++++++++++---------------           
   branches/serialization_next_release/boost/boost/archive/impl/basic_binary_iprimitive.ipp |     2                                         
   branches/serialization_next_release/boost/boost/archive/impl/basic_xml_oarchive.ipp      |    32 ++++++++++                              
   branches/serialization_next_release/boost/boost/archive/polymorphic_binary_iarchive.hpp  |    21 ++++---                                 
   branches/serialization_next_release/boost/boost/archive/polymorphic_binary_oarchive.hpp  |    13 ++--                                    
   branches/serialization_next_release/boost/boost/archive/polymorphic_iarchive.hpp         |    41 +++++++++-----                          
   branches/serialization_next_release/boost/boost/archive/polymorphic_oarchive.hpp         |    29 +++++-----                              
   branches/serialization_next_release/boost/boost/archive/polymorphic_text_iarchive.hpp    |    19 ++++--                                  
   branches/serialization_next_release/boost/boost/archive/polymorphic_text_oarchive.hpp    |    11 +--                                     
   branches/serialization_next_release/boost/boost/archive/polymorphic_text_wiarchive.hpp   |    11 +--                                     
   branches/serialization_next_release/boost/boost/archive/polymorphic_text_woarchive.hpp   |    11 +--                                     
   branches/serialization_next_release/boost/boost/archive/polymorphic_xml_iarchive.hpp     |    19 ++++--                                  
   branches/serialization_next_release/boost/boost/archive/polymorphic_xml_oarchive.hpp     |    11 +--                                     
   branches/serialization_next_release/boost/boost/archive/polymorphic_xml_wiarchive.hpp    |    11 +--                                     
   branches/serialization_next_release/boost/boost/archive/polymorphic_xml_woarchive.hpp    |    11 +--                                     
   branches/serialization_next_release/boost/boost/archive/text_iarchive.hpp                |    36 ++++++++++--                            
   branches/serialization_next_release/boost/boost/archive/text_oarchive.hpp                |     7 +-                                      
   branches/serialization_next_release/boost/boost/archive/text_wiarchive.hpp               |    36 ++++++++++--                            
   branches/serialization_next_release/boost/boost/archive/text_woarchive.hpp               |     7 +-                                      
   branches/serialization_next_release/boost/boost/archive/xml_iarchive.hpp                 |    39 ++++++++++---                           
   branches/serialization_next_release/boost/boost/archive/xml_oarchive.hpp                 |    13 ++--                                    
   branches/serialization_next_release/boost/boost/archive/xml_wiarchive.hpp                |    39 ++++++++++---                           
   branches/serialization_next_release/boost/boost/archive/xml_woarchive.hpp                |    13 ++--                                    
   51 files changed, 623 insertions(+), 447 deletions(-)
Modified: branches/serialization_next_release/boost/boost/archive/basic_archive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/basic_archive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/basic_archive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -117,14 +117,4 @@
 BOOST_CLASS_IMPLEMENTATION(boost::archive::object_reference_type, primitive_type)
 BOOST_CLASS_IMPLEMENTATION(boost::archive::tracking_type, primitive_type)
 
-/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
-// Make sure that the export.hpp header isn't included before any archive header
-// Doing so would inhibit construction of correct mpl list of known archive
-// types which in turn would inhibit instantiation of all combinations of
-// serialization/archive types.
-
-#ifdef BOOST_SERIALIZATION_EXPORT_HPP
-#error "export.hpp must not be included before any archive header"
-#endif
-
 #endif //BOOST_ARCHIVE_BASIC_ARCHIVE_HPP
Modified: branches/serialization_next_release/boost/boost/archive/basic_binary_iarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/basic_binary_iarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/basic_binary_iarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -28,9 +28,9 @@
 #include <boost/detail/workaround.hpp>
 #include <boost/pfto.hpp>
 
-#include <boost/archive/detail/common_iarchive.hpp>
 #include <boost/serialization/string.hpp>
-
+#include <boost/serialization/collection_size_type.hpp>
+#include <boost/archive/array/iarchive.hpp>
 #include <boost/archive/detail/abi_prefix.hpp> // must be the last header
 
 namespace boost { 
@@ -40,7 +40,7 @@
 // class basic_binary_iarchive - read serialized objects from a input binary stream
 template<class Archive>
 class basic_binary_iarchive : 
-    public detail::common_iarchive<Archive>
+    public array::iarchive<Archive>
 {
 protected:
 #if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
@@ -56,11 +56,10 @@
     // fot templates in the absence of partial function 
     // template ordering. If we get here pass to base class
     // note extra nonsense to sneak it pass the borland compiers
-    typedef detail::common_iarchive<Archive> detail_common_iarchive;
+    typedef array::iarchive<Archive> array_iarchive;
     template<class T>
-    void load_override(T & t, BOOST_PFTO int)
-    {
-        this->detail_common_iarchive::load_override(t, 0);
+    void load_override(T & t, BOOST_PFTO int){
+        this->array_iarchive::load_override(t, 0L);
     }
     // binary files don't include the optional information 
     void load_override(class_id_optional_type & /* t */, int){}
@@ -69,39 +68,44 @@
     // for these pseudo prmitive types.
     void load_override(version_type & t, int){ 
         // upto 255 versions
-        unsigned char x;
+        unsigned char x=0;
         * this->This() >> x;
         t = version_type(x);
     }
     void load_override(class_id_type & t, int){
         // upto 32K classes
-        int_least16_t x;
+        int_least16_t x=0;
         * this->This() >> x;
         t = class_id_type(x);
     }
     void load_override(class_id_reference_type & t, int){
         // upto 32K classes
-        int_least16_t x;
+        int_least16_t x=0;
         * this->This() >> x;
         t = class_id_reference_type(x);
     }
     void load_override(object_id_type & t, int){
         // upto 2G objects
-        uint_least32_t x;
+        uint_least32_t x=0;
         * this->This() >> x;
         t = object_id_type(x);
     }
     void load_override(object_reference_type & t, int){
         // upto 2G objects
-        uint_least32_t x;
+        uint_least32_t x=0;
         * this->This() >> x;
         t = object_reference_type(x);
     }
     void load_override(tracking_type & t, int){
-        char x;
+        char x=0;
         * this->This() >> x;
         t = (0 != x);
     }
+  void load_override(serialization::collection_size_type & t, int){
+       unsigned int x=0;
+       * this->This() >> x;
+       t = serialization::collection_size_type(x);
+   }
 
     BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
     load_override(class_name_type & t, int);
@@ -109,7 +113,7 @@
     init();
    
     basic_binary_iarchive(unsigned int flags) :
-        detail::common_iarchive<Archive>(flags)
+        array_iarchive(flags)
     {}
 };
 
Modified: branches/serialization_next_release/boost/boost/archive/basic_binary_iprimitive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/basic_binary_iprimitive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/basic_binary_iprimitive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -48,6 +48,9 @@
 #include <boost/archive/basic_streambuf_locale_saver.hpp>
 #include <boost/archive/archive_exception.hpp>
 #include <boost/archive/detail/auto_link_archive.hpp>
+#include <boost/mpl/placeholders.hpp>
+#include <boost/type_traits/is_fundamental.hpp>
+#include <boost/serialization/array.hpp>
 #include <boost/archive/detail/abi_prefix.hpp> // must be the last header
 
 namespace boost { 
@@ -86,6 +89,7 @@
         load_binary(& t, sizeof(t));
         int i = t;
         assert(0 == i || 1 == i);
+        (void)i; // warning suppression for release builds.
     }
     BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
     load(std::string &s);
@@ -108,6 +112,16 @@
     BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY()) 
     ~basic_binary_iprimitive();
 public:
+    // we provide an optimized load for all fundamental types
+    typedef is_fundamental<mpl::_1> use_array_optimization;
+
+    // the optimized load_array dispatches to load_binary 
+    template <class ValueType>
+    void load_array(serialization::array<ValueType>& a, unsigned int)
+    {
+      load_binary(a.address(),a.count()*sizeof(ValueType));
+    }
+
     void
     load_binary(void *address, std::size_t count);
 };
@@ -146,7 +160,7 @@
         static_cast<Elem *>(address), 
         s
     );
-    if(count != static_cast<std::size_t>(s))
+    if(scount != s)
         boost::throw_exception(
             archive_exception(archive_exception::stream_error)
         );
@@ -157,7 +171,7 @@
 //            boost::throw_exception(archive_exception(archive_exception::stream_error));
         Elem t;
         scount = m_sb.sgetn(& t, 1);
-        if(count != 1)
+        if(scount != 1)
             boost::throw_exception(
                 archive_exception(archive_exception::stream_error)
             );
Modified: branches/serialization_next_release/boost/boost/archive/basic_binary_oarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/basic_binary_oarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/basic_binary_oarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -27,8 +27,10 @@
 #include <boost/pfto.hpp>
 
 #include <boost/detail/workaround.hpp>
-#include <boost/archive/detail/common_oarchive.hpp>
+#include <boost/archive/array/oarchive.hpp>
 #include <boost/serialization/string.hpp>
+#include <boost/serialization/collection_size_type.hpp>
+#include <boost/archive/array/oarchive.hpp>
 
 namespace boost {
 namespace archive {
@@ -41,12 +43,9 @@
 // by a program built with the same tools for the same machne.  This class
 // does have the virtue of buiding the smalles archive in the minimum amount
 // of time.  So under some circumstances it may be he right choice.
-
-/////////////////////////////////////////////////////////////////////////
-// class basic_text_iarchive - read serialized objects from a input text stream
 template<class Archive>
 class basic_binary_oarchive : 
-    public detail::common_oarchive<Archive>
+    public array::oarchive<Archive>
 {
 protected:
 #if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
@@ -59,33 +58,39 @@
     friend class detail::interface_oarchive<Archive>;
 #endif
     // any datatype not specifed below will be handled by base class
-    typedef detail::common_oarchive<Archive> detail_common_oarchive;
+    typedef array::oarchive<Archive> array_oarchive;
+    template<class T>
+    void save_override(const T & t, BOOST_PFTO int){
+        this->array_oarchive::save_override(t, 0L);
+    }
+    /*
     template<class T>
     void save_override(T & t, BOOST_PFTO int){
-        this->detail_common_oarchive::save_override(t, 0);
+        this->save_override(const_cast<const T &>(t), 0L);
     }
+    */
     // binary files don't include the optional information 
     void save_override(const class_id_optional_type & /* t */, int){}
 
     void save_override(const version_type & t, int){
         // upto 255 versions
         // note:t.t resolves borland ambguity
-        unsigned  char x = t.t;
+        const unsigned char x = t.t;
         * this->This() << x;
     }
     void save_override(const class_id_type & t, int){
         // upto 32K classes
-        int_least16_t x = t.t;
+        const int_least16_t x = t.t;
         * this->This() << x;
     }
     void save_override(const class_id_reference_type & t, int){
         // upto 32K classes
-        int_least16_t x = t.t;
+        const int_least16_t x = t.t;
         * this->This() << x;
     }
     void save_override(const object_id_type & t, int){
         // upto 2G objects
-        uint_least32_t x = t.t;
+        const uint_least32_t x = t.t;
         * this->This() << x;
     }
     void save_override(const object_reference_type & t, int){
@@ -94,7 +99,7 @@
         * this->This() << x;
     }
     void save_override(const tracking_type & t, int){
-        char x = t.t;
+        const char x = t.t;
         * this->This() << x;
     }
 
@@ -104,11 +109,17 @@
         * this->This() << s;
     }
 
+    void save_override(const serialization::collection_size_type & t, int){
+    // for backward compatibility, 64 bit integer or variable length integer would be preferred
+        unsigned int x = t.t;
+        * this->This() << x;
+   }
+
     BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
     init();
 
     basic_binary_oarchive(unsigned int flags) :
-        detail::common_oarchive<Archive>(flags)
+        array_oarchive(flags)
     {}
 };
 
Modified: branches/serialization_next_release/boost/boost/archive/basic_binary_oprimitive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/basic_binary_oprimitive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/basic_binary_oprimitive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -46,6 +46,9 @@
 #include <boost/archive/basic_streambuf_locale_saver.hpp>
 #include <boost/archive/archive_exception.hpp>
 #include <boost/archive/detail/auto_link_archive.hpp>
+#include <boost/type_traits/is_fundamental.hpp>
+#include <boost/mpl/placeholders.hpp>
+#include <boost/serialization/array.hpp>
 #include <boost/archive/detail/abi_prefix.hpp> // must be the last header
 
 namespace boost {
@@ -101,6 +104,7 @@
 
     BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
     init();
+    
     BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY()) 
     basic_binary_oprimitive(
         std::basic_streambuf<Elem, Tr> & sb, 
@@ -109,6 +113,16 @@
     BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY()) 
     ~basic_binary_oprimitive();
 public:
+    // we provide an optimized save for all fundamental types
+    typedef is_fundamental<mpl::_1> use_array_optimization;
+
+    // the optimized save_array dispatches to save_binary 
+    template <class ValueType>
+    void save_array(serialization::array<ValueType> const& a, unsigned int)
+    {
+      save_binary(a.address(),a.count()*sizeof(ValueType));
+    }
+
     void save_binary(const void *address, std::size_t count);
 };
 
Modified: branches/serialization_next_release/boost/boost/archive/basic_text_iarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/basic_text_iarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/basic_text_iarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -61,7 +61,7 @@
     {
         this->detail_common_iarchive::load_override(t, 0);
     }
-
+#if 0
     // Borland compilers has a problem with strong type.  Try to fix this here
     #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
     void load_override(version_type & t, int){ 
@@ -70,7 +70,7 @@
         t.t = version_type(x);
     }
     #endif
-
+#endif
     // text file don't include the optional information 
     void load_override(class_id_optional_type & /*t*/, int){}
 
Modified: branches/serialization_next_release/boost/boost/archive/basic_text_oarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/basic_text_oarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/basic_text_oarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -78,36 +78,39 @@
     // start new objects on a new line
     void save_override(const object_id_type & t, int){
         this->This()->newline();
-        // and and invoke prmitive to underlying value
+        // note extra .t to funciton with Borland 5.51 compiler
+        // and invoke prmitive to underlying value
         this->This()->save(t.t);
     }
 
     void save_override(const object_reference_type & t, int){
         this->This()->newline();
-        // and and invoke prmitive to underlying value
+        // note extra .t to funciton with Borland 5.51 compiler
+        // and invoke prmitive to underlying value
         this->This()->save(t.t);
     }
 
-    // text file don't include the optional information 
-    void save_override(const class_id_optional_type & /* t */, int){}
-
     // note the following four overrides are necessary for some borland
-    // compilers which don't handle BOOST_STRONG_TYPE properly.
+    // compilers(5.51) which don't handle BOOST_STRONG_TYPE properly.
     void save_override(const version_type & t, int){
         // note:t.t resolves borland ambguity
-        unsigned int x = t.t;
+        const unsigned int x = t.t;
         * this->This() << x;
     }
     void save_override(const class_id_type & t, int){
         // note:t.t resolves borland ambguity
-        int x = t.t;
+        const int x = t.t;
         * this->This() << x;
     }
     void save_override(const class_id_reference_type & t, int){
         // note:t.t resolves borland ambguity
-        int x = t.t;
+        const int x = t.t;
         * this->This() << x;
     }
+
+    // text file don't include the optional information 
+    void save_override(const class_id_optional_type & /* t */, int){}
+
     void save_override(const class_name_type & t, int){
         const std::string s(t);
         * this->This() << s;
Modified: branches/serialization_next_release/boost/boost/archive/basic_text_oprimitive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/basic_text_oprimitive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/basic_text_oprimitive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -89,10 +89,8 @@
     void save(const bool t){
         // trap usage of invalid uninitialized boolean which would
         // otherwise crash on load.
-#ifndef NDEBUG
         int i = t;
         assert(0 == i || 1 == i);
-#endif
         if(os.fail())
             boost::throw_exception(archive_exception(archive_exception::stream_error));
         os << t;
Modified: branches/serialization_next_release/boost/boost/archive/basic_xml_archive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/basic_xml_archive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/basic_xml_archive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -36,7 +36,7 @@
         xml_archive_tag_mismatch,
         xml_archive_tag_name_error
     } exception_code;
-    xml_archive_exception(exception_code /* c */)
+    xml_archive_exception(exception_code c)
     {}
     virtual const char *what( ) const throw( )
     {
Modified: branches/serialization_next_release/boost/boost/archive/basic_xml_iarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/basic_xml_iarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/basic_xml_iarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -9,7 +9,7 @@
 /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
 // basic_xml_iarchive.hpp
 
-// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
 // 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)
@@ -25,6 +25,8 @@
 #include <boost/serialization/nvp.hpp>
 #include <boost/serialization/string.hpp>
 
+#include <boost/mpl/assert.hpp>
+
 #include <boost/archive/detail/abi_prefix.hpp> // must be the last header
 
 namespace boost {
@@ -33,7 +35,7 @@
 /////////////////////////////////////////////////////////////////////////
 // class xml_iarchive - read serialized objects from a input text stream
 template<class Archive>
-class basic_xml_iarchive : 
+class basic_xml_iarchive :
     public detail::common_iarchive<Archive>
 {
 protected:
@@ -60,7 +62,8 @@
         // If your program fails to compile here, its most likely due to
         // not specifying an nvp wrapper around the variable to
         // be serialized.
-        BOOST_STATIC_ASSERT(0 == sizeof(T));
+        BOOST_MPL_ASSERT((serialization::is_wrapper<T>));
+        this->detail_common_iarchive::load_override(t, 0);
     }
 
     // Anything not an attribute - see below - should be a name value
@@ -71,7 +74,7 @@
         #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
         const
         #endif
-        boost::serialization::nvp<T> & t, 
+        boost::serialization::nvp<T> & t,
         int
     ){
         load_start(t.name());
@@ -101,9 +104,9 @@
     // handle this.
     // void load_override(class_name_type & t, int);
 
-    BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY()) 
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
     basic_xml_iarchive(unsigned int flags);
-    BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY()) 
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
     ~basic_xml_iarchive();
 };
 
Modified: branches/serialization_next_release/boost/boost/archive/basic_xml_oarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/basic_xml_oarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/basic_xml_oarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -9,7 +9,7 @@
 /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
 // basic_xml_oarchive.hpp
 
-// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
 // 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)
@@ -24,15 +24,18 @@
 #include <boost/serialization/tracking.hpp>
 #include <boost/serialization/string.hpp>
 
+#include <boost/mpl/assert.hpp>
+
 #include <boost/archive/detail/abi_prefix.hpp> // must be the last header
 
-namespace boost { 
+
+namespace boost {
 namespace archive {
-        
+
 //////////////////////////////////////////////////////////////////////
 // class basic_xml_oarchive - write serialized objects to a xml output stream
 template<class Archive>
-class basic_xml_oarchive : 
+class basic_xml_oarchive :
     public detail::common_oarchive<Archive>
 {
 protected:
@@ -42,8 +45,10 @@
     // for some inexplicable reason insertion of "class" generates compile erro
     // on msvc 7.1
     friend detail::interface_oarchive<Archive>;
+    friend class save_access;
 #else
     friend class detail::interface_oarchive<Archive>;
+    friend class save_access;
 #endif
     // special stuff for xml output
     unsigned int depth;
@@ -55,13 +60,13 @@
     init();
     BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
     write_attribute(
-        const char *attribute_name, 
+        const char *attribute_name,
         int t,
         const char *conjunction = "=\""
     );
     BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
     write_attribute(
-        const char *attribute_name, 
+        const char *attribute_name,
         const char *key
     );
     // helpers used below
@@ -80,7 +85,8 @@
         // If your program fails to compile here, its most likely due to
         // not specifying an nvp wrapper around the variable to
         // be serialized.
-        BOOST_STATIC_ASSERT(0 == sizeof(T));
+        BOOST_MPL_ASSERT((serialization::is_wrapper<T>));
+        this->detail_common_oarchive::save_override(t, 0);
     }
 
    // special treatment for name-value pairs.
@@ -90,7 +96,7 @@
         #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
         const
         #endif
-        ::boost::serialization::nvp<T> & t, 
+        ::boost::serialization::nvp<T> & t,
         int
     ){
         save_start(t.name());
@@ -117,9 +123,9 @@
     BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
     save_override(const tracking_type & t, int);
 
-    BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY()) 
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
     basic_xml_oarchive(unsigned int flags);
-    BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY()) 
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
     ~basic_xml_oarchive();
 };
 
Modified: branches/serialization_next_release/boost/boost/archive/binary_iarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/binary_iarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/binary_iarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -22,6 +22,43 @@
 namespace boost { 
 namespace archive {
 
+// do not derive from the classes below.  If you want to extend this functionality
+// via inhertance, derived from text_iarchive_impl instead.  This will
+// preserve correct static polymorphism.
+
+// same as binary_iarchive below - without the shared_ptr_helper
+class naked_binary_iarchive : 
+    public binary_iarchive_impl<
+        boost::archive::naked_binary_iarchive, 
+        std::istream::char_type, 
+        std::istream::traits_type
+    >
+{
+public:
+    naked_binary_iarchive(std::istream & is, unsigned int flags = 0) :
+        binary_iarchive_impl<
+            naked_binary_iarchive, std::istream::char_type, std::istream::traits_type
+        >(is, flags)
+    {}
+    naked_binary_iarchive(std::streambuf & bsb, unsigned int flags = 0) :
+        binary_iarchive_impl<
+            naked_binary_iarchive, std::istream::char_type, std::istream::traits_type
+        >(bsb, flags)
+    {}
+};
+
+} // namespace archive
+} // namespace boost
+
+// note special treatment of shared_ptr. This type needs a special
+// structure associated with every archive.  We created a "mix-in"
+// class to provide this functionality.  Since shared_ptr holds a
+// special esteem in the boost library - we included it here by default.
+#include <boost/archive/shared_ptr_helper.hpp>
+
+namespace boost { 
+namespace archive {
+
 // do not derive from this class.  If you want to extend this functionality
 // via inhertance, derived from binary_iarchive_impl instead.  This will
 // preserve correct static polymorphism.
@@ -30,7 +67,8 @@
         boost::archive::binary_iarchive, 
         std::istream::char_type, 
         std::istream::traits_type
-    >
+    >,
+    public detail::shared_ptr_helper
 {
 public:
     binary_iarchive(std::istream & is, unsigned int flags = 0) :
@@ -48,8 +86,7 @@
 } // namespace archive
 } // namespace boost
 
-// required by smart_cast for compilers not implementing 
-// partial template specialization
-BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(boost::archive::binary_iarchive)
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::binary_iarchive)
 
 #endif // BOOST_ARCHIVE_BINARY_IARCHIVE_HPP
Modified: branches/serialization_next_release/boost/boost/archive/binary_iarchive_impl.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/binary_iarchive_impl.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/binary_iarchive_impl.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -42,7 +42,7 @@
     // make this protected so it can be called from a derived archive
     template<class T>
     void load_override(T & t, BOOST_PFTO int){
-        basic_binary_iarchive<Archive>::load_override(t, 0);
+        this->basic_binary_iarchive<Archive>::load_override(t, 0L);
     }
     void init(unsigned int flags){
         if(0 != (flags & no_header))
Modified: branches/serialization_next_release/boost/boost/archive/binary_oarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/binary_oarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/binary_oarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -43,11 +43,12 @@
     {}
 };
 
+typedef binary_oarchive naked_binary_oarchive;
+
 } // namespace archive
 } // namespace boost
 
-// required by smart_cast for compilers not implementing 
-// partial template specialization
-BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(boost::archive::binary_oarchive)
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::binary_oarchive)
 
 #endif // BOOST_ARCHIVE_BINARY_OARCHIVE_HPP
Modified: branches/serialization_next_release/boost/boost/archive/binary_oarchive_impl.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/binary_oarchive_impl.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/binary_oarchive_impl.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -42,7 +42,7 @@
     // make this protected so it can be called from a derived archive
     template<class T>
     void save_override(T & t, BOOST_PFTO int){
-        basic_binary_oarchive<Archive>::save_override(t, 0);
+        this->basic_binary_oarchive<Archive>::save_override(t, 0L);
     }
     void init(unsigned int flags) {
         if(0 != (flags & no_header))
Modified: branches/serialization_next_release/boost/boost/archive/binary_wiarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/binary_wiarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/binary_wiarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -27,9 +27,43 @@
 namespace boost { 
 namespace archive {
 
-// do not derive from this class.  If you want to extend this functionality
-// via inhertance, derived from binary_iarchive_impl instead.  This will
-// preserve correct static polymorphism.
+// same as binary_wiarchive below - without the shared_ptr_helper
+class naked_binary_wiarchive : 
+    public binary_iarchive_impl<
+        boost::archive::naked_binary_wiarchive, 
+        std::wistream::char_type, 
+        std::wistream::traits_type
+    >
+{
+public:
+    naked_binary_wiarchive(std::wistream & is, unsigned int flags = 0) :
+        binary_iarchive_impl<
+            naked_binary_wiarchive, 
+            std::wistream::char_type, 
+            std::wistream::traits_type
+        >(is, flags)
+    {}
+    naked_binary_wiarchive(std::wstreambuf & bsb, unsigned int flags = 0) :
+        binary_iarchive_impl<
+            naked_binary_wiarchive, 
+            std::wistream::char_type, 
+            std::wistream::traits_type
+        >(bsb, flags)
+    {}
+};
+
+} // namespace archive
+} // namespace boost
+
+// note special treatment of shared_ptr. This type needs a special
+// structure associated with every archive.  We created a "mix-in"
+// class to provide this functionality.  Since shared_ptr holds a
+// special esteem in the boost library - we included it here by default.
+#include <boost/archive/shared_ptr_helper.hpp>
+
+namespace boost { 
+namespace archive {
+
 class binary_wiarchive : 
     public binary_iarchive_impl<
         binary_wiarchive, std::wistream::char_type, std::wistream::traits_type
@@ -51,9 +85,8 @@
 } // namespace archive
 } // namespace boost
 
-// required by smart_cast for compilers not implementing 
-// partial template specialization
-BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(boost::archive::binary_wiarchive)
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::binary_wiarchive)
 
 #endif // BOOST_NO_STD_WSTREAMBUF
 #endif // BOOST_ARCHIVE_BINARY_WIARCHIVE_HPP
Modified: branches/serialization_next_release/boost/boost/archive/binary_woarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/binary_woarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/binary_woarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -48,12 +48,13 @@
     {}
 };
 
+typedef binary_woarchive naked_binary_woarchive;
+
 } // namespace archive
 } // namespace boost
 
-// required by smart_cast for compilers not implementing 
-// partial template specialization
-BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(boost::archive::binary_woarchive)
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::binary_woarchive)
 
 #endif // BOOST_NO_STD_WSTREAMBUF
 #endif // BOOST_ARCHIVE_BINARY_WOARCHIVE_HPP
Modified: branches/serialization_next_release/boost/boost/archive/codecvt_null.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/codecvt_null.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/codecvt_null.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -25,14 +25,16 @@
     #if defined(__LIBCOMO__)
         using ::mbstate_t;
     #elif defined(__QNXNTO__)
-        using std::mbstate_t;
+        //using std::mbstate_t;
     #elif defined(BOOST_DINKUMWARE_STDLIB) && BOOST_DINKUMWARE_STDLIB == 1
         using ::mbstate_t;
     #elif defined(__SGI_STL_PORT)
     #elif defined(BOOST_NO_STDC_NAMESPACE)
         using ::codecvt;
         using ::mbstate_t;
-    #endif
+    #elif defined(BOOST_RWSTD_VER)
+        using ::mbstate_t;
+   #endif
 } // namespace std
 
 namespace boost {
Modified: branches/serialization_next_release/boost/boost/archive/detail/abi_prefix.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/detail/abi_prefix.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/detail/abi_prefix.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -13,3 +13,8 @@
 #  pragma warning(push)
 #  pragma warning(disable : 4251 4231 4660 4275)
 #endif
+
+#if defined( __BORLANDC__ )
+#pragma nopushoptwarn
+#endif
+
Modified: branches/serialization_next_release/boost/boost/archive/detail/abi_suffix.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/detail/abi_suffix.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/detail/abi_suffix.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -12,3 +12,8 @@
 #pragma warning(pop)
 #endif
 #include <boost/config/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#if defined( __BORLANDC__ )
+#pragma nopushoptwarn
+#endif
+
Modified: branches/serialization_next_release/boost/boost/archive/detail/basic_archive_impl.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/detail/basic_archive_impl.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/detail/basic_archive_impl.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -20,7 +20,6 @@
 // #include <boost/scoped_ptr.hpp>
 
 #include <set>
-#include <boost/shared_ptr.hpp>
 
 #include <boost/archive/detail/abi_prefix.hpp> // must be the last header
 
@@ -35,48 +34,6 @@
 //////////////////////////////////////////////////////////////////////
 class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) basic_archive_impl
 {
-    //////////////////////////////////////////////////////////////////////
-    // list of serialization helpers
-    // at least one compiler sunpro 5.3 erroneously doesn't give access to embedded structs
-    struct helper_compare;
-    friend struct helper_compare;
-
-    struct helper_type {
-        shared_ptr<void> m_helper;
-        const boost::serialization::extended_type_info * m_eti;
-        helper_type(
-            shared_ptr<void> h, 
-            const boost::serialization::extended_type_info * const eti
-        ) :
-            m_helper(h),
-            m_eti(eti)
-        {}
-    };
-
-    struct helper_compare {
-        bool operator()(
-            const helper_type & lhs, 
-            const helper_type & rhs
-        ) const {
-            return lhs.m_eti < rhs.m_eti;
-        }
-    };
-
-    typedef std::set<helper_type, helper_compare> collection;
-    typedef collection::iterator helper_iterator;
-    typedef collection::const_iterator helper_const_iterator;
-    collection m_helpers;
-protected:
-    void
-    lookup_helper(
-        const boost::serialization::extended_type_info * const eti,
-        shared_ptr<void> & sph
-    );
-    void
-    insert_helper(
-        const boost::serialization::extended_type_info * const eti,
-        shared_ptr<void> & sph
-    );
 };
 
 } // namespace detail
Modified: branches/serialization_next_release/boost/boost/archive/detail/basic_iarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/detail/basic_iarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/detail/basic_iarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -65,26 +65,20 @@
 public:
     // note: NOT part of the public API.
     void next_object_pointer(void *t);
-    void register_basic_serializer(const basic_iserializer & bis);
-    void
-    lookup_basic_helper(
-        const boost::serialization::extended_type_info * const eti,
-        shared_ptr<void> & sph
-    );
-    void 
-    insert_basic_helper(
-        const boost::serialization::extended_type_info * const eti,
-        shared_ptr<void> & sph
+    void register_basic_serializer(
+        const /* BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) */ basic_iserializer & bis
     );
     void load_object(
         void *t, 
-        const basic_iserializer & bis
+        const /* BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) */ basic_iserializer & bis
     );
-    const basic_pointer_iserializer * 
+    const /* BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) */ basic_pointer_iserializer * 
     load_pointer(
         void * & t, 
-        const basic_pointer_iserializer * bpis_ptr,
-        const basic_pointer_iserializer * (*finder)(
+        const /* BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) */
+            basic_pointer_iserializer * bpis_ptr,
+        const /* BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) */
+        basic_pointer_iserializer * (*finder)(
             const boost::serialization::extended_type_info & eti
         )
     );
Modified: branches/serialization_next_release/boost/boost/archive/detail/basic_oarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/detail/basic_oarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/detail/basic_oarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -62,7 +62,7 @@
     virtual void vsave(const class_name_type & t) = 0;
     virtual void vsave(const tracking_type t) = 0;
 protected:
-    basic_oarchive(unsigned int flags);
+    basic_oarchive(unsigned int flags = 0);
     // account for bogus gcc warning
     #if defined(__GNUC__)
     virtual
@@ -70,24 +70,17 @@
     ~basic_oarchive();
 public:
     // note: NOT part of the public interface
-    void register_basic_serializer(const basic_oserializer & bos);
-    void
-    lookup_basic_helper(
-        const boost::serialization::extended_type_info * const eti,
-        shared_ptr<void> & sph
-    );
-    void 
-    insert_basic_helper(
-        const boost::serialization::extended_type_info * const eti,
-        shared_ptr<void> & sph
+    void register_basic_serializer(
+        const /* BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) */ basic_oserializer & bos
     );
     void save_object(
         const void *x, 
-        const basic_oserializer & bos
+        const /* BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) */ basic_oserializer & bos
     );
     void save_pointer(
         const void * t, 
-        const basic_pointer_oserializer * bpos_ptr
+        const /* BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) */ 
+            basic_pointer_oserializer * bpos_ptr
     );
     void save_null_pointer(){
         vsave(NULL_POINTER_TAG);
Modified: branches/serialization_next_release/boost/boost/archive/detail/common_iarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/detail/common_iarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/detail/common_iarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -19,6 +19,7 @@
 #include <boost/archive/detail/basic_iarchive.hpp>
 #include <boost/archive/detail/interface_iarchive.hpp>
 #include <boost/archive/detail/iserializer.hpp>
+#include <boost/archive/detail/register_archive.hpp>
 #include <boost/pfto.hpp>
 
 namespace boost {
@@ -31,6 +32,7 @@
     public basic_iarchive,
     public interface_iarchive<Archive>
 {
+    friend class interface_iarchive<Archive>;
 private:
     virtual void vload(version_type & t){
         * this->This() >> t; 
@@ -61,7 +63,7 @@
     void load_start(const char *name){}
     void load_end(const char *name){}
     // default archive initialization
-    common_iarchive(unsigned int flags) : 
+    common_iarchive(unsigned int flags = 0) : 
         basic_iarchive(flags),
         interface_iarchive<Archive>()
     {}
Modified: branches/serialization_next_release/boost/boost/archive/detail/common_oarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/detail/common_oarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/detail/common_oarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -19,6 +19,7 @@
 #include <boost/archive/detail/basic_oarchive.hpp>
 #include <boost/archive/detail/interface_oarchive.hpp>
 #include <boost/archive/detail/oserializer.hpp>
+#include <boost/archive/detail/register_archive.hpp>
 
 namespace boost {
 namespace archive {
@@ -30,6 +31,7 @@
     public basic_oarchive,
     public interface_oarchive<Archive>
 {
+    friend class interface_oarchive<Archive>;
 private:
     virtual void vsave(const version_type t){
         * this->This() << t;
@@ -61,10 +63,9 @@
     void save_override(T & t, BOOST_PFTO int){
         archive::save(* this->This(), t);
     }
-
     void save_start(const char *name){}
     void save_end(const char *name){}
-    common_oarchive(unsigned int flags) : 
+    common_oarchive(unsigned int flags = 0) : 
         basic_oarchive(flags),
         interface_oarchive<Archive>()
     {}
Modified: branches/serialization_next_release/boost/boost/archive/detail/interface_iarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/detail/interface_iarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/detail/interface_iarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -28,6 +28,7 @@
 namespace serialization {
     class extended_type_info;
 } // namespace serialization
+
 namespace archive {
 namespace detail {
 
@@ -50,28 +51,13 @@
     }
 
     template<class T>
-    const basic_pointer_iserializer * register_type(T * = NULL){
-        const basic_pointer_iserializer & bpis =
-            instantiate_pointer_iserializer(
-                static_cast<Archive *>(NULL),
-                static_cast<T *>(NULL)
-            );
+    const /* BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) */ basic_pointer_iserializer * 
+    register_type(T * = NULL){
+        const /* BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) */ basic_pointer_iserializer & bpis =
+            pointer_iserializer<Archive, T>::get_instance();
         this->This()->register_basic_serializer(bpis.get_basic_serializer());
         return & bpis;
     }
-    void lookup_helper(
-        const boost::serialization::extended_type_info * const eti,
-        boost::shared_ptr<void> & sph
-    ){
-        this->This()->lookup_basic_helper(eti, sph);
-    }
-
-    void insert_helper(
-        const boost::serialization::extended_type_info * const eti,
-        shared_ptr<void> & sph
-    ){
-        this->This()->insert_basic_helper(eti, sph);
-    }
     template<class T>
     Archive & operator>>(T & t){
         this->This()->load_override(t, 0);
Modified: branches/serialization_next_release/boost/boost/archive/detail/interface_oarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/detail/interface_oarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/detail/interface_oarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -51,29 +51,14 @@
     }
 
     template<class T>
-    const basic_pointer_oserializer * register_type(const T * = NULL){
-        const basic_pointer_oserializer & bpos =
-            instantiate_pointer_oserializer(
-                static_cast<Archive *>(NULL),
-                static_cast<T *>(NULL)
-            );
+    const  /* BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) */ basic_pointer_oserializer * 
+    register_type(const T * = NULL){
+        const /* BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) */ basic_pointer_oserializer & bpos =
+            pointer_oserializer<Archive, T>::get_instance();
         this->This()->register_basic_serializer(bpos.get_basic_serializer());
         return & bpos;
     }
 
-    void lookup_helper(
-        const boost::serialization::extended_type_info * const eti,
-        boost::shared_ptr<void> & sph
-    ){
-        this->This()->lookup_basic_helper(eti, sph);
-    }
-
-    void insert_helper(
-        const boost::serialization::extended_type_info * const eti,
-        shared_ptr<void> & sph
-    ){
-        this->This()->insert_basic_helper(eti, sph);
-    }
     template<class T>
     Archive & operator<<(T & t){
         this->This()->save_override(t, 0);
Modified: branches/serialization_next_release/boost/boost/archive/detail/iserializer.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/detail/iserializer.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/detail/iserializer.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -44,6 +44,7 @@
 #include <boost/type_traits/is_enum.hpp>
 #include <boost/type_traits/is_const.hpp>
 #include <boost/type_traits/remove_const.hpp>
+#include <boost/type_traits/remove_all_extents.hpp>
 #include <boost/serialization/is_abstract.hpp>
 
 #include <boost/mpl/eval_if.hpp>
@@ -57,6 +58,7 @@
 #include <boost/mpl/list.hpp>
 #include <boost/mpl/empty.hpp>
 #include <boost/mpl/not.hpp>
+#include <boost/mpl/bool.hpp>
 
  #ifndef BOOST_SERIALIZATION_DEFAULT_TYPE_INFO   
      #include <boost/serialization/extended_type_info_typeid.hpp>   
@@ -65,7 +67,7 @@
 #include <boost/archive/detail/basic_iarchive.hpp>
 #include <boost/archive/detail/basic_iserializer.hpp>
 #include <boost/archive/detail/archive_pointer_iserializer.hpp>
-#include <boost/archive/archive_exception.hpp>
+#include <boost/archive/detail/dynamically_initialized.hpp>
 
 #include <boost/serialization/force_include.hpp>
 #include <boost/serialization/serialization.hpp>
@@ -74,9 +76,9 @@
 #include <boost/serialization/tracking.hpp>
 #include <boost/serialization/type_info_implementation.hpp>
 #include <boost/serialization/nvp.hpp>
-#include <boost/serialization/binary_object.hpp>
 #include <boost/serialization/void_cast.hpp>
-
+#include <boost/serialization/array.hpp>
+#include <boost/serialization/collection_size_type.hpp>
 namespace boost {
 
 namespace serialization {
@@ -127,7 +129,7 @@
         return boost::serialization::tracking_level<T>::value 
                 == boost::serialization::track_always
             || boost::serialization::tracking_level<T>::value 
-                == boost::serialization::track_selectivly
+                == boost::serialization::track_selectively
             && serialized_as_pointer();
     }
     virtual unsigned int version() const {
@@ -140,7 +142,7 @@
             >::type::is_polymorphic::type typex;
         return typex::value;
     }
-    static iserializer & instantiate(){
+    static iserializer & get_instance(){
         static iserializer instance;
         return instance;
     }
@@ -162,15 +164,14 @@
     );
 }
 
-// instantiation of this template creates a static object.  Note inversion of
-// normal argument order to workaround bizarre error in MSVC 6.0 which only
-// manifests iftself during compiler time.
-template<class T, class Archive>
-class pointer_iserializer : public archive_pointer_iserializer<Archive> 
+template<class Archive, class T>
+class pointer_iserializer
+  : public archive_pointer_iserializer<Archive>
+  , public dynamically_initialized<pointer_iserializer<Archive,T> >
 {
 private:
     virtual const basic_iserializer & get_basic_serializer() const {
-        return iserializer<Archive, T>::instantiate();
+        return iserializer<Archive, T>::get_instance();
     }
     virtual BOOST_DLLEXPORT void load_object_ptr(
         basic_iarchive & ar, 
@@ -182,32 +183,18 @@
 #endif
     // private constructor to inhibit any existence other than the 
     // static one.  Note GCC doesn't permit constructor to be private
-    explicit BOOST_DLLEXPORT pointer_iserializer() BOOST_USED;
-    static const pointer_iserializer instance;
+    BOOST_DLLEXPORT pointer_iserializer() BOOST_USED;
+    friend struct dynamically_initialized<pointer_iserializer<Archive,T> >;
 public:
     // at least one compiler (CW) seems to require that serialize_adl
     // be explicitly instantiated. Still under investigation. 
-    #if ! BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
+    #if !defined(__BORLANDC__)
     void (* const m)(Archive &, T &, const unsigned);
     boost::serialization::extended_type_info * (* e)();
     #endif
-    static BOOST_DLLEXPORT const pointer_iserializer & instantiate() BOOST_USED;
-    virtual ~pointer_iserializer(){};
+    BOOST_DLLEXPORT static const pointer_iserializer & get_instance() BOOST_USED;
 };
 
-template<class T, class Archive>
-BOOST_DLLEXPORT const pointer_iserializer<T, Archive> & 
-pointer_iserializer<T, Archive>::instantiate() {
-    return instance;
-}
-
-// note: instances of this template to be constructed before the main
-// is called in order for things to be initialized properly.  For this
-// reason, hiding the instance in a static function as was done above
-// won't work here so we created a free instance here.
-template<class T, class Archive>
-const pointer_iserializer<T, Archive> pointer_iserializer<T, Archive>::instance;
-
 // note trick to be sure that operator new is using class specific
 // version if such exists. Due to Peter Dimov.
 // note: the following fails if T has no default constructor.
@@ -278,19 +265,15 @@
     T* m_p;
 };
 
-template<class T, class Archive>
-BOOST_DLLEXPORT void pointer_iserializer<T, Archive>::load_object_ptr(
+template<class Archive, class T>
+BOOST_DLLEXPORT void pointer_iserializer<Archive, T>::load_object_ptr(
     basic_iarchive & ar, 
     void * & x,
     const unsigned int file_version
-) const {
+) const
+{
     Archive & ar_impl = boost::smart_cast_reference<Archive &>(ar);
 
-//    if(0 != (ar.get_flags() & no_object_creation)){
-//        ar_impl >> boost::serialization::make_nvp(NULL, * static_cast<T *>(x));
-//        return;
-//    }
-
     auto_ptr_with_deleter<T> ap(heap_allocator<T>::invoke());
     if(NULL == ap.get())
         boost::throw_exception(std::bad_alloc()) ;
@@ -312,6 +295,7 @@
         );
     }
     BOOST_CATCH(...){
+        ap.release();
         BOOST_RETHROW;
     }
     BOOST_CATCH_END
@@ -320,26 +304,33 @@
     ap.release();
 }
 
-template<class T, class Archive>
-#if ! BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
-BOOST_DLLEXPORT pointer_iserializer<T, Archive>::pointer_iserializer() :
+template<class Archive, class T>
+#if !defined(__BORLANDC__)
+BOOST_DLLEXPORT pointer_iserializer<Archive, T>::pointer_iserializer() :
     archive_pointer_iserializer<Archive>(
         * boost::serialization::type_info_implementation<T>::type::get_instance()
     ),
     m(boost::serialization::serialize_adl<Archive, T>),
     e(boost::serialization::type_info_implementation<T>::type::get_instance)
 #else
-BOOST_DLLEXPORT pointer_iserializer<T, Archive>::pointer_iserializer() :
+BOOST_DLLEXPORT pointer_iserializer<Archive, T>::pointer_iserializer() :
     archive_pointer_iserializer<Archive>(
         * boost::serialization::type_info_implementation<T>::type::get_instance()
     )
 #endif
 {
-    iserializer<Archive, T> & bis = iserializer<Archive, T>::instantiate();
+    iserializer<Archive, T> & bis = iserializer<Archive, T>::get_instance();
     bis.set_bpis(this);
 }
 
 template<class Archive, class T>
+BOOST_DLLEXPORT const pointer_iserializer<Archive, T> &
+pointer_iserializer<Archive, T>::get_instance() {
+    // note: comeau complains without full qualification
+    return dynamically_initialized<pointer_iserializer<Archive,T> >::instance;
+}
+
+template<class Archive, class T>
 struct load_non_pointer_type {
     // note this bounces the call right back to the archive
     // with no runtime overhead
@@ -370,7 +361,7 @@
             // its not called that way - so fix it her
             typedef BOOST_DEDUCED_TYPENAME boost::remove_const<T>::type typex;
             void * x = & const_cast<typex &>(t);
-            ar.load_object(x, iserializer<Archive, T>::instantiate());
+            ar.load_object(x, iserializer<Archive, T>::get_instance());
         }
     };
 
@@ -506,6 +497,8 @@
 template<class Archive, class T>
 struct load_array_type {
     static void invoke(Archive &ar, T &t){
+        typedef typename remove_all_extents<T>::type value_type;
+        
         // convert integers to correct enum to load
         int current_count = sizeof(t) / (
             static_cast<char *>(static_cast<void *>(&t[1])) 
@@ -517,12 +510,11 @@
             boost::throw_exception(archive::archive_exception(
                 boost::archive::archive_exception::array_size_too_short
             ));
-        int i;
-        for(i = 0; i < count; ++i)
-            ar >> boost::serialization::make_nvp("item", t[i]);
+        ar >> serialization::make_array(static_cast<value_type*>(&t[0]),count);
     }
 };
 
+#if 0
 // note bogus arguments to workaround msvc 6 silent runtime failure
 template<class Archive, class T>
 BOOST_DLLEXPORT 
@@ -539,10 +531,9 @@
     Archive * /* ar = NULL */,
     T * /* t = NULL */
 ){
-    // note: reversal of order of arguments to work around msvc 6.0 bug
-    // that manifests itself while trying to link.
-    return pointer_iserializer<T, Archive>::instantiate();
+    return pointer_iserializer<Archive,T>::instance;
 }
+#endif
 
 } // detail
 
@@ -572,7 +563,7 @@
 
 // BORLAND
 #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x560))
-// borland has a couple fo problems
+// borland has a couple of problems
 // a) if function is partiall specialized - see below
 // const paramters are transformed to non-const ones
 // b) implementation of base_object can't be made to work
@@ -585,21 +576,19 @@
 }
 #endif
 
-// let wrappers through.  (Someday implement is_wrapper)
+// let wrappers through.
 #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
 template<class Archive, class T>
-inline void load(Archive &ar, const serialization::nvp<T> &t){
-        boost::archive::load(ar, const_cast<serialization::nvp<T> &>(t));
-}
-template<class Archive>
-inline void load(Archive &ar, const serialization::binary_object &t){
-        boost::archive::load(ar, const_cast<serialization::binary_object &>(t));
+inline void load_wrapper(Archive &ar, const T&t, mpl::true_){
+  boost::archive::load(ar, const_cast<T&>(t));
 }
 
-//template<class Archive, class T>
-//inline void load(Archive &ar, const serialization::binary_object &t){
-//      load(ar, const_cast<binary_object &>(t));
-//}
+#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x560))
+template<class Archive, class T>
+inline void load(Archive &ar, const T&t){
+  load_wrapper(ar,t,serialization::is_wrapper<T>());
+}
+#endif 
 #endif
 
 } // namespace archive
Modified: branches/serialization_next_release/boost/boost/archive/detail/oserializer.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/detail/oserializer.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/detail/oserializer.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -37,6 +37,7 @@
 #include <boost/type_traits/is_volatile.hpp>
 #include <boost/type_traits/is_const.hpp>
 #include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/remove_all_extents.hpp>
 #include <boost/serialization/is_abstract.hpp>
 
 #include <boost/mpl/eval_if.hpp>
@@ -57,6 +58,7 @@
 #include <boost/archive/detail/basic_oarchive.hpp>
 #include <boost/archive/detail/basic_oserializer.hpp>
 #include <boost/archive/detail/archive_pointer_oserializer.hpp>
+#include <boost/archive/detail/dynamically_initialized.hpp>
 
 #include <boost/serialization/force_include.hpp>
 #include <boost/serialization/serialization.hpp>
@@ -66,6 +68,8 @@
 #include <boost/serialization/type_info_implementation.hpp>
 #include <boost/serialization/nvp.hpp>
 #include <boost/serialization/void_cast.hpp>
+#include <boost/serialization/array.hpp>
+#include <boost/serialization/collection_size_type.hpp>
 
 #include <boost/archive/archive_exception.hpp>
 
@@ -100,7 +104,7 @@
 private:
     // private constructor to inhibit any existence other than the 
     // static one
-    explicit oserializer() :
+    explicit BOOST_DLLEXPORT oserializer() :
         basic_oserializer(
             * boost::serialization::type_info_implementation<T>::type::get_instance()
         )
@@ -118,7 +122,7 @@
 //        if(0 != (flags &  no_tracking))
 //            return false;
         return boost::serialization::tracking_level<T>::value == boost::serialization::track_always
-            || boost::serialization::tracking_level<T>::value == boost::serialization::track_selectivly
+            || boost::serialization::tracking_level<T>::value == boost::serialization::track_selectively
             && serialized_as_pointer();
     }
     virtual unsigned int version() const {
@@ -130,7 +134,7 @@
         >::type::is_polymorphic::type typex;
         return typex::value;
     }
-    static oserializer & instantiate(){
+    static oserializer & get_instance(){
         static oserializer instance;
         return instance;
     }
@@ -151,15 +155,14 @@
     );
 }
 
-// instantiation of this template creates a static object.  Note inversion of
-// normal argument order to workaround bizarre error in MSVC 6.0 which only
-// manifests iftself during compiler time.
-template<class T, class Archive>
-class pointer_oserializer : public archive_pointer_oserializer<Archive> 
+template<class Archive, class T>
+class pointer_oserializer
+  : public archive_pointer_oserializer<Archive>
+  , public dynamically_initialized<pointer_oserializer<Archive,T> >
 {
 private:
     virtual const basic_oserializer & get_basic_serializer() const {
-        return oserializer<Archive, T>::instantiate();
+        return oserializer<Archive, T>::get_instance();
     }
     virtual BOOST_DLLEXPORT void save_object_ptr(
         basic_oarchive & ar,
@@ -171,33 +174,19 @@
     // private constructor to inhibit any existence other than the 
     // static one.  Note GCC doesn't permit constructor to be private
     explicit BOOST_DLLEXPORT pointer_oserializer() BOOST_USED;
-    static const pointer_oserializer instance;
+    friend struct dynamically_initialized<pointer_oserializer<Archive,T> >;
 public:
-    #if ! BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
+    #if !defined(__BORLANDC__)
     // at least one compiler (CW) seems to require that serialize_adl
     // be explicitly instantiated. Still under investigation. 
     void (* const m)(Archive &, T &, const unsigned);
     boost::serialization::extended_type_info * (* e)();
     #endif
-    static BOOST_DLLEXPORT const pointer_oserializer & instantiate() BOOST_USED;
-    virtual ~pointer_oserializer(){}
+    BOOST_DLLEXPORT static const pointer_oserializer & get_instance() BOOST_USED;
 };
 
-template<class T, class Archive>
-BOOST_DLLEXPORT const pointer_oserializer<T, Archive> & 
-pointer_oserializer<T, Archive>::instantiate(){
-    return instance;
-}
-
-// note: instances of this template to be constructed before the main
-// is called in order for things to be initialized properly.  For this
-// reason, hiding the instance in a static function as was done above
-// won't work here so we created a free instance here.
-template<class T, class Archive>
-const pointer_oserializer<T, Archive> pointer_oserializer<T, Archive>::instance;
-
-template<class T, class Archive>
-BOOST_DLLEXPORT void pointer_oserializer<T, Archive>::save_object_ptr(
+template<class Archive, class T>
+BOOST_DLLEXPORT void pointer_oserializer<Archive, T>::save_object_ptr(
     basic_oarchive & ar,
     const void * x
 ) const {
@@ -215,27 +204,34 @@
     ar_impl << boost::serialization::make_nvp(NULL, * t);
 }
 
-template<class T, class Archive>
-#if ! BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
-BOOST_DLLEXPORT pointer_oserializer<T, Archive>::pointer_oserializer() :
+template<class Archive, class T>
+#if !defined(__BORLANDC__)
+BOOST_DLLEXPORT pointer_oserializer<Archive, T>::pointer_oserializer() :
     archive_pointer_oserializer<Archive>(
         * boost::serialization::type_info_implementation<T>::type::get_instance()
     ),
     m(boost::serialization::serialize_adl<Archive, T>),
     e(boost::serialization::type_info_implementation<T>::type::get_instance)
 #else
-BOOST_DLLEXPORT pointer_oserializer<T, Archive>::pointer_oserializer() :
+BOOST_DLLEXPORT pointer_oserializer<Archive, T>::pointer_oserializer() :
     archive_pointer_oserializer<Archive>(
         * boost::serialization::type_info_implementation<T>::type::get_instance()
     )
 #endif
 {
     // make sure appropriate member function is instantiated
-    oserializer<Archive, T> & bos = oserializer<Archive, T>::instantiate();
+    oserializer<Archive, T> & bos = oserializer<Archive, T>::get_instance();
     bos.set_bpos(this);
 }
 
 template<class Archive, class T>
+BOOST_DLLEXPORT const pointer_oserializer<Archive, T> &
+pointer_oserializer<Archive, T>::get_instance() {
+    // note: comeau complains without full qualification
+    return dynamically_initialized<pointer_oserializer<Archive,T> >::instance;
+}
+
+template<class Archive, class T>
 struct save_non_pointer_type {
     // note this bounces the call right back to the archive
     // with no runtime overhead
@@ -260,7 +256,7 @@
     // serialization level and class version
     struct save_standard {
         static void invoke(Archive &ar, const T & t){
-            ar.save_object(& t, oserializer<Archive, T>::instantiate());
+            ar.save_object(& t, oserializer<Archive, T>::get_instance());
         }
     };
 
@@ -481,6 +477,8 @@
 struct save_array_type
 {
     static void invoke(Archive &ar, const T &t){
+        typedef typename remove_all_extents<T>::type value_type;
+        
         save_access::end_preamble(ar);
         // consider alignment
         int count = sizeof(t) / (
@@ -488,12 +486,12 @@
             - static_cast<const char *>(static_cast<const void *>(&t[0]))
         );
         ar << BOOST_SERIALIZATION_NVP(count);
-        int i;
-        for(i = 0; i < count; ++i)
-            ar << boost::serialization::make_nvp("item", t[i]);
+        ar << serialization::make_array(static_cast<value_type const*>(&t[0]),count);
     }
 };
 
+
+#if 0
 // note bogus arguments to workaround msvc 6 silent runtime failure
 // declaration to satisfy gcc
 template<class Archive, class T>
@@ -509,10 +507,9 @@
     Archive * /* ar = NULL */,
     T * /* t = NULL */
 ){
-    // note: reversal of order of arguments to work around msvc 6.0 bug
-    // that manifests itself while trying to link.
-    return pointer_oserializer<T, Archive>::instantiate();
+    return pointer_oserializer<Archive, T>::instance;
 }
+#endif
 
 } // detail
 
@@ -557,12 +554,13 @@
 
 template<class Archive, class T>
 inline void save(Archive & ar, T &t){
-    // if your program traps here, it indicates taht your doing one of the following:
+    // if your program traps here, it indicates that your doing one of the following:
     // a) serializing an object of a type marked "track_never" through a pointer.
     // b) saving an non-const object of a type not markd "track_never)
     // Either of these conditions may be an indicator of an error usage of the
     // serialization library and should be double checked.  See documentation on
-    // object tracking.
+    // object tracking.  Also, see the "rationale" section of the documenation
+    // for motivation for this checking.
     BOOST_STATIC_ASSERT(check_tracking<T>::value);
         save(ar, const_cast<const T &>(t));
 }
Modified: branches/serialization_next_release/boost/boost/archive/impl/basic_binary_iprimitive.ipp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/impl/basic_binary_iprimitive.ipp	(original)
+++ branches/serialization_next_release/boost/boost/archive/impl/basic_binary_iprimitive.ipp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -79,7 +79,7 @@
 {
     std::size_t l;
     this->This()->load(l);
-    load_binary(ws, l);
+    load_binary(ws, l * sizeof(wchar_t) / sizeof(char));
     ws[l / sizeof(wchar_t)] = L'\0';
 }
 
Modified: branches/serialization_next_release/boost/boost/archive/impl/basic_xml_oarchive.ipp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/impl/basic_xml_oarchive.ipp	(original)
+++ branches/serialization_next_release/boost/boost/archive/impl/basic_xml_oarchive.ipp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -144,7 +144,7 @@
         pending_preamble = false;
     }
 }
-
+#if 0
 template<class Archive>
 BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
 basic_xml_oarchive<Archive>::save_override(const object_id_type & t, int)
@@ -168,6 +168,33 @@
     int i = t.t; // extra .t is for borland
     write_attribute(VERSION(), i);
 }
+#endif
+
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_xml_oarchive<Archive>::save_override(const object_id_type & t, int)
+{
+    // borland doesn't do conversion of STRONG_TYPEDEFs very well
+    const unsigned int i = t;
+    write_attribute(OBJECT_ID(), i, "=\"_");
+}
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_xml_oarchive<Archive>::save_override(
+    const object_reference_type & t,
+    int
+){
+    const unsigned int i = t;
+    write_attribute(OBJECT_REFERENCE(), i, "=\"_");
+}
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_xml_oarchive<Archive>::save_override(const version_type & t, int)
+{
+    const unsigned int i = t;
+    write_attribute(VERSION(), i);
+}
+
 template<class Archive>
 BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
 basic_xml_oarchive<Archive>::save_override(const class_id_type & t, int)
@@ -199,11 +226,12 @@
         return;
     write_attribute(CLASS_NAME(), key);
 }
+
 template<class Archive>
 BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
 basic_xml_oarchive<Archive>::save_override(const tracking_type & t, int)
 {
-    write_attribute(TRACKING(), t.t); // extra .t is for borland
+    write_attribute(TRACKING(), t.t);
 }
 
 template<class Archive>
Modified: branches/serialization_next_release/boost/boost/archive/polymorphic_binary_iarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/polymorphic_binary_iarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/polymorphic_binary_iarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -18,23 +18,26 @@
 
 #include <boost/config.hpp>
 #include <boost/archive/binary_iarchive.hpp>
-#include <boost/archive/detail/polymorphic_iarchive_impl.hpp>
+#include <boost/archive/detail/polymorphic_iarchive_dispatch.hpp>
 
 namespace boost { 
 namespace archive {
 
-typedef detail::polymorphic_iarchive_impl<
-    binary_iarchive_impl<
-        binary_iarchive, std::istream::char_type, std::istream::traits_type
-    >
-> polymorphic_binary_iarchive;
+class polymorphic_binary_iarchive : 
+    public detail::polymorphic_iarchive_dispatch<naked_binary_iarchive>
+{
+public:
+    polymorphic_binary_iarchive(std::istream & is, unsigned int flags = 0) :
+        detail::polymorphic_iarchive_dispatch<naked_binary_iarchive>(is, flags)
+    {}
+    ~polymorphic_binary_iarchive(){}
+};
 
 } // namespace archive
 } // namespace boost
 
-// required by smart_cast for compilers not implementing 
-// partial template specialization
-BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(
     boost::archive::polymorphic_binary_iarchive
 )
 
Modified: branches/serialization_next_release/boost/boost/archive/polymorphic_binary_oarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/polymorphic_binary_oarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/polymorphic_binary_oarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -18,23 +18,24 @@
 
 #include <boost/config.hpp>
 #include <boost/archive/binary_oarchive.hpp>
-#include <boost/archive/detail/polymorphic_oarchive_impl.hpp>
+#include <boost/archive/detail/polymorphic_oarchive_dispatch.hpp>
 
 namespace boost { 
 namespace archive {
 
-typedef detail::polymorphic_oarchive_impl<
+typedef detail::polymorphic_oarchive_dispatch<
     binary_oarchive_impl<
-        binary_oarchive, std::ostream::char_type, std::ostream::traits_type
+        naked_binary_oarchive, 
+        std::ostream::char_type, 
+        std::ostream::traits_type
     >
  > polymorphic_binary_oarchive;
 
 } // namespace archive
 } // namespace boost
 
-// required by smart_cast for compilers not implementing 
-// partial template specialization
-BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(
     boost::archive::polymorphic_binary_oarchive
 )
 
Modified: branches/serialization_next_release/boost/boost/archive/polymorphic_iarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/polymorphic_iarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/polymorphic_iarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -32,6 +32,7 @@
 #include <boost/archive/detail/iserializer.hpp>
 #include <boost/archive/detail/interface_iarchive.hpp>
 #include <boost/serialization/nvp.hpp>
+#include <boost/archive/detail/register_archive.hpp>
 
 // determine if its necessary to handle (u)int64_t specifically
 // i.e. that its not a synonym for (unsigned) long
@@ -54,7 +55,9 @@
     class basic_iserializer;
 }
 
-class polymorphic_iarchive :
+class polymorphic_iarchive;
+
+class polymorphic_iarchive_impl :
     public detail::interface_iarchive<polymorphic_iarchive>
 {
 #ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
@@ -98,21 +101,13 @@
     virtual void load_start(const char * name) = 0;
     virtual void load_end(const char * name) = 0;
     virtual void register_basic_serializer(const detail::basic_iserializer & bis) = 0;
-    virtual void lookup_basic_helper(
-        const boost::serialization::extended_type_info * const eti,
-                boost::shared_ptr<void> & sph
-    ) = 0;
-    virtual void insert_basic_helper(
-        const boost::serialization::extended_type_info * const eti,
-                boost::shared_ptr<void> & sph
-    ) = 0;
 
     // msvc and borland won't automatically pass these to the base class so
     // make it explicit here
     template<class T>
     void load_override(T & t, BOOST_PFTO int)
     {
-        archive::load(* this, t);
+        archive::load(* this->This(), t);
     }
     // special treatment for name-value pairs.
     template<class T>
@@ -124,9 +119,11 @@
                 int
         ){
         load_start(t.name());
-        archive::load(* this, t.value());
+        archive::load(* this->This(), t.value());
         load_end(t.name());
     }
+protected:
+    virtual ~polymorphic_iarchive_impl(){}
 public:
     // utility function implemented by all legal archives
     virtual void set_library_version(unsigned int archive_library_version) = 0;
@@ -157,8 +154,24 @@
 } // namespace archive
 } // namespace boost
 
-// required by smart_cast for compilers not implementing
-// partial template specialization
-BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(boost::archive::polymorphic_iarchive)
+// note special treatment of shared_ptr. This type needs a special
+// structure associated with every archive.  We created a "mix-in"
+// class to provide this functionality.  Since shared_ptr holds a
+// special esteem in the boost library - we included it here by default.
+#include <boost/archive/shared_ptr_helper.hpp>
+
+namespace boost { 
+namespace archive {
+
+class polymorphic_iarchive : 
+    public polymorphic_iarchive_impl,
+    public detail::shared_ptr_helper
+{};
+
+} // namespace archive
+} // namespace boost
+
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::polymorphic_iarchive)
 
 #endif // BOOST_ARCHIVE_POLYMORPHIC_IARCHIVE_HPP
Modified: branches/serialization_next_release/boost/boost/archive/polymorphic_oarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/polymorphic_oarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/polymorphic_oarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -31,6 +31,7 @@
 #include <boost/archive/detail/oserializer.hpp>
 #include <boost/archive/detail/interface_oarchive.hpp>
 #include <boost/serialization/nvp.hpp>
+#include <boost/archive/detail/register_archive.hpp>
 
 // determine if its necessary to handle (u)int64_t specifically
 // i.e. that its not a synonym for (unsigned) long
@@ -53,7 +54,9 @@
     class basic_oserializer;
 }
 
-class polymorphic_oarchive :
+class polymorphic_oarchive;
+
+class polymorphic_oarchive_impl :
     public detail::interface_oarchive<polymorphic_oarchive>
 {
 #ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
@@ -97,14 +100,6 @@
     virtual void save_start(const char * name) = 0;
     virtual void save_end(const char * name) = 0;
     virtual void register_basic_serializer(const detail::basic_oserializer & bos) = 0;
-    virtual void lookup_basic_helper(
-        const boost::serialization::extended_type_info * const eti,
-                boost::shared_ptr<void> & sph
-    ) = 0;
-    virtual void insert_basic_helper(
-        const boost::serialization::extended_type_info * const eti,
-                shared_ptr<void> & sph
-    ) = 0;
 
     virtual void end_preamble() = 0;
 
@@ -113,7 +108,7 @@
     template<class T>
     void save_override(T & t, BOOST_PFTO int)
     {
-        archive::save(* this, t);
+        archive::save(* this->This(), t);
     }
     // special treatment for name-value pairs.
     template<class T>
@@ -124,9 +119,11 @@
                 ::boost::serialization::nvp<T> & t, int
         ){
         save_start(t.name());
-        archive::save(* this, t.const_value());
+        archive::save(* this->This(), t.const_value());
         save_end(t.name());
     }
+protected:
+    virtual ~polymorphic_oarchive_impl(){}
 public:
     // utility functions implemented by all legal archives
     virtual unsigned int get_flags() const = 0;
@@ -143,11 +140,15 @@
     ) = 0;
 };
 
+// note: preserve naming symmetry
+class polymorphic_oarchive : 
+    public polymorphic_oarchive_impl
+{};
+
 } // namespace archive
 } // namespace boost
 
-// required by smart_cast for compilers not implementing
-// partial template specialization
-BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(boost::archive::polymorphic_oarchive)
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::polymorphic_oarchive)
 
 #endif // BOOST_ARCHIVE_POLYMORPHIC_OARCHIVE_HPP
Modified: branches/serialization_next_release/boost/boost/archive/polymorphic_text_iarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/polymorphic_text_iarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/polymorphic_text_iarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -18,21 +18,26 @@
 
 #include <boost/config.hpp>
 #include <boost/archive/text_iarchive.hpp>
-#include <boost/archive/detail/polymorphic_iarchive_impl.hpp>
+#include <boost/archive/detail/polymorphic_iarchive_dispatch.hpp>
 
 namespace boost { 
 namespace archive {
 
-typedef detail::polymorphic_iarchive_impl<
-        text_iarchive_impl<text_iarchive> 
-> polymorphic_text_iarchive;
+class polymorphic_text_iarchive : 
+    public detail::polymorphic_iarchive_dispatch<naked_text_iarchive>
+{
+public:
+    polymorphic_text_iarchive(std::istream & is, unsigned int flags = 0) :
+        detail::polymorphic_iarchive_dispatch<naked_text_iarchive>(is, flags)
+    {}
+    ~polymorphic_text_iarchive(){}
+};
 
 } // namespace archive
 } // namespace boost
 
-// required by smart_cast for compilers not implementing 
-// partial template specialization
-BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(
     boost::archive::polymorphic_text_iarchive
 )
 
Modified: branches/serialization_next_release/boost/boost/archive/polymorphic_text_oarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/polymorphic_text_oarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/polymorphic_text_oarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -18,21 +18,20 @@
 
 #include <boost/config.hpp>
 #include <boost/archive/text_oarchive.hpp>
-#include <boost/archive/detail/polymorphic_oarchive_impl.hpp>
+#include <boost/archive/detail/polymorphic_oarchive_dispatch.hpp>
 
 namespace boost { 
 namespace archive {
 
-typedef detail::polymorphic_oarchive_impl<
-    text_oarchive_impl<text_oarchive> 
+typedef detail::polymorphic_oarchive_dispatch<
+    text_oarchive_impl<naked_text_oarchive> 
 > polymorphic_text_oarchive;
 
 } // namespace archive
 } // namespace boost
 
-// required by smart_cast for compilers not implementing 
-// partial template specialization
-BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(
     boost::archive::polymorphic_text_oarchive
 )
 
Modified: branches/serialization_next_release/boost/boost/archive/polymorphic_text_wiarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/polymorphic_text_wiarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/polymorphic_text_wiarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -22,21 +22,20 @@
 #else
 
 #include <boost/archive/text_wiarchive.hpp>
-#include <boost/archive/detail/polymorphic_iarchive_impl.hpp>
+#include <boost/archive/detail/polymorphic_iarchive_dispatch.hpp>
 
 namespace boost { 
 namespace archive {
 
-typedef detail::polymorphic_iarchive_impl<
-        text_wiarchive_impl<text_wiarchive> 
+typedef detail::polymorphic_iarchive_dispatch<
+        text_wiarchive_impl<naked_text_wiarchive> 
 > polymorphic_text_wiarchive;
 
 } // namespace archive
 } // namespace boost
 
-// required by smart_cast for compilers not implementing 
-// partial template specialization
-BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(
     boost::archive::polymorphic_text_wiarchive
 )
 
Modified: branches/serialization_next_release/boost/boost/archive/polymorphic_text_woarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/polymorphic_text_woarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/polymorphic_text_woarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -22,21 +22,20 @@
 #else
 
 #include <boost/archive/text_woarchive.hpp>
-#include <boost/archive/detail/polymorphic_oarchive_impl.hpp>
+#include <boost/archive/detail/polymorphic_oarchive_dispatch.hpp>
 
 namespace boost { 
 namespace archive {
 
-typedef detail::polymorphic_oarchive_impl<
-        text_woarchive_impl<text_woarchive> 
+typedef detail::polymorphic_oarchive_dispatch<
+        text_woarchive_impl<naked_text_woarchive> 
 > polymorphic_text_woarchive;
 
 } // namespace archive
 } // namespace boost
 
-// required by smart_cast for compilers not implementing 
-// partial template specialization
-BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(
     boost::archive::polymorphic_text_woarchive
 )
 
Modified: branches/serialization_next_release/boost/boost/archive/polymorphic_xml_iarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/polymorphic_xml_iarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/polymorphic_xml_iarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -18,21 +18,26 @@
 
 #include <boost/config.hpp>
 #include <boost/archive/xml_iarchive.hpp>
-#include <boost/archive/detail/polymorphic_iarchive_impl.hpp>
+#include <boost/archive/detail/polymorphic_iarchive_dispatch.hpp>
 
 namespace boost { 
 namespace archive {
 
-typedef detail::polymorphic_iarchive_impl<
-        xml_iarchive_impl<xml_iarchive> 
-> polymorphic_xml_iarchive;
+class polymorphic_xml_iarchive : 
+    public detail::polymorphic_iarchive_dispatch<naked_xml_iarchive>
+{
+public:
+    polymorphic_xml_iarchive(std::istream & is, unsigned int flags = 0) :
+        detail::polymorphic_iarchive_dispatch<naked_xml_iarchive>(is, flags)
+    {}
+    ~polymorphic_xml_iarchive(){}
+};
 
 } // namespace archive
 } // namespace boost
 
-// required by smart_cast for compilers not implementing 
-// partial template specialization
-BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(
     boost::archive::polymorphic_xml_iarchive
 )
 
Modified: branches/serialization_next_release/boost/boost/archive/polymorphic_xml_oarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/polymorphic_xml_oarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/polymorphic_xml_oarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -18,21 +18,20 @@
 
 #include <boost/config.hpp>
 #include <boost/archive/xml_oarchive.hpp>
-#include <boost/archive/detail/polymorphic_oarchive_impl.hpp>
+#include <boost/archive/detail/polymorphic_oarchive_dispatch.hpp>
 
 namespace boost { 
 namespace archive {
 
-typedef detail::polymorphic_oarchive_impl<
-        xml_oarchive_impl<xml_oarchive> 
+typedef detail::polymorphic_oarchive_dispatch<
+    xml_oarchive_impl<naked_xml_oarchive> 
 > polymorphic_xml_oarchive;
 
 } // namespace archive
 } // namespace boost
 
-// required by smart_cast for compilers not implementing 
-// partial template specialization
-BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(
     boost::archive::polymorphic_xml_oarchive
 )
 
Modified: branches/serialization_next_release/boost/boost/archive/polymorphic_xml_wiarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/polymorphic_xml_wiarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/polymorphic_xml_wiarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -22,21 +22,20 @@
 #else
 
 #include <boost/archive/xml_wiarchive.hpp>
-#include <boost/archive/detail/polymorphic_iarchive_impl.hpp>
+#include <boost/archive/detail/polymorphic_iarchive_dispatch.hpp>
 
 namespace boost { 
 namespace archive {
 
-typedef detail::polymorphic_iarchive_impl<
-        xml_wiarchive_impl<xml_wiarchive> 
+typedef detail::polymorphic_iarchive_dispatch<
+        xml_wiarchive_impl<naked_xml_wiarchive> 
 > polymorphic_xml_wiarchive;
 
 } // namespace archive
 } // namespace boost
 
-// required by smart_cast for compilers not implementing 
-// partial template specialization
-BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(
     boost::archive::polymorphic_xml_wiarchive
 )
 
Modified: branches/serialization_next_release/boost/boost/archive/polymorphic_xml_woarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/polymorphic_xml_woarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/polymorphic_xml_woarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -22,21 +22,20 @@
 #else
 
 #include <boost/archive/xml_woarchive.hpp>
-#include <boost/archive/detail/polymorphic_oarchive_impl.hpp>
+#include <boost/archive/detail/polymorphic_oarchive_dispatch.hpp>
 
 namespace boost { 
 namespace archive {
 
-typedef detail::polymorphic_oarchive_impl<
-        xml_woarchive_impl<xml_woarchive> 
+typedef detail::polymorphic_oarchive_dispatch<
+        xml_woarchive_impl<naked_xml_woarchive> 
 > polymorphic_xml_woarchive;
 
 } // namespace archive
 } // namespace boost
 
-// required by smart_cast for compilers not implementing 
-// partial template specialization
-BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(
     boost::archive::polymorphic_xml_woarchive
 )
 
Modified: branches/serialization_next_release/boost/boost/archive/text_iarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/text_iarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/text_iarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -21,6 +21,7 @@
 #include <boost/archive/detail/auto_link_archive.hpp>
 #include <boost/archive/basic_text_iprimitive.hpp>
 #include <boost/archive/basic_text_iarchive.hpp>
+#include <boost/config.hpp>
 
 #include <boost/archive/detail/abi_prefix.hpp> // must be the last header
 
@@ -73,14 +74,38 @@
     ~text_iarchive_impl(){};
 };
 
-// do not derive from this class.  If you want to extend this functionality
+// do not derive from the classes below.  If you want to extend this functionality
 // via inhertance, derived from text_iarchive_impl instead.  This will
 // preserve correct static polymorphism.
+
+// same as text_iarchive below - without the shared_ptr_helper
+class naked_text_iarchive : 
+    public text_iarchive_impl<naked_text_iarchive>
+{
+public:
+    naked_text_iarchive(std::istream & is, unsigned int flags = 0) :
+        text_iarchive_impl<naked_text_iarchive>(is, flags)
+    {}
+    ~naked_text_iarchive(){}
+};
+
+} // namespace archive
+} // namespace boost
+
+// note special treatment of shared_ptr. This type needs a special
+// structure associated with every archive.  We created a "mix-in"
+// class to provide this functionality.  Since shared_ptr holds a
+// special esteem in the boost library - we included it here by default.
+#include <boost/archive/shared_ptr_helper.hpp>
+
+namespace boost { 
+namespace archive {
+
 class text_iarchive : 
-    public text_iarchive_impl<text_iarchive>
+    public text_iarchive_impl<text_iarchive>,
+    public detail::shared_ptr_helper
 {
 public:
-     
     text_iarchive(std::istream & is, unsigned int flags = 0) :
         text_iarchive_impl<text_iarchive>(is, flags)
     {}
@@ -90,9 +115,8 @@
 } // namespace archive
 } // namespace boost
 
-// required by smart_cast for compilers not implementing 
-// partial template specialization
-BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(boost::archive::text_iarchive)
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::text_iarchive)
 
 #include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
 
Modified: branches/serialization_next_release/boost/boost/archive/text_oarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/text_oarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/text_oarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -88,12 +88,13 @@
     ~text_oarchive(){}
 };
 
+typedef text_oarchive naked_text_oarchive;
+
 } // namespace archive
 } // namespace boost
 
-// required by smart_cast for compilers not implementing 
-// partial template specialization
-BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(boost::archive::text_oarchive)
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::text_oarchive)
 
 #include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
 
Modified: branches/serialization_next_release/boost/boost/archive/text_wiarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/text_wiarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/text_wiarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -72,11 +72,36 @@
     ~text_wiarchive_impl(){};
 };
 
-// do not derive from this class.  If you want to extend this functionality
-// via inhertance, derived from text_wiarchive_impl instead.  This will
+// do not derive from the classes below.  If you want to extend this functionality
+// via inhertance, derived from text_iarchive_impl instead.  This will
 // preserve correct static polymorphism.
+
+// same as text_wiarchive below - without the shared_ptr_helper
+class naked_text_wiarchive : 
+    public text_wiarchive_impl<naked_text_wiarchive>
+{
+public:
+    naked_text_wiarchive(std::wistream & is, unsigned int flags = 0) :
+        text_wiarchive_impl<naked_text_wiarchive>(is, flags)
+    {}
+    ~naked_text_wiarchive(){}
+};
+
+} // namespace archive
+} // namespace boost
+
+// note special treatment of shared_ptr. This type needs a special
+// structure associated with every archive.  We created a "mix-in"
+// class to provide this functionality.  Since shared_ptr holds a
+// special esteem in the boost library - we included it here by default.
+#include <boost/archive/shared_ptr_helper.hpp>
+
+namespace boost { 
+namespace archive {
+
 class text_wiarchive : 
-    public text_wiarchive_impl<text_wiarchive>
+    public text_wiarchive_impl<text_wiarchive>,
+    public detail::shared_ptr_helper
 {
 public:
     text_wiarchive(std::wistream & is, unsigned int flags = 0) :
@@ -88,9 +113,8 @@
 } // namespace archive
 } // namespace boost
 
-// required by smart_cast for compilers not implementing 
-// partial template specialization
-BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(boost::archive::text_wiarchive)
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::text_wiarchive)
 
 #include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
 
Modified: branches/serialization_next_release/boost/boost/archive/text_woarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/text_woarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/text_woarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -114,12 +114,13 @@
     ~text_woarchive(){}
 };
 
+typedef text_woarchive naked_text_woarchive;
+
 } // namespace archive
 } // namespace boost
 
-// required by smart_cast for compilers not implementing 
-// partial template specialization
-BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(boost::archive::text_woarchive)
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::text_woarchive)
 
 #include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
 
Modified: branches/serialization_next_release/boost/boost/archive/xml_iarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/xml_iarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/xml_iarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -83,14 +83,36 @@
     ~xml_iarchive_impl();
 };
 
-// we use the following because we can't use
-// typedef xml_iarchive_impl<xml_iarchive_impl<...> > xml_iarchive;
-
-// do not derive from this class.  If you want to extend this functionality
-// via inhertance, derived from xml_iarchive_impl instead.  This will
+// do not derive from the classes below.  If you want to extend this functionality
+// via inhertance, derived from text_iarchive_impl instead.  This will
 // preserve correct static polymorphism.
+
+// same as xml_iarchive below - without the shared_ptr_helper
+class naked_xml_iarchive : 
+    public xml_iarchive_impl<naked_xml_iarchive>
+{
+public:
+    naked_xml_iarchive(std::istream & is, unsigned int flags = 0) :
+        xml_iarchive_impl<naked_xml_iarchive>(is, flags)
+    {}
+    ~naked_xml_iarchive(){}
+};
+
+} // namespace archive
+} // namespace boost
+
+// note special treatment of shared_ptr. This type needs a special
+// structure associated with every archive.  We created a "mix-in"
+// class to provide this functionality.  Since shared_ptr holds a
+// special esteem in the boost library - we included it here by default.
+#include <boost/archive/shared_ptr_helper.hpp>
+
+namespace boost { 
+namespace archive {
+
 class xml_iarchive : 
-    public xml_iarchive_impl<xml_iarchive>
+    public xml_iarchive_impl<xml_iarchive>,
+    public detail::shared_ptr_helper
 {
 public:
     xml_iarchive(std::istream & is, unsigned int flags = 0) :
@@ -102,9 +124,8 @@
 } // namespace archive
 } // namespace boost
 
-// required by smart_cast for compilers not implementing 
-// partial template specialization
-BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(boost::archive::xml_iarchive)
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::xml_iarchive)
 
 #include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
 
Modified: branches/serialization_next_release/boost/boost/archive/xml_oarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/xml_oarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/xml_oarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -48,9 +48,9 @@
     friend class save_access;
 protected:
 #endif
-    void end_preamble(){
-        basic_xml_oarchive<Archive>::end_preamble();
-    }
+    //void end_preamble(){
+    //    basic_xml_oarchive<Archive>::end_preamble();
+    //}
     template<class T>
     void save(const T & t){
         basic_text_oprimitive<std::ostream>::save(t);
@@ -101,12 +101,13 @@
     ~xml_oarchive(){}
 };
 
+typedef xml_oarchive naked_xml_oarchive;
+
 } // namespace archive
 } // namespace boost
 
-// required by smart_cast for compilers not implementing 
-// partial template specialization
-BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(boost::archive::xml_oarchive)
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::xml_oarchive)
 
 #include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
 
Modified: branches/serialization_next_release/boost/boost/archive/xml_wiarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/xml_wiarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/xml_wiarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -87,14 +87,36 @@
     ~xml_wiarchive_impl();
 };
 
-// we use the following because we can't use
-// typedef xml_wiarchive_impl<xml_wiarchive_impl<...> > xml_wiarchive;
-
-// do not derive from this class.  If you want to extend this functionality
-// via inhertance, derived from xml_wiarchive_impl instead.  This will
+// do not derive from the classes below.  If you want to extend this functionality
+// via inhertance, derived from text_iarchive_impl instead.  This will
 // preserve correct static polymorphism.
+
+// same as xml_wiarchive below - without the shared_ptr_helper
+class naked_xml_wiarchive : 
+    public xml_wiarchive_impl<naked_xml_wiarchive>
+{
+public:
+    naked_xml_wiarchive(std::wistream & is, unsigned int flags = 0) :
+        xml_wiarchive_impl<naked_xml_wiarchive>(is, flags)
+    {}
+    ~naked_xml_wiarchive(){}
+};
+
+} // namespace archive
+} // namespace boost
+
+// note special treatment of shared_ptr. This type needs a special
+// structure associated with every archive.  We created a "mix-in"
+// class to provide this functionality.  Since shared_ptr holds a
+// special esteem in the boost library - we included it here by default.
+#include <boost/archive/shared_ptr_helper.hpp>
+
+namespace boost { 
+namespace archive {
+
 class xml_wiarchive : 
-    public xml_wiarchive_impl<xml_wiarchive>
+    public xml_wiarchive_impl<xml_wiarchive>,
+    public detail::shared_ptr_helper
 {
 public:
     xml_wiarchive(std::wistream & is, unsigned int flags = 0) :
@@ -106,9 +128,8 @@
 } // namespace archive
 } // namespace boost
 
-// required by smart_cast for compilers not implementing 
-// partial template specialization
-BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(boost::archive::xml_wiarchive)
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::xml_wiarchive)
 
 #include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
 
Modified: branches/serialization_next_release/boost/boost/archive/xml_woarchive.hpp
==============================================================================
--- branches/serialization_next_release/boost/boost/archive/xml_woarchive.hpp	(original)
+++ branches/serialization_next_release/boost/boost/archive/xml_woarchive.hpp	2007-08-15 14:33:11 EDT (Wed, 15 Aug 2007)
@@ -58,9 +58,9 @@
     friend class save_access;
 protected:
 #endif
-    void end_preamble(){
-        basic_xml_oarchive<Archive>::end_preamble();
-    }
+    //void end_preamble(){
+    //    basic_xml_oarchive<Archive>::end_preamble();
+    //}
     template<class T>
     void 
     save(const T & t){
@@ -113,12 +113,13 @@
     ~xml_woarchive(){}
 };
 
+typedef xml_woarchive naked_xml_woarchive;
+
 } // namespace archive
 } // namespace boost
 
-// required by smart_cast for compilers not implementing 
-// partial template specialization
-BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(boost::archive::xml_woarchive)
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::xml_woarchive)
 
 #include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas