annotate DEPENDENCIES/generic/include/boost/serialization/shared_ptr.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children c530137014c0
rev   line source
Chris@16 1 #ifndef BOOST_SERIALIZATION_SHARED_PTR_HPP
Chris@16 2 #define BOOST_SERIALIZATION_SHARED_PTR_HPP
Chris@16 3
Chris@16 4 // MS compatible compilers support #pragma once
Chris@16 5 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
Chris@16 6 # pragma once
Chris@16 7 #endif
Chris@16 8
Chris@16 9 /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
Chris@16 10 // shared_ptr.hpp: serialization for boost shared pointer
Chris@16 11
Chris@16 12 // (C) Copyright 2004 Robert Ramey and Martin Ecker
Chris@16 13 // Use, modification and distribution is subject to the Boost Software
Chris@16 14 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
Chris@16 15 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 16
Chris@16 17 // See http://www.boost.org for updates, documentation, and revision history.
Chris@16 18
Chris@16 19 #include <cstddef> // NULL
Chris@16 20
Chris@16 21 #include <boost/config.hpp>
Chris@16 22 #include <boost/mpl/integral_c.hpp>
Chris@16 23 #include <boost/mpl/integral_c_tag.hpp>
Chris@16 24
Chris@16 25 #include <boost/detail/workaround.hpp>
Chris@16 26 #include <boost/shared_ptr.hpp>
Chris@16 27
Chris@16 28 #include <boost/serialization/split_free.hpp>
Chris@16 29 #include <boost/serialization/nvp.hpp>
Chris@16 30 #include <boost/serialization/version.hpp>
Chris@16 31 #include <boost/serialization/tracking.hpp>
Chris@16 32
Chris@16 33 /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
Chris@16 34 // shared_ptr serialization traits
Chris@16 35 // version 1 to distinguish from boost 1.32 version. Note: we can only do this
Chris@16 36 // for a template when the compiler supports partial template specialization
Chris@16 37
Chris@16 38 #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
Chris@16 39 namespace boost {
Chris@16 40 namespace serialization{
Chris@16 41 template<class T>
Chris@16 42 struct version< ::boost::shared_ptr< T > > {
Chris@16 43 typedef mpl::integral_c_tag tag;
Chris@16 44 #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3206))
Chris@16 45 typedef BOOST_DEDUCED_TYPENAME mpl::int_<1> type;
Chris@16 46 #else
Chris@16 47 typedef mpl::int_<1> type;
Chris@16 48 #endif
Chris@16 49 #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x570))
Chris@16 50 BOOST_STATIC_CONSTANT(int, value = 1);
Chris@16 51 #else
Chris@16 52 BOOST_STATIC_CONSTANT(int, value = type::value);
Chris@16 53 #endif
Chris@16 54 };
Chris@16 55 // don't track shared pointers
Chris@16 56 template<class T>
Chris@16 57 struct tracking_level< ::boost::shared_ptr< T > > {
Chris@16 58 typedef mpl::integral_c_tag tag;
Chris@16 59 #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3206))
Chris@16 60 typedef BOOST_DEDUCED_TYPENAME mpl::int_< ::boost::serialization::track_never> type;
Chris@16 61 #else
Chris@16 62 typedef mpl::int_< ::boost::serialization::track_never> type;
Chris@16 63 #endif
Chris@16 64 #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x570))
Chris@16 65 BOOST_STATIC_CONSTANT(int, value = ::boost::serialization::track_never);
Chris@16 66 #else
Chris@16 67 BOOST_STATIC_CONSTANT(int, value = type::value);
Chris@16 68 #endif
Chris@16 69 };
Chris@16 70 }}
Chris@16 71 #define BOOST_SERIALIZATION_SHARED_PTR(T)
Chris@16 72 #else
Chris@16 73 // define macro to let users of these compilers do this
Chris@16 74 #define BOOST_SERIALIZATION_SHARED_PTR(T) \
Chris@16 75 BOOST_CLASS_VERSION( \
Chris@16 76 ::boost::shared_ptr< T >, \
Chris@16 77 1 \
Chris@16 78 ) \
Chris@16 79 BOOST_CLASS_TRACKING( \
Chris@16 80 ::boost::shared_ptr< T >, \
Chris@16 81 ::boost::serialization::track_never \
Chris@16 82 ) \
Chris@16 83 /**/
Chris@16 84 #endif
Chris@16 85
Chris@16 86 namespace boost {
Chris@16 87 namespace serialization{
Chris@16 88
Chris@16 89 struct null_deleter {
Chris@16 90 void operator()(void const *) const {}
Chris@16 91 };
Chris@16 92
Chris@16 93 /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
Chris@16 94 // serialization for shared_ptr
Chris@16 95
Chris@16 96 template<class Archive, class T>
Chris@16 97 inline void save(
Chris@16 98 Archive & ar,
Chris@16 99 const boost::shared_ptr< T > &t,
Chris@16 100 const unsigned int /* file_version */
Chris@16 101 ){
Chris@16 102 // The most common cause of trapping here would be serializing
Chris@16 103 // something like shared_ptr<int>. This occurs because int
Chris@16 104 // is never tracked by default. Wrap int in a trackable type
Chris@16 105 BOOST_STATIC_ASSERT((tracking_level< T >::value != track_never));
Chris@16 106 const T * t_ptr = t.get();
Chris@16 107 ar << boost::serialization::make_nvp("px", t_ptr);
Chris@16 108 }
Chris@16 109
Chris@16 110 #ifdef BOOST_SERIALIZATION_SHARED_PTR_132_HPP
Chris@16 111 template<class Archive, class T>
Chris@16 112 inline void load(
Chris@16 113 Archive & ar,
Chris@16 114 boost::shared_ptr< T > &t,
Chris@16 115 const unsigned int file_version
Chris@16 116 ){
Chris@16 117 // The most common cause of trapping here would be serializing
Chris@16 118 // something like shared_ptr<int>. This occurs because int
Chris@16 119 // is never tracked by default. Wrap int in a trackable type
Chris@16 120 BOOST_STATIC_ASSERT((tracking_level< T >::value != track_never));
Chris@16 121 T* r;
Chris@16 122 if(file_version < 1){
Chris@16 123 //ar.register_type(static_cast<
Chris@16 124 // boost_132::detail::sp_counted_base_impl<T *, boost::checked_deleter< T > > *
Chris@16 125 //>(NULL));
Chris@16 126 ar.register_type(static_cast<
Chris@16 127 boost_132::detail::sp_counted_base_impl<T *, null_deleter > *
Chris@16 128 >(NULL));
Chris@16 129 boost_132::shared_ptr< T > sp;
Chris@16 130 ar >> boost::serialization::make_nvp("px", sp.px);
Chris@16 131 ar >> boost::serialization::make_nvp("pn", sp.pn);
Chris@16 132 // got to keep the sps around so the sp.pns don't disappear
Chris@16 133 ar.append(sp);
Chris@16 134 r = sp.get();
Chris@16 135 }
Chris@16 136 else{
Chris@16 137 ar >> boost::serialization::make_nvp("px", r);
Chris@16 138 }
Chris@16 139 ar.reset(t,r);
Chris@16 140 }
Chris@16 141
Chris@16 142 #else
Chris@16 143 template<class Archive, class T>
Chris@16 144 inline void load(
Chris@16 145 Archive & ar,
Chris@16 146 boost::shared_ptr< T > &t,
Chris@16 147 const unsigned int /*file_version*/
Chris@16 148 ){
Chris@16 149 // The most common cause of trapping here would be serializing
Chris@16 150 // something like shared_ptr<int>. This occurs because int
Chris@16 151 // is never tracked by default. Wrap int in a trackable type
Chris@16 152 BOOST_STATIC_ASSERT((tracking_level< T >::value != track_never));
Chris@16 153 T* r;
Chris@16 154 ar >> boost::serialization::make_nvp("px", r);
Chris@16 155 ar.reset(t,r);
Chris@16 156 }
Chris@16 157 #endif
Chris@16 158
Chris@16 159 template<class Archive, class T>
Chris@16 160 inline void serialize(
Chris@16 161 Archive & ar,
Chris@16 162 boost::shared_ptr< T > &t,
Chris@16 163 const unsigned int file_version
Chris@16 164 ){
Chris@16 165 // correct shared_ptr serialization depends upon object tracking
Chris@16 166 // being used.
Chris@16 167 BOOST_STATIC_ASSERT(
Chris@16 168 boost::serialization::tracking_level< T >::value
Chris@16 169 != boost::serialization::track_never
Chris@16 170 );
Chris@16 171 boost::serialization::split_free(ar, t, file_version);
Chris@16 172 }
Chris@16 173
Chris@16 174 } // namespace serialization
Chris@16 175 } // namespace boost
Chris@16 176
Chris@16 177 #endif // BOOST_SERIALIZATION_SHARED_PTR_HPP