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@101: #if defined(_MSC_VER) 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@101: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@101: #include 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@101: // boost:: 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@101: typedef 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@101: typedef 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@101: // serialization for boost::shared_ptr Chris@101: Chris@101: // Using a constant means that all shared pointers are held in the same set. Chris@101: // Thus we detect handle multiple pointers to the same value instances Chris@101: // in the archive. Chris@101: void * const shared_ptr_helper_id = 0; 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: // 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: 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@101: boost::serialization::shared_ptr_helper & h = Chris@101: ar.template get_helper< shared_ptr_helper >( Chris@101: shared_ptr_helper_id Chris@101: ); Chris@101: h.append(sp); Chris@16: r = sp.get(); Chris@16: } Chris@16: else{ Chris@16: ar >> boost::serialization::make_nvp("px", r); Chris@16: } Chris@101: shared_ptr_helper & h = Chris@101: ar.template get_helper >( Chris@101: shared_ptr_helper_id Chris@101: ); Chris@101: h.reset(t,r); Chris@16: } Chris@101: #else Chris@16: 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@101: Chris@101: boost::serialization::shared_ptr_helper & h = Chris@101: ar.template get_helper >( Chris@101: shared_ptr_helper_id Chris@101: ); Chris@101: h.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@101: /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 Chris@101: // std::shared_ptr serialization traits Chris@101: // version 1 to distinguish from boost 1.32 version. Note: we can only do this Chris@101: // for a template when the compiler supports partial template specialization Chris@101: Chris@101: #ifndef BOOST_NO_CXX11_SMART_PTR Chris@101: #include Chris@101: Chris@101: // note: we presume that any compiler/library which supports C++11 Chris@101: // std::pointers also supports template partial specialization Chris@101: // trap here if such presumption were to turn out to wrong!!! Chris@101: #ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION Chris@101: BOOST_STATIC_ASSERT(false); Chris@101: #endif Chris@101: Chris@101: namespace boost { Chris@101: namespace serialization{ Chris@101: template Chris@101: struct version< ::std::shared_ptr< T > > { Chris@101: typedef mpl::integral_c_tag tag; Chris@101: typedef mpl::int_<1> type; Chris@101: BOOST_STATIC_CONSTANT(int, value = type::value); Chris@101: }; Chris@101: // don't track shared pointers Chris@101: template Chris@101: struct tracking_level< ::std::shared_ptr< T > > { Chris@101: typedef mpl::integral_c_tag tag; Chris@101: typedef mpl::int_< ::boost::serialization::track_never> type; Chris@101: BOOST_STATIC_CONSTANT(int, value = type::value); Chris@101: }; Chris@101: }} Chris@101: // the following just keeps older programs from breaking Chris@101: #define BOOST_SERIALIZATION_SHARED_PTR(T) Chris@101: Chris@101: namespace boost { Chris@101: namespace serialization{ Chris@101: Chris@101: /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 Chris@101: // serialization for std::shared_ptr Chris@101: Chris@101: template Chris@101: inline void save( Chris@101: Archive & ar, Chris@101: const std::shared_ptr< T > &t, Chris@101: const unsigned int /* file_version */ Chris@101: ){ Chris@101: // The most common cause of trapping here would be serializing Chris@101: // something like shared_ptr. This occurs because int Chris@101: // is never tracked by default. Wrap int in a trackable type Chris@101: BOOST_STATIC_ASSERT((tracking_level< T >::value != track_never)); Chris@101: const T * t_ptr = t.get(); Chris@101: ar << boost::serialization::make_nvp("px", t_ptr); Chris@101: } Chris@101: Chris@101: template Chris@101: inline void load( Chris@101: Archive & ar, Chris@101: std::shared_ptr< T > &t, Chris@101: const unsigned int /*file_version*/ Chris@101: ){ Chris@101: // The most common cause of trapping here would be serializing Chris@101: // something like shared_ptr. This occurs because int Chris@101: // is never tracked by default. Wrap int in a trackable type Chris@101: BOOST_STATIC_ASSERT((tracking_level< T >::value != track_never)); Chris@101: T* r; Chris@101: ar >> boost::serialization::make_nvp("px", r); Chris@101: //void (* const id)(Archive &, std::shared_ptr< T > &, const unsigned int) = & load; Chris@101: boost::serialization::shared_ptr_helper & h = Chris@101: ar.template get_helper< Chris@101: shared_ptr_helper Chris@101: >( Chris@101: shared_ptr_helper_id Chris@101: ); Chris@101: h.reset(t,r); Chris@101: } Chris@101: Chris@101: template Chris@101: inline void serialize( Chris@101: Archive & ar, Chris@101: std::shared_ptr< T > &t, Chris@101: const unsigned int file_version Chris@101: ){ Chris@101: // correct shared_ptr serialization depends upon object tracking Chris@101: // being used. Chris@101: BOOST_STATIC_ASSERT( Chris@101: boost::serialization::tracking_level< T >::value Chris@101: != boost::serialization::track_never Chris@101: ); Chris@101: boost::serialization::split_free(ar, t, file_version); Chris@101: } Chris@101: Chris@101: } // namespace serialization Chris@101: } // namespace boost Chris@101: Chris@101: #endif // BOOST_NO_CXX11_SMART_PTR Chris@101: Chris@16: #endif // BOOST_SERIALIZATION_SHARED_PTR_HPP