$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r55791 - in trunk/libs/serialization: build doc src test vc7ide
From: ramey_at_[hidden]
Date: 2009-08-26 16:47:03
Author: ramey
Date: 2009-08-26 16:47:01 EDT (Wed, 26 Aug 2009)
New Revision: 55791
URL: http://svn.boost.org/trac/boost/changeset/55791
Log:
moved code from header to library to reduce code bloat
Added:
   trunk/libs/serialization/src/archive_exception.cpp   (contents, props changed)
   trunk/libs/serialization/src/shared_ptr_helper.cpp   (contents, props changed)
   trunk/libs/serialization/src/xml_archive_exception.cpp   (contents, props changed)
Text files modified: 
   trunk/libs/serialization/build/Jamfile.v2             |     3 +++                                     
   trunk/libs/serialization/doc/exceptions.html          |    10 +++++++++-                              
   trunk/libs/serialization/src/basic_iarchive.cpp       |     4 ++--                                    
   trunk/libs/serialization/src/basic_serializer_map.cpp |     2 +-                                      
   trunk/libs/serialization/src/polymorphic_oarchive.cpp |     2 --                                      
   trunk/libs/serialization/test/test_shared_ptr.cpp     |     3 +--                                     
   trunk/libs/serialization/vc7ide/Library.vcproj        |    15 ++++++++++++---                         
   7 files changed, 28 insertions(+), 11 deletions(-)
Modified: trunk/libs/serialization/build/Jamfile.v2
==============================================================================
--- trunk/libs/serialization/build/Jamfile.v2	(original)
+++ trunk/libs/serialization/build/Jamfile.v2	2009-08-26 16:47:01 EDT (Wed, 26 Aug 2009)
@@ -75,9 +75,12 @@
     text_iarchive
     text_oarchive
     void_cast
+    archive_exception
     xml_grammar
     xml_iarchive
     xml_oarchive
+    xml_archive_exception
+    shared_ptr_helper
 ;
     
 WSOURCES = 
Modified: trunk/libs/serialization/doc/exceptions.html
==============================================================================
--- trunk/libs/serialization/doc/exceptions.html	(original)
+++ trunk/libs/serialization/doc/exceptions.html	2009-08-26 16:47:01 EDT (Wed, 26 Aug 2009)
@@ -36,6 +36,7 @@
   <dt>stream_error
   <dt>invalid_class_name
   <dt>unregistered_class
+  <dt>multiple_code_instantiation
   <dt>xml_archive_parsing_error
   <dt>xml_archive_tag_mismatch
   <dt>xml_archive_tag_name_error
@@ -75,9 +76,11 @@
                                 // to insert virus via buffer overrun method.
         unregistered_cast,      // base - derived relationship not registered with 
                                 // void_cast_register
-        unsupported_class_version // type saved with a version # greater than the 
+        unsupported_class_version, // type saved with a version # greater than the 
                             // one used by the program.  This indicates that the proggram
                             // needs to be rebuilt.
+        multiple_code_instantiation // code for implementing serialization for some
+                            // type has been instantiated in more than one module.
     } exception_code;
     exception_code code;
     archive_exception(exception_code c) : code(c) {}
@@ -228,6 +231,11 @@
 This exception is thrown if an attempt is made to convert between two pointers 
 whose relationship has not been registered,
 
+<h3><a name="multiple_code_instantiation"><code style="white-space: normal">multiple_code_instantiation</code></a></h3>
+This exception is thrown when it is detected that the serialization of the same type 
+has been instantiated more that once.  This might occur when
+serialization code is instantiated in both the mainline and one or more DLLS.
+
 <h3><a name="xml_archive_parsing_error"><code style="white-space: normal">xml_archive_parsing_error</code></a></h3>
 The XML generated by the serialization process is intimately coupled to the
 C++ class structure, relationships between objects and the serialization 
Added: trunk/libs/serialization/src/archive_exception.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/serialization/src/archive_exception.cpp	2009-08-26 16:47:01 EDT (Wed, 26 Aug 2009)
@@ -0,0 +1,110 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// archive_exception.cpp:
+
+// (C) Copyright 2009 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#if (defined _MSC_VER) && (_MSC_VER == 1200)
+#  pragma warning (disable : 4786) // too long name, harmless warning
+#endif
+
+#include <exception>
+#include <cassert>
+#include <string>
+
+#define BOOST_ARCHIVE_SOURCE
+#include <boost/archive/archive_exception.hpp>
+
+namespace boost {
+namespace archive {
+
+BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY())
+archive_exception::archive_exception(
+    exception_code c, 
+    const char * e1,
+    const char * e2
+) : 
+    code(c)
+{
+    m_msg = "programming error";
+    switch(code){
+    case no_exception:
+        m_msg = "uninitialized exception";
+        break;
+    case unregistered_class:
+        m_msg = "unregistered class";
+        if(NULL != e1){
+            m_msg += " - ";
+            m_msg += e1;
+        }    
+        break;
+    case invalid_signature:
+        m_msg = "invalid signature";
+        break;
+    case unsupported_version:
+        m_msg = "unsupported version";
+        break;
+    case pointer_conflict:
+        m_msg = "pointer conflict";
+        break;
+    case incompatible_native_format:
+        m_msg = "incompatible native format";
+        if(NULL != e1){
+            m_msg += " - ";
+            m_msg += e1;
+        }    
+        break;
+    case array_size_too_short:
+        m_msg = "array size too short";
+        break;
+    case stream_error:
+        m_msg = "stream error";
+        break;
+    case invalid_class_name:
+        m_msg = "class name too long";
+        break;
+    case unregistered_cast:
+        m_msg = "unregistered void cast ";
+        m_msg += (NULL != e1) ? e1 : "?";
+        m_msg += "<-";
+        m_msg += (NULL != e2) ? e2 : "?";
+        break;
+    case unsupported_class_version:
+        m_msg = "class version";
+        break;
+    case other_exception:
+        // if get here - it indicates a derived exception 
+        // was sliced by passing by value in catch
+        m_msg = "unknown derived exception";
+        break;
+    case multiple_code_instantiation:
+        m_msg = "code instantiated in more than one module";
+        if(NULL != e1){
+            m_msg += " - ";
+            m_msg += e1;
+        }    
+        break;
+    default:
+        assert(false);
+        break;
+    }
+}
+BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY())
+archive_exception::~archive_exception() throw () {}
+
+BOOST_ARCHIVE_DECL(const char *)
+archive_exception::what( ) const throw()
+{
+    return m_msg.c_str();
+}
+BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY())
+archive_exception::archive_exception() : 
+        code(no_exception)
+{}
+
+} // archive
+} // boost
Modified: trunk/libs/serialization/src/basic_iarchive.cpp
==============================================================================
--- trunk/libs/serialization/src/basic_iarchive.cpp	(original)
+++ trunk/libs/serialization/src/basic_iarchive.cpp	2009-08-26 16:47:01 EDT (Wed, 26 Aug 2009)
@@ -28,11 +28,11 @@
 #include <boost/serialization/throw_exception.hpp>
 #include <boost/serialization/tracking.hpp>
 
-#include <boost/archive/archive_exception.hpp>
-
 #define BOOST_ARCHIVE_SOURCE
 #define BOOST_SERIALIZATION_SOURCE
 
+#include <boost/archive/archive_exception.hpp>
+
 #include <boost/archive/detail/decl.hpp>
 #include <boost/archive/basic_archive.hpp>
 #include <boost/archive/detail/basic_iserializer.hpp>
Modified: trunk/libs/serialization/src/basic_serializer_map.cpp
==============================================================================
--- trunk/libs/serialization/src/basic_serializer_map.cpp	(original)
+++ trunk/libs/serialization/src/basic_serializer_map.cpp	2009-08-26 16:47:01 EDT (Wed, 26 Aug 2009)
@@ -15,10 +15,10 @@
 #include <set>
 #include <utility>
 
+#define BOOST_ARCHIVE_SOURCE
 #include <boost/archive/archive_exception.hpp>
 #include <boost/serialization/throw_exception.hpp>
 
-#define BOOST_ARCHIVE_SOURCE
 #include <boost/archive/detail/basic_serializer.hpp>
 #include <boost/archive/detail/basic_serializer_map.hpp>
 
Modified: trunk/libs/serialization/src/polymorphic_oarchive.cpp
==============================================================================
--- trunk/libs/serialization/src/polymorphic_oarchive.cpp	(original)
+++ trunk/libs/serialization/src/polymorphic_oarchive.cpp	2009-08-26 16:47:01 EDT (Wed, 26 Aug 2009)
@@ -14,8 +14,6 @@
 
 #define BOOST_ARCHIVE_SOURCE
 #include <boost/archive/detail/archive_serializer_map.hpp>
-#define BOOST_ARCHIVE_SOURCE
-#include <boost/archive/detail/archive_serializer_map.hpp>
 
 #include <boost/archive/impl/archive_serializer_map.ipp>
 #include <boost/archive/polymorphic_oarchive.hpp>
Added: trunk/libs/serialization/src/shared_ptr_helper.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/serialization/src/shared_ptr_helper.cpp	2009-08-26 16:47:01 EDT (Wed, 26 Aug 2009)
@@ -0,0 +1,113 @@
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// shared_ptr_helper.hpp: serialization for boost shared pointer
+
+// (C) Copyright 2004-2009 Robert Ramey, Martin Ecker and Takatoshi Kondo
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <map>
+#include <list>
+#include <utility>
+#include <cstddef> // NULL
+
+#define BOOST_ARCHIVE_SOURCE
+
+#include <boost/serialization/throw_exception.hpp>
+#include <boost/serialization/void_cast.hpp>
+#include <boost/serialization/extended_type_info.hpp>
+#include <boost/archive/shared_ptr_helper.hpp>
+#include <boost/archive/archive_exception.hpp>
+
+namespace boost {
+namespace archive{
+namespace detail {
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// a common class for holding various types of shared pointers
+
+// returns pointer to object and an indicator whether this is a
+// new entry (true) or a previous one (false)
+BOOST_ARCHIVE_DECL(shared_ptr_helper::result_type)
+shared_ptr_helper::get_od(
+        void * od,
+        const boost::serialization::extended_type_info * true_type, 
+        const boost::serialization::extended_type_info * this_type
+){
+    // get void pointer to the most derived type
+    // this uniquely identifies the object referred to
+    od = void_downcast(
+        *true_type, 
+        *this_type, 
+        od
+    );
+    if(NULL == od)
+        boost::serialization::throw_exception(
+            archive_exception(
+                archive_exception::unregistered_cast,
+                true_type->get_debug_info(),
+                this_type->get_debug_info()
+            )
+        );
+
+    // make tracking array if necessary
+    if(NULL == m_pointers)
+        m_pointers = new collection_type;
+
+    shared_ptr<const void> sp(od, null_deleter()); 
+    std::pair<collection_type::iterator, bool> result =
+        m_pointers->insert(
+            collection_type::value_type(od, sp)
+        );
+    od = void_upcast(
+        *true_type, 
+        *this_type,
+        result.first->first
+    );
+    if(NULL == od)
+        boost::serialization::throw_exception(
+            archive_exception(
+                archive_exception::unregistered_cast,
+                true_type->get_debug_info(),
+                this_type->get_debug_info()
+            )
+        );
+    return result_type(result.first, od);
+}
+
+//  #ifdef BOOST_SERIALIZATION_SHARED_PTR_132_HPP
+BOOST_ARCHIVE_DECL(void)
+shared_ptr_helper::append(const boost_132::shared_ptr<void> & t){
+    if(NULL == m_pointers_132)
+        m_pointers_132 = new std::list<boost_132::shared_ptr<void> >;
+    m_pointers_132->push_back(t);
+}
+//  #endif
+BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY())
+shared_ptr_helper::shared_ptr_helper() : 
+    m_pointers(NULL)
+    #ifdef BOOST_SERIALIZATION_SHARED_PTR_132_HPP
+        , m_pointers_132(NULL)
+    #endif
+{}
+BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY())
+shared_ptr_helper::~shared_ptr_helper(){
+    if(NULL != m_pointers)
+        delete m_pointers;
+    #ifdef BOOST_SERIALIZATION_SHARED_PTR_132_HPP
+    if(NULL != m_pointers_132)
+        delete m_pointers_132;
+    #endif
+}
+
+} // namespace detail
+} // namespace serialization
+} // namespace boost
+
Added: trunk/libs/serialization/src/xml_archive_exception.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/serialization/src/xml_archive_exception.cpp	2009-08-26 16:47:01 EDT (Wed, 26 Aug 2009)
@@ -0,0 +1,56 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// xml_archive_exception.cpp:
+
+// (C) Copyright 2009 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#if (defined _MSC_VER) && (_MSC_VER == 1200)
+#  pragma warning (disable : 4786) // too long name, harmless warning
+#endif
+
+#define BOOST_ARCHIVE_SOURCE
+
+#include <exception>
+#include <cassert>
+#include <string>
+
+#include <boost/archive/xml_archive_exception.hpp>
+
+namespace boost {
+namespace archive {
+
+BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY())
+xml_archive_exception::xml_archive_exception(
+        exception_code c, 
+        const char * e1,
+        const char * e2
+    ) : 
+        archive_exception(other_exception, e1, e2)
+    {
+        m_msg = "programming error";
+        switch(c){
+        case xml_archive_parsing_error:
+            m_msg = "unrecognized XML syntax";
+            break;
+        case xml_archive_tag_mismatch:
+            m_msg = "XML start/end tag mismatch";
+            if(NULL != e1){
+                m_msg += " - ";
+                m_msg += e1;
+            }    
+            break;
+        case xml_archive_tag_name_error:
+            m_msg = "Invalid XML tag name";
+            break;
+        default:
+            assert(false);
+            break;
+        }
+    }
+
+} // archive
+} // boost
Modified: trunk/libs/serialization/test/test_shared_ptr.cpp
==============================================================================
--- trunk/libs/serialization/test/test_shared_ptr.cpp	(original)
+++ trunk/libs/serialization/test/test_shared_ptr.cpp	2009-08-26 16:47:01 EDT (Wed, 26 Aug 2009)
@@ -23,11 +23,10 @@
 #include <boost/serialization/shared_ptr.hpp>
 #include <boost/serialization/weak_ptr.hpp>
 #include <boost/serialization/nvp.hpp>
+#include <boost/serialization/export.hpp>
 
 #include "test_tools.hpp"
 
-#include <boost/serialization/export.hpp>
-
 // This is a simple class.  It contains a counter of the number
 // of objects of this class which have been instantiated.
 class A
Modified: trunk/libs/serialization/vc7ide/Library.vcproj
==============================================================================
--- trunk/libs/serialization/vc7ide/Library.vcproj	(original)
+++ trunk/libs/serialization/vc7ide/Library.vcproj	2009-08-26 16:47:01 EDT (Wed, 26 Aug 2009)
@@ -433,6 +433,9 @@
                         <File
                                 RelativePath="..\..\..\boost\serialization\version.hpp">
                         </File>
+			<File
+				RelativePath="..\..\..\boost\archive\xml_archive_exception.hpp">
+			</File>
                 </Filter>
                 <Filter
                         Name="Serialization Implementations"
@@ -816,9 +819,6 @@
                                 RelativePath="..\..\..\boost\archive\text_oarchive.hpp">
                         </File>
                         <File
-				RelativePath="..\..\..\boost\archive\xml_archive_exception.hpp">
-			</File>
-			<File
                                 RelativePath="..\..\..\boost\archive\xml_iarchive.hpp">
                         </File>
                         <File
@@ -881,6 +881,9 @@
                         Name="Source"
                         Filter="">
                         <File
+				RelativePath="..\src\archive_exception.cpp">
+			</File>
+			<File
                                 RelativePath="..\src\basic_archive.cpp">
                         </File>
                         <File
@@ -956,6 +959,9 @@
                                 RelativePath="..\src\polymorphic_oarchive.cpp">
                         </File>
                         <File
+				RelativePath="..\src\shared_ptr_helper.cpp">
+			</File>
+			<File
                                 RelativePath="..\src\stl_port.cpp">
                         </File>
                         <File
@@ -968,6 +974,9 @@
                                 RelativePath="..\src\void_cast.cpp">
                         </File>
                         <File
+				RelativePath="..\src\xml_archive_exception.cpp">
+			</File>
+			<File
                                 RelativePath="..\src\xml_grammar.cpp">
                         </File>
                         <File