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 |