136 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			136 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | // Copyright (C) 2004 Arkadiy Vertleyb | ||
|  | // 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) | ||
|  | 
 | ||
|  | #include <boost/typeof/encode_decode_params.hpp> | ||
|  | 
 | ||
|  | #define n BOOST_PP_ITERATION() | ||
|  | 
 | ||
|  | // function pointers | ||
|  | 
 | ||
|  | template<class V, class R BOOST_PP_ENUM_TRAILING_PARAMS(n, class P)> | ||
|  | struct encode_type_impl<V, R(*)(BOOST_PP_ENUM_PARAMS(n, P))> | ||
|  | { | ||
|  |     typedef R BOOST_PP_CAT(P, n); | ||
|  |     typedef BOOST_TYPEOF_ENCODE_PARAMS(BOOST_PP_INC(n), FUN_PTR_ID + n) type; | ||
|  | }; | ||
|  | 
 | ||
|  | template<class V, class R BOOST_PP_ENUM_TRAILING_PARAMS(n, class P)> | ||
|  | struct encode_type_impl<V, R(*)(BOOST_PP_ENUM_PARAMS(n, P) ...)> | ||
|  | { | ||
|  |     typedef R BOOST_PP_CAT(P, n); | ||
|  |     typedef BOOST_TYPEOF_ENCODE_PARAMS(BOOST_PP_INC(n), FUN_VAR_PTR_ID + n) type; | ||
|  | }; | ||
|  | 
 | ||
|  | template<class Iter> | ||
|  | struct decode_type_impl<boost::mpl::size_t<FUN_PTR_ID + n>, Iter> | ||
|  | { | ||
|  |     typedef Iter iter0; | ||
|  |     BOOST_TYPEOF_DECODE_PARAMS(BOOST_PP_INC(n)) | ||
|  |     typedef BOOST_PP_CAT(p, n)(*type)(BOOST_PP_ENUM_PARAMS(n, p)); | ||
|  |     typedef BOOST_PP_CAT(iter, BOOST_PP_INC(n)) iter; | ||
|  | }; | ||
|  | 
 | ||
|  | template<class Iter> | ||
|  | struct decode_type_impl<boost::mpl::size_t<FUN_VAR_PTR_ID + n>, Iter> | ||
|  | { | ||
|  |     typedef Iter iter0; | ||
|  |     BOOST_TYPEOF_DECODE_PARAMS(BOOST_PP_INC(n)) | ||
|  |     typedef BOOST_PP_CAT(p, n)(*type)(BOOST_PP_ENUM_PARAMS(n, p) ...); | ||
|  |     typedef BOOST_PP_CAT(iter, BOOST_PP_INC(n)) iter; | ||
|  | }; | ||
|  | 
 | ||
|  | #ifndef BOOST_TYPEOF_NO_FUNCTION_TYPES | ||
|  | 
 | ||
|  |     // function references | ||
|  | 
 | ||
|  |     template<class V, class R BOOST_PP_ENUM_TRAILING_PARAMS(n, class P)> | ||
|  |     struct encode_type_impl<V, R(&)(BOOST_PP_ENUM_PARAMS(n, P))> | ||
|  |     { | ||
|  |         typedef R BOOST_PP_CAT(P, n); | ||
|  |         typedef BOOST_TYPEOF_ENCODE_PARAMS(BOOST_PP_INC(n), FUN_REF_ID + n) type; | ||
|  |     }; | ||
|  | 
 | ||
|  |     template<class V, class R BOOST_PP_ENUM_TRAILING_PARAMS(n, class P)> | ||
|  |     struct encode_type_impl<V, R(&)(BOOST_PP_ENUM_PARAMS(n, P) ...)> | ||
|  |     { | ||
|  |         typedef R BOOST_PP_CAT(P, n); | ||
|  |         typedef BOOST_TYPEOF_ENCODE_PARAMS(BOOST_PP_INC(n), FUN_VAR_REF_ID + n) type; | ||
|  |     }; | ||
|  | 
 | ||
|  |     template<class Iter> | ||
|  |     struct decode_type_impl<boost::mpl::size_t<FUN_REF_ID + n>, Iter> | ||
|  |     { | ||
|  |         typedef Iter iter0; | ||
|  |         BOOST_TYPEOF_DECODE_PARAMS(BOOST_PP_INC(n)) | ||
|  |         typedef BOOST_PP_CAT(p, n)(&type)(BOOST_PP_ENUM_PARAMS(n, p)); | ||
|  |         typedef BOOST_PP_CAT(iter, BOOST_PP_INC(n)) iter; | ||
|  |     }; | ||
|  | 
 | ||
|  |     template<class Iter> | ||
|  |     struct decode_type_impl<boost::mpl::size_t<FUN_VAR_REF_ID + n>, Iter> | ||
|  |     { | ||
|  |         typedef Iter iter0; | ||
|  |         BOOST_TYPEOF_DECODE_PARAMS(BOOST_PP_INC(n)) | ||
|  |         typedef BOOST_PP_CAT(p, n)(&type)(BOOST_PP_ENUM_PARAMS(n, p) ...); | ||
|  |         typedef BOOST_PP_CAT(iter, BOOST_PP_INC(n)) iter; | ||
|  |     }; | ||
|  | 
 | ||
|  |     // functions | ||
|  | 
 | ||
|  |     template<class V, class R BOOST_PP_ENUM_TRAILING_PARAMS(n, class P)> | ||
|  |     struct encode_type_impl<V, R(BOOST_PP_ENUM_PARAMS(n, P))> | ||
|  |     { | ||
|  |         typedef R BOOST_PP_CAT(P, n); | ||
|  |         typedef BOOST_TYPEOF_ENCODE_PARAMS(BOOST_PP_INC(n), FUN_ID + n) type; | ||
|  |     }; | ||
|  | 
 | ||
|  |     template<class V, class R BOOST_PP_ENUM_TRAILING_PARAMS(n, class P)> | ||
|  |     struct encode_type_impl<V, R(BOOST_PP_ENUM_PARAMS(n, P) ...)> | ||
|  |     { | ||
|  |         typedef R BOOST_PP_CAT(P, n); | ||
|  |         typedef BOOST_TYPEOF_ENCODE_PARAMS(BOOST_PP_INC(n), FUN_VAR_ID + n) type; | ||
|  |     }; | ||
|  | 
 | ||
|  |     template<class Iter> | ||
|  |     struct decode_type_impl<boost::mpl::size_t<FUN_ID + n>, Iter> | ||
|  |     { | ||
|  |         typedef Iter iter0; | ||
|  |         BOOST_TYPEOF_DECODE_PARAMS(BOOST_PP_INC(n)) | ||
|  |         typedef BOOST_PP_CAT(p, n)(type)(BOOST_PP_ENUM_PARAMS(n, p)); | ||
|  |         typedef BOOST_PP_CAT(iter, BOOST_PP_INC(n)) iter; | ||
|  |     }; | ||
|  | 
 | ||
|  |     template<class Iter> | ||
|  |     struct decode_type_impl<boost::mpl::size_t<FUN_VAR_ID + n>, Iter> | ||
|  |     { | ||
|  |         typedef Iter iter0; | ||
|  |         BOOST_TYPEOF_DECODE_PARAMS(BOOST_PP_INC(n)) | ||
|  |         typedef BOOST_PP_CAT(p, n)(type)(BOOST_PP_ENUM_PARAMS(n, p) ...); | ||
|  |         typedef BOOST_PP_CAT(iter, BOOST_PP_INC(n)) iter; | ||
|  |     }; | ||
|  | 
 | ||
|  | #endif//BOOST_TYPEOF_NO_FUNCTION_TYPES | ||
|  | 
 | ||
|  | #ifndef BOOST_TYPEOF_NO_MEMBER_FUNCTION_TYPES | ||
|  | // member functions | ||
|  | 
 | ||
|  | #define BOOST_TYPEOF_qualifier | ||
|  | #define BOOST_TYPEOF_id MEM_FUN_ID | ||
|  | #include <boost/typeof/register_mem_functions.hpp> | ||
|  | 
 | ||
|  | #define BOOST_TYPEOF_qualifier const | ||
|  | #define BOOST_TYPEOF_id CONST_MEM_FUN_ID | ||
|  | #include <boost/typeof/register_mem_functions.hpp> | ||
|  | 
 | ||
|  | #define BOOST_TYPEOF_qualifier volatile | ||
|  | #define BOOST_TYPEOF_id VOLATILE_MEM_FUN_ID | ||
|  | #include <boost/typeof/register_mem_functions.hpp> | ||
|  | 
 | ||
|  | #define BOOST_TYPEOF_qualifier volatile const | ||
|  | #define BOOST_TYPEOF_id VOLATILE_CONST_MEM_FUN_ID | ||
|  | #include <boost/typeof/register_mem_functions.hpp> | ||
|  | 
 | ||
|  | #undef n | ||
|  | #endif |