1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/epoc32/include/stdapis/boost/serialization/export.hpp Tue Mar 16 16:12:26 2010 +0000
1.3 @@ -0,0 +1,280 @@
1.4 +#ifndef BOOST_SERIALIZATION_EXPORT_HPP
1.5 +#define BOOST_SERIALIZATION_EXPORT_HPP
1.6 +
1.7 +// MS compatible compilers support #pragma once
1.8 +#if defined(_MSC_VER) && (_MSC_VER >= 1020)
1.9 +# pragma once
1.10 +#endif
1.11 +
1.12 +/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
1.13 +// export.hpp: set traits of classes to be serialized
1.14 +
1.15 +// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
1.16 +// Use, modification and distribution is subject to the Boost Software
1.17 +// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
1.18 +// http://www.boost.org/LICENSE_1_0.txt)
1.19 +
1.20 +// See http://www.boost.org for updates, documentation, and revision history.
1.21 +
1.22 +// implementation of class export functionality. This is an alternative to
1.23 +// "forward declaration" method to provoke instantiation of derived classes
1.24 +// that are to be serialized through pointers.
1.25 +
1.26 +#include <utility>
1.27 +
1.28 +#include <boost/config.hpp>
1.29 +
1.30 +// if no archive headers have been included this is a no op
1.31 +// this is to permit BOOST_EXPORT etc to be included in a
1.32 +// file declaration header
1.33 +#if ! defined(BOOST_ARCHIVE_BASIC_ARCHIVE_HPP)
1.34 +#define BOOST_CLASS_EXPORT_GUID_ARCHIVE_LIST(T, K, ASEQ)
1.35 +
1.36 +#else
1.37 +#include <boost/static_assert.hpp>
1.38 +#include <boost/preprocessor/stringize.hpp>
1.39 +#include <boost/mpl/eval_if.hpp>
1.40 +#include <boost/mpl/or.hpp>
1.41 +#include <boost/mpl/empty.hpp>
1.42 +#include <boost/mpl/front.hpp>
1.43 +#include <boost/mpl/pop_front.hpp>
1.44 +#include <boost/mpl/void.hpp>
1.45 +#include <boost/mpl/identity.hpp>
1.46 +
1.47 +#include <boost/archive/detail/known_archive_types.hpp>
1.48 +#include <boost/serialization/force_include.hpp>
1.49 +#include <boost/serialization/type_info_implementation.hpp>
1.50 +#include <boost/serialization/is_abstract.hpp>
1.51 +
1.52 +namespace boost {
1.53 +namespace archive {
1.54 +namespace detail {
1.55 +
1.56 +// forward template declarations
1.57 +class basic_pointer_iserializer;
1.58 +template<class Archive, class T>
1.59 +BOOST_DLLEXPORT const basic_pointer_iserializer &
1.60 +instantiate_pointer_iserializer(Archive * ar, T *) BOOST_USED;
1.61 +
1.62 +class basic_pointer_oserializer;
1.63 +template<class Archive, class T>
1.64 +BOOST_DLLEXPORT const basic_pointer_oserializer &
1.65 +instantiate_pointer_oserializer(Archive * ar, T *) BOOST_USED;
1.66 +
1.67 +namespace export_impl
1.68 +{
1.69 + struct nothing{
1.70 + static void instantiate(){}
1.71 + };
1.72 +
1.73 + template<class Archive, class T>
1.74 + struct archive {
1.75 + struct i {
1.76 + static void invoke(){
1.77 + instantiate_pointer_iserializer(
1.78 + static_cast<Archive *>(NULL),
1.79 + static_cast<T *>(NULL)
1.80 + );
1.81 + }
1.82 + };
1.83 + struct o {
1.84 + static void invoke(){
1.85 + instantiate_pointer_oserializer(
1.86 + static_cast<Archive *>(NULL),
1.87 + static_cast<T *>(NULL)
1.88 + );
1.89 + }
1.90 + };
1.91 + static void instantiate(){
1.92 + #if defined(__GNUC__) && (__GNUC__ >= 3)
1.93 + BOOST_STATIC_ASSERT(
1.94 + Archive::is_loading::value || Archive::is_saving::value
1.95 + );
1.96 + #endif
1.97 + typedef BOOST_DEDUCED_TYPENAME mpl::eval_if<
1.98 + BOOST_DEDUCED_TYPENAME Archive::is_saving,
1.99 + mpl::identity<o>,
1.100 + // else
1.101 + BOOST_DEDUCED_TYPENAME mpl::eval_if<
1.102 + BOOST_DEDUCED_TYPENAME Archive::is_loading,
1.103 + mpl::identity<i>,
1.104 + // else
1.105 + mpl::identity<nothing>
1.106 + > >::type typex;
1.107 + typex::invoke();
1.108 + }
1.109 + };
1.110 +
1.111 + template<class ASeq, class T>
1.112 + struct for_each_archive {
1.113 + private:
1.114 + typedef BOOST_DEDUCED_TYPENAME mpl::pop_front<ASeq>::type tail;
1.115 + typedef BOOST_DEDUCED_TYPENAME mpl::front<ASeq>::type head;
1.116 + public:
1.117 + static void instantiate(){
1.118 + archive<head, T>::instantiate();
1.119 + typedef BOOST_DEDUCED_TYPENAME mpl::eval_if<
1.120 + mpl::empty<tail>,
1.121 + mpl::identity<nothing>,
1.122 + mpl::identity<for_each_archive<tail, T> >
1.123 + >::type typex;
1.124 + typex::instantiate();
1.125 + }
1.126 + };
1.127 +
1.128 +} // namespace export_impl
1.129 +
1.130 +// strictly conforming
1.131 +template<class T, class ASeq>
1.132 +struct export_generator {
1.133 + export_generator(){
1.134 + export_impl::for_each_archive<ASeq, T>::instantiate();
1.135 + }
1.136 + static const export_generator instance;
1.137 +};
1.138 +
1.139 +template<class T, class ASeq>
1.140 +const export_generator<T, ASeq>
1.141 + export_generator<T, ASeq>::instance;
1.142 +
1.143 +// instantiation of this template creates a static object.
1.144 +template<class T>
1.145 +struct guid_initializer {
1.146 + typedef BOOST_DEDUCED_TYPENAME boost::serialization::type_info_implementation<T>::type eti_type;
1.147 + static void export_register(const char *key){
1.148 + eti_type::export_register(key);
1.149 + }
1.150 + static const guid_initializer instance;
1.151 + guid_initializer(const char *key = 0) BOOST_USED ;
1.152 +};
1.153 +
1.154 +template<class T>
1.155 +guid_initializer<T>::guid_initializer(const char *key){
1.156 + if(0 != key)
1.157 + export_register(key);
1.158 +}
1.159 +
1.160 +template<class T>
1.161 +const guid_initializer<T> guid_initializer<T>::instance;
1.162 +
1.163 +// only gcc seems to be able to explicitly instantiate a static instance.
1.164 +// but all can instantiate a function that refers to a static instance
1.165 +
1.166 +// the following optimization - inhibiting explicit instantiation for abstract
1.167 +// classes breaks msvc compliles
1.168 +template<class T, class ASeq>
1.169 +struct export_instance {
1.170 + struct abstract {
1.171 + static const export_generator<T, ASeq> *
1.172 + invoke(){
1.173 + return 0;
1.174 + }
1.175 + };
1.176 + struct not_abstract {
1.177 + static const export_generator<T, ASeq> *
1.178 + invoke(){
1.179 + return & export_generator<T, ASeq>::instance;
1.180 + }
1.181 + };
1.182 +};
1.183 +
1.184 +template<class T, class ASeq>
1.185 +BOOST_DLLEXPORT
1.186 +std::pair<const export_generator<T, ASeq> *, const guid_initializer<T> *>
1.187 +export_instance_invoke() {
1.188 + typedef BOOST_DEDUCED_TYPENAME mpl::eval_if<
1.189 + serialization::is_abstract<T>,
1.190 + mpl::identity<BOOST_DEDUCED_TYPENAME export_instance<T, ASeq>::abstract>,
1.191 + mpl::identity<BOOST_DEDUCED_TYPENAME export_instance<T, ASeq>::not_abstract>
1.192 + >::type typex;
1.193 + return std::pair<const export_generator<T, ASeq> *, const guid_initializer<T> *>(
1.194 + typex::invoke(),
1.195 + & guid_initializer<T>::instance
1.196 + );
1.197 +}
1.198 +
1.199 +template<class T, class ASeq>
1.200 +struct export_archives {
1.201 + struct empty_archive_list {
1.202 + static BOOST_DLLEXPORT
1.203 + std::pair<const export_generator<T, ASeq> *, const guid_initializer<T> *>
1.204 + invoke(){
1.205 + return std::pair<const export_generator<T, ASeq> *,
1.206 + const guid_initializer<T> *>(0, 0);
1.207 + }
1.208 + };
1.209 + struct non_empty_archive_list {
1.210 + static BOOST_DLLEXPORT
1.211 + std::pair<const export_generator<T, ASeq> *, const guid_initializer<T> *>
1.212 + invoke(){
1.213 + return export_instance_invoke<T, ASeq>();
1.214 + }
1.215 + };
1.216 +};
1.217 +
1.218 +template<class T, class ASeq>
1.219 +BOOST_DLLEXPORT
1.220 +std::pair<const export_generator<T, ASeq> *, const guid_initializer<T> *>
1.221 +export_archives_invoke(T &, ASeq &){
1.222 + typedef BOOST_DEDUCED_TYPENAME mpl::eval_if<
1.223 + mpl::empty<ASeq>,
1.224 + mpl::identity<BOOST_DEDUCED_TYPENAME export_archives<T, ASeq>::empty_archive_list>,
1.225 + mpl::identity<BOOST_DEDUCED_TYPENAME export_archives<T, ASeq>::non_empty_archive_list>
1.226 + >::type typex;
1.227 + return typex::invoke();
1.228 +}
1.229 +
1.230 +} // namespace detail
1.231 +} // namespace archive
1.232 +} // namespace boost
1.233 +
1.234 +#define BOOST_CLASS_EXPORT_GUID_ARCHIVE_LIST(T, K, ASEQ) \
1.235 + namespace boost { \
1.236 + namespace archive { \
1.237 + namespace detail { \
1.238 + template<> \
1.239 + const guid_initializer< T > \
1.240 + guid_initializer< T >::instance(K); \
1.241 + template \
1.242 + BOOST_DLLEXPORT \
1.243 + std::pair<const export_generator<T, ASEQ> *, const guid_initializer< T > *> \
1.244 + export_archives_invoke<T, ASEQ>(T &, ASEQ &); \
1.245 + } } } \
1.246 + /**/
1.247 +
1.248 +#endif
1.249 +
1.250 +// check for unnecessary export. T isn't polymorphic so there is no
1.251 +// need to export it.
1.252 +#define BOOST_CLASS_EXPORT_CHECK(T) \
1.253 + BOOST_STATIC_WARNING( \
1.254 + boost::serialization::type_info_implementation< T > \
1.255 + ::type::is_polymorphic::value \
1.256 + ); \
1.257 + /**/
1.258 +
1.259 +// the default list of archives types for which code id generated
1.260 +#define BOOST_CLASS_EXPORT_GUID(T, K) \
1.261 + BOOST_CLASS_EXPORT_GUID_ARCHIVE_LIST( \
1.262 + T, \
1.263 + K, \
1.264 + boost::archive::detail::known_archive_types::type \
1.265 + ) \
1.266 + /**/
1.267 +
1.268 +// the default exportable class identifier is the class name
1.269 +#define BOOST_CLASS_EXPORT_ARCHIVE_LIST(T, ASEQ) \
1.270 + BOOST_CLASS_EXPORT_GUID_ARCHIVE_LIST(T, BOOST_PP_STRINGIZE(T), A)
1.271 +
1.272 +// the default exportable class identifier is the class name
1.273 +// the default list of archives types for which code id generated
1.274 +// are the originally included with this serialization system
1.275 +#define BOOST_CLASS_EXPORT(T) \
1.276 + BOOST_CLASS_EXPORT_GUID_ARCHIVE_LIST( \
1.277 + T, \
1.278 + BOOST_PP_STRINGIZE(T), \
1.279 + boost::archive::detail::known_archive_types::type \
1.280 + ) \
1.281 + /**/
1.282 +
1.283 +#endif // BOOST_SERIALIZATION_EXPORT_HPP