Chris@16: #ifndef BOOST_SERIALIZATION_SHARED_PTR_HPP Chris@16: #define BOOST_SERIALIZATION_SHARED_PTR_HPP Chris@16: Chris@16: // MS compatible compilers support #pragma once Chris@16: #if defined(_MSC_VER) && (_MSC_VER >= 1020) Chris@16: # pragma once Chris@16: #endif Chris@16: Chris@16: /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 Chris@16: // shared_ptr.hpp: serialization for boost shared pointer Chris@16: Chris@16: // (C) Copyright 2004 Robert Ramey and Martin Ecker Chris@16: // Use, modification and distribution is subject to the Boost Software Chris@16: // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: // See http://www.boost.org for updates, documentation, and revision history. Chris@16: Chris@16: #include // NULL Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 Chris@16: // shared_ptr serialization traits Chris@16: // version 1 to distinguish from boost 1.32 version. Note: we can only do this Chris@16: // for a template when the compiler supports partial template specialization Chris@16: Chris@16: #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION Chris@16: namespace boost { Chris@16: namespace serialization{ Chris@16: template Chris@16: struct version< ::boost::shared_ptr< T > > { Chris@16: typedef mpl::integral_c_tag tag; Chris@16: #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3206)) Chris@16: typedef BOOST_DEDUCED_TYPENAME mpl::int_<1> type; Chris@16: #else Chris@16: typedef mpl::int_<1> type; Chris@16: #endif Chris@16: #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x570)) Chris@16: BOOST_STATIC_CONSTANT(int, value = 1); Chris@16: #else Chris@16: BOOST_STATIC_CONSTANT(int, value = type::value); Chris@16: #endif Chris@16: }; Chris@16: // don't track shared pointers Chris@16: template Chris@16: struct tracking_level< ::boost::shared_ptr< T > > { Chris@16: typedef mpl::integral_c_tag tag; Chris@16: #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3206)) Chris@16: typedef BOOST_DEDUCED_TYPENAME mpl::int_< ::boost::serialization::track_never> type; Chris@16: #else Chris@16: typedef mpl::int_< ::boost::serialization::track_never> type; Chris@16: #endif Chris@16: #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x570)) Chris@16: BOOST_STATIC_CONSTANT(int, value = ::boost::serialization::track_never); Chris@16: #else Chris@16: BOOST_STATIC_CONSTANT(int, value = type::value); Chris@16: #endif Chris@16: }; Chris@16: }} Chris@16: #define BOOST_SERIALIZATION_SHARED_PTR(T) Chris@16: #else Chris@16: // define macro to let users of these compilers do this Chris@16: #define BOOST_SERIALIZATION_SHARED_PTR(T) \ Chris@16: BOOST_CLASS_VERSION( \ Chris@16: ::boost::shared_ptr< T >, \ Chris@16: 1 \ Chris@16: ) \ Chris@16: BOOST_CLASS_TRACKING( \ Chris@16: ::boost::shared_ptr< T >, \ Chris@16: ::boost::serialization::track_never \ Chris@16: ) \ Chris@16: /**/ Chris@16: #endif Chris@16: Chris@16: namespace boost { Chris@16: namespace serialization{ Chris@16: Chris@16: struct null_deleter { Chris@16: void operator()(void const *) const {} Chris@16: }; Chris@16: Chris@16: /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 Chris@16: // serialization for shared_ptr Chris@16: Chris@16: template Chris@16: inline void save( Chris@16: Archive & ar, Chris@16: const boost::shared_ptr< T > &t, Chris@16: const unsigned int /* file_version */ Chris@16: ){ Chris@16: // The most common cause of trapping here would be serializing Chris@16: // something like shared_ptr. This occurs because int Chris@16: // is never tracked by default. Wrap int in a trackable type Chris@16: BOOST_STATIC_ASSERT((tracking_level< T >::value != track_never)); Chris@16: const T * t_ptr = t.get(); Chris@16: ar << boost::serialization::make_nvp("px", t_ptr); Chris@16: } Chris@16: Chris@16: #ifdef BOOST_SERIALIZATION_SHARED_PTR_132_HPP Chris@16: template Chris@16: inline void load( Chris@16: Archive & ar, Chris@16: boost::shared_ptr< T > &t, Chris@16: const unsigned int file_version Chris@16: ){ Chris@16: // The most common cause of trapping here would be serializing Chris@16: // something like shared_ptr. This occurs because int Chris@16: // is never tracked by default. Wrap int in a trackable type Chris@16: BOOST_STATIC_ASSERT((tracking_level< T >::value != track_never)); Chris@16: T* r; Chris@16: if(file_version < 1){ Chris@16: //ar.register_type(static_cast< Chris@16: // boost_132::detail::sp_counted_base_impl > * Chris@16: //>(NULL)); Chris@16: ar.register_type(static_cast< Chris@16: boost_132::detail::sp_counted_base_impl * Chris@16: >(NULL)); Chris@16: boost_132::shared_ptr< T > sp; Chris@16: ar >> boost::serialization::make_nvp("px", sp.px); Chris@16: ar >> boost::serialization::make_nvp("pn", sp.pn); Chris@16: // got to keep the sps around so the sp.pns don't disappear Chris@16: ar.append(sp); Chris@16: r = sp.get(); Chris@16: } Chris@16: else{ Chris@16: ar >> boost::serialization::make_nvp("px", r); Chris@16: } Chris@16: ar.reset(t,r); Chris@16: } Chris@16: Chris@16: #else Chris@16: template Chris@16: inline void load( Chris@16: Archive & ar, Chris@16: boost::shared_ptr< T > &t, Chris@16: const unsigned int /*file_version*/ Chris@16: ){ Chris@16: // The most common cause of trapping here would be serializing Chris@16: // something like shared_ptr. This occurs because int Chris@16: // is never tracked by default. Wrap int in a trackable type Chris@16: BOOST_STATIC_ASSERT((tracking_level< T >::value != track_never)); Chris@16: T* r; Chris@16: ar >> boost::serialization::make_nvp("px", r); Chris@16: ar.reset(t,r); Chris@16: } Chris@16: #endif Chris@16: Chris@16: template Chris@16: inline void serialize( Chris@16: Archive & ar, Chris@16: boost::shared_ptr< T > &t, Chris@16: const unsigned int file_version Chris@16: ){ Chris@16: // correct shared_ptr serialization depends upon object tracking Chris@16: // being used. Chris@16: BOOST_STATIC_ASSERT( Chris@16: boost::serialization::tracking_level< T >::value Chris@16: != boost::serialization::track_never Chris@16: ); Chris@16: boost::serialization::split_free(ar, t, file_version); Chris@16: } Chris@16: Chris@16: } // namespace serialization Chris@16: } // namespace boost Chris@16: Chris@16: #endif // BOOST_SERIALIZATION_SHARED_PTR_HPP