92 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| // Copyright David Abrahams 2006. Distributed under the Boost
 | |
| // Software License, Version 1.0. (See accompanying
 | |
| // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 | |
| #ifndef BOOST_ARCHIVE_DETAIL_REGISTER_ARCHIVE_DWA2006521_HPP
 | |
| # define BOOST_ARCHIVE_DETAIL_REGISTER_ARCHIVE_DWA2006521_HPP
 | |
| 
 | |
| namespace boost { namespace archive { namespace detail { 
 | |
| 
 | |
| // No instantiate_ptr_serialization overloads generated by
 | |
| // BOOST_SERIALIZATION_REGISTER_ARCHIVE that lexically follow the call
 | |
| // will be seen *unless* they are in an associated namespace of one of
 | |
| // the arguments, so we pass one of these along to make sure this
 | |
| // namespace is considered.  See temp.dep.candidate (14.6.4.2) in the
 | |
| // standard.
 | |
| struct adl_tag {};
 | |
| 
 | |
| template <class Archive, class Serializable>
 | |
| struct ptr_serialization_support;
 | |
| 
 | |
| // We could've just used ptr_serialization_support, above, but using
 | |
| // it with only a forward declaration causes vc6/7 to complain about a
 | |
| // missing instantiate member, even if it has one.  This is just a
 | |
| // friendly layer of indirection.
 | |
| template <class Archive, class Serializable>
 | |
| struct _ptr_serialization_support
 | |
|   : ptr_serialization_support<Archive,Serializable>
 | |
| {
 | |
|     typedef int type;
 | |
| };
 | |
| 
 | |
| #if defined(__SUNPRO_CC) && (__SUNPRO_CC < 0x5130)
 | |
| 
 | |
| template<int N>
 | |
| struct counter : counter<N-1> {};
 | |
| template<>
 | |
| struct counter<0> {};
 | |
| 
 | |
| template<class Serializable>
 | |
| void instantiate_ptr_serialization(Serializable* s, int, adl_tag) {
 | |
|     instantiate_ptr_serialization(s, counter<20>());
 | |
| }
 | |
| 
 | |
| template<class Archive>
 | |
| struct get_counter {
 | |
|     static const int value = sizeof(adjust_counter(counter<20>()));
 | |
|     typedef counter<value> type;
 | |
|     typedef counter<value - 1> prior;
 | |
|     typedef char (&next)[value+1];
 | |
| };
 | |
| 
 | |
| char adjust_counter(counter<0>);
 | |
| template<class Serializable>
 | |
| void instantiate_ptr_serialization(Serializable*, counter<0>) {}
 | |
| 
 | |
| #define BOOST_SERIALIZATION_REGISTER_ARCHIVE(Archive)                     \
 | |
| namespace boost { namespace archive { namespace detail {                  \
 | |
|     get_counter<Archive >::next adjust_counter(get_counter<Archive >::type);\
 | |
|     template<class Serializable>                                          \
 | |
|     void instantiate_ptr_serialization(Serializable* s,                   \
 | |
|         get_counter<Archive >::type) {                                    \
 | |
|         ptr_serialization_support<Archive, Serializable> x;               \
 | |
|         instantiate_ptr_serialization(s, get_counter<Archive >::prior()); \
 | |
|     }\
 | |
| }}}
 | |
| 
 | |
| 
 | |
| #else
 | |
| 
 | |
| // This function gets called, but its only purpose is to participate
 | |
| // in overload resolution with the functions declared by
 | |
| // BOOST_SERIALIZATION_REGISTER_ARCHIVE, below.
 | |
| template <class Serializable>
 | |
| void instantiate_ptr_serialization(Serializable*, int, adl_tag ) {}
 | |
| 
 | |
| // The function declaration generated by this macro never actually
 | |
| // gets called, but its return type gets instantiated, and that's
 | |
| // enough to cause registration of serialization functions between
 | |
| // Archive and any exported Serializable type.  See also:
 | |
| // boost/serialization/export.hpp
 | |
| # define BOOST_SERIALIZATION_REGISTER_ARCHIVE(Archive)                  \
 | |
| namespace boost { namespace archive { namespace detail {                \
 | |
|                                                                         \
 | |
| template <class Serializable>                                           \
 | |
| typename _ptr_serialization_support<Archive, Serializable>::type  \
 | |
| instantiate_ptr_serialization( Serializable*, Archive*, adl_tag );              \
 | |
|                                                                         \
 | |
| }}}
 | |
| #endif
 | |
| }}} // namespace boost::archive::detail
 | |
| 
 | |
| #endif // BOOST_ARCHIVE_DETAIL_INSTANTIATE_SERIALIZE_DWA2006521_HPP
 | 
