annotate DEPENDENCIES/generic/include/boost/serialization/export.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 #ifndef BOOST_SERIALIZATION_EXPORT_HPP
Chris@16 2 #define BOOST_SERIALIZATION_EXPORT_HPP
Chris@16 3
Chris@16 4 // MS compatible compilers support #pragma once
Chris@101 5 #if defined(_MSC_VER)
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 // export.hpp: set traits of classes to be serialized
Chris@16 11
Chris@16 12 // (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
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 // (C) Copyright 2006 David Abrahams - http://www.boost.org.
Chris@16 20 // implementation of class export functionality. This is an alternative to
Chris@16 21 // "forward declaration" method to provoke instantiation of derived classes
Chris@16 22 // that are to be serialized through pointers.
Chris@16 23
Chris@16 24 #include <utility>
Chris@16 25 #include <cstddef> // NULL
Chris@16 26
Chris@16 27 #include <boost/config.hpp>
Chris@16 28 #include <boost/static_assert.hpp>
Chris@16 29 #include <boost/preprocessor/stringize.hpp>
Chris@16 30 #include <boost/type_traits/is_polymorphic.hpp>
Chris@16 31
Chris@16 32 #include <boost/mpl/assert.hpp>
Chris@16 33 #include <boost/mpl/and.hpp>
Chris@16 34 #include <boost/mpl/not.hpp>
Chris@16 35 #include <boost/mpl/bool.hpp>
Chris@16 36
Chris@16 37 #include <boost/serialization/extended_type_info.hpp> // for guid_defined only
Chris@16 38 #include <boost/serialization/static_warning.hpp>
Chris@16 39 #include <boost/serialization/assume_abstract.hpp>
Chris@16 40 #include <boost/serialization/force_include.hpp>
Chris@16 41 #include <boost/serialization/singleton.hpp>
Chris@16 42
Chris@16 43 #include <boost/archive/detail/register_archive.hpp>
Chris@16 44
Chris@16 45 #include <iostream>
Chris@16 46
Chris@16 47 namespace boost {
Chris@16 48 namespace archive {
Chris@16 49 namespace detail {
Chris@16 50
Chris@16 51 class basic_pointer_iserializer;
Chris@16 52 class basic_pointer_oserializer;
Chris@16 53
Chris@16 54 template<class Archive, class T>
Chris@16 55 class pointer_iserializer;
Chris@16 56 template<class Archive, class T>
Chris@16 57 class pointer_oserializer;
Chris@16 58
Chris@16 59 template <class Archive, class Serializable>
Chris@16 60 struct export_impl
Chris@16 61 {
Chris@16 62 static const basic_pointer_iserializer &
Chris@16 63 enable_load(mpl::true_){
Chris@16 64 return boost::serialization::singleton<
Chris@16 65 pointer_iserializer<Archive, Serializable>
Chris@16 66 >::get_const_instance();
Chris@16 67 }
Chris@16 68
Chris@16 69 static const basic_pointer_oserializer &
Chris@16 70 enable_save(mpl::true_){
Chris@16 71 return boost::serialization::singleton<
Chris@16 72 pointer_oserializer<Archive, Serializable>
Chris@16 73 >::get_const_instance();
Chris@16 74 }
Chris@16 75 inline static void enable_load(mpl::false_) {}
Chris@16 76 inline static void enable_save(mpl::false_) {}
Chris@16 77 };
Chris@16 78
Chris@16 79 // On many platforms, naming a specialization of this template is
Chris@16 80 // enough to cause its argument to be instantiated.
Chris@16 81 template <void(*)()>
Chris@16 82 struct instantiate_function {};
Chris@16 83
Chris@16 84 template <class Archive, class Serializable>
Chris@16 85 struct ptr_serialization_support
Chris@16 86 {
Chris@16 87 # if defined(BOOST_MSVC) || defined(__SUNPRO_CC)
Chris@16 88 virtual BOOST_DLLEXPORT void instantiate() BOOST_USED;
Chris@16 89 # elif defined(__BORLANDC__)
Chris@16 90 static BOOST_DLLEXPORT void instantiate() BOOST_USED;
Chris@16 91 enum { x = sizeof(instantiate(),3) };
Chris@16 92 # else
Chris@16 93 static BOOST_DLLEXPORT void instantiate() BOOST_USED;
Chris@16 94 typedef instantiate_function<
Chris@16 95 &ptr_serialization_support::instantiate
Chris@16 96 > x;
Chris@16 97 # endif
Chris@16 98 };
Chris@16 99
Chris@16 100 template <class Archive, class Serializable>
Chris@16 101 BOOST_DLLEXPORT void
Chris@16 102 ptr_serialization_support<Archive,Serializable>::instantiate()
Chris@16 103 {
Chris@16 104 export_impl<Archive,Serializable>::enable_save(
Chris@16 105 #if ! defined(__BORLANDC__)
Chris@101 106 typename
Chris@16 107 #endif
Chris@16 108 Archive::is_saving()
Chris@16 109 );
Chris@16 110
Chris@16 111 export_impl<Archive,Serializable>::enable_load(
Chris@16 112 #if ! defined(__BORLANDC__)
Chris@101 113 typename
Chris@16 114 #endif
Chris@16 115 Archive::is_loading()
Chris@16 116 );
Chris@16 117 }
Chris@16 118
Chris@16 119 // Note INTENTIONAL usage of anonymous namespace in header.
Chris@16 120 // This was made this way so that export.hpp could be included
Chris@16 121 // in other headers. This is still under study.
Chris@16 122
Chris@16 123 namespace extra_detail {
Chris@16 124
Chris@16 125 template<class T>
Chris@16 126 struct guid_initializer
Chris@16 127 {
Chris@16 128 void export_guid(mpl::false_) const {
Chris@16 129 // generates the statically-initialized objects whose constructors
Chris@16 130 // register the information allowing serialization of T objects
Chris@16 131 // through pointers to their base classes.
Chris@16 132 instantiate_ptr_serialization((T*)0, 0, adl_tag());
Chris@16 133 }
Chris@16 134 void export_guid(mpl::true_) const {
Chris@16 135 }
Chris@16 136 guid_initializer const & export_guid() const {
Chris@16 137 BOOST_STATIC_WARNING(boost::is_polymorphic< T >::value);
Chris@16 138 // note: exporting an abstract base class will have no effect
Chris@16 139 // and cannot be used to instantitiate serialization code
Chris@16 140 // (one might be using this in a DLL to instantiate code)
Chris@16 141 //BOOST_STATIC_WARNING(! boost::serialization::is_abstract< T >::value);
Chris@16 142 export_guid(boost::serialization::is_abstract< T >());
Chris@16 143 return *this;
Chris@16 144 }
Chris@16 145 };
Chris@16 146
Chris@16 147 template<typename T>
Chris@16 148 struct init_guid;
Chris@16 149
Chris@16 150 } // anonymous
Chris@16 151 } // namespace detail
Chris@16 152 } // namespace archive
Chris@16 153 } // namespace boost
Chris@16 154
Chris@16 155 #define BOOST_CLASS_EXPORT_IMPLEMENT(T) \
Chris@16 156 namespace boost { \
Chris@16 157 namespace archive { \
Chris@16 158 namespace detail { \
Chris@16 159 namespace extra_detail { \
Chris@16 160 template<> \
Chris@16 161 struct init_guid< T > { \
Chris@16 162 static guid_initializer< T > const & g; \
Chris@16 163 }; \
Chris@16 164 guid_initializer< T > const & init_guid< T >::g = \
Chris@16 165 ::boost::serialization::singleton< \
Chris@16 166 guid_initializer< T > \
Chris@16 167 >::get_mutable_instance().export_guid(); \
Chris@16 168 }}}} \
Chris@16 169 /**/
Chris@16 170
Chris@16 171 #define BOOST_CLASS_EXPORT_KEY2(T, K) \
Chris@16 172 namespace boost { \
Chris@16 173 namespace serialization { \
Chris@16 174 template<> \
Chris@16 175 struct guid_defined< T > : boost::mpl::true_ {}; \
Chris@16 176 template<> \
Chris@16 177 inline const char * guid< T >(){ \
Chris@16 178 return K; \
Chris@16 179 } \
Chris@16 180 } /* serialization */ \
Chris@16 181 } /* boost */ \
Chris@16 182 /**/
Chris@16 183
Chris@16 184 #define BOOST_CLASS_EXPORT_KEY(T) \
Chris@16 185 BOOST_CLASS_EXPORT_KEY2(T, BOOST_PP_STRINGIZE(T)) \
Chris@16 186 /**/
Chris@16 187
Chris@16 188 #define BOOST_CLASS_EXPORT_GUID(T, K) \
Chris@16 189 BOOST_CLASS_EXPORT_KEY2(T, K) \
Chris@16 190 BOOST_CLASS_EXPORT_IMPLEMENT(T) \
Chris@16 191 /**/
Chris@16 192
Chris@16 193 #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3205))
Chris@16 194
Chris@16 195 // CodeWarrior fails to construct static members of class templates
Chris@16 196 // when they are instantiated from within templates, so on that
Chris@16 197 // compiler we ask users to specifically register base/derived class
Chris@16 198 // relationships for exported classes. On all other compilers, use of
Chris@16 199 // this macro is entirely optional.
Chris@16 200 # define BOOST_SERIALIZATION_MWERKS_BASE_AND_DERIVED(Base,Derived) \
Chris@16 201 namespace { \
Chris@16 202 static int BOOST_PP_CAT(boost_serialization_mwerks_init_, __LINE__) = \
Chris@16 203 (::boost::archive::detail::instantiate_ptr_serialization((Derived*)0,0), 3); \
Chris@16 204 static int BOOST_PP_CAT(boost_serialization_mwerks_init2_, __LINE__) = ( \
Chris@16 205 ::boost::serialization::void_cast_register((Derived*)0,(Base*)0) \
Chris@16 206 , 3); \
Chris@16 207 }
Chris@16 208
Chris@16 209 #else
Chris@16 210
Chris@16 211 # define BOOST_SERIALIZATION_MWERKS_BASE_AND_DERIVED(Base,Derived)
Chris@16 212
Chris@16 213 #endif
Chris@16 214
Chris@16 215 // check for unnecessary export. T isn't polymorphic so there is no
Chris@16 216 // need to export it.
Chris@16 217 #define BOOST_CLASS_EXPORT_CHECK(T) \
Chris@16 218 BOOST_STATIC_WARNING( \
Chris@16 219 boost::is_polymorphic<U>::value \
Chris@16 220 ); \
Chris@16 221 /**/
Chris@16 222
Chris@16 223 // the default exportable class identifier is the class name
Chris@16 224 // the default list of archives types for which code id generated
Chris@16 225 // are the originally included with this serialization system
Chris@16 226 #define BOOST_CLASS_EXPORT(T) \
Chris@16 227 BOOST_CLASS_EXPORT_GUID( \
Chris@16 228 T, \
Chris@16 229 BOOST_PP_STRINGIZE(T) \
Chris@16 230 ) \
Chris@16 231 /**/
Chris@16 232
Chris@16 233 #endif // BOOST_SERIALIZATION_EXPORT_HPP
Chris@16 234