150 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			150 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | // Copyright (C) 2005 Peder Holt | ||
|  | // Copyright (C) 2005 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) | ||
|  | 
 | ||
|  | #ifndef BOOST_TYPEOF_TEMPLATE_TEMPLATE_PARAM_HPP_INCLUDED | ||
|  | #define BOOST_TYPEOF_TEMPLATE_TEMPLATE_PARAM_HPP_INCLUDED | ||
|  | 
 | ||
|  | #include <boost/preprocessor/logical/or.hpp> | ||
|  | #include <boost/preprocessor/seq/fold_left.hpp> | ||
|  | #include <boost/preprocessor/seq/enum.hpp> | ||
|  | 
 | ||
|  | #define BOOST_TYPEOF_MAKE_OBJ_template(x)   BOOST_TYPEOF_TEMPLATE_PARAM(x) | ||
|  | #define BOOST_TYPEOF_TEMPLATE(X) template(X) BOOST_TYPEOF_EAT | ||
|  | #define BOOST_TYPEOF_template(X) (template(X)) | ||
|  | 
 | ||
|  | #define BOOST_TYPEOF_TEMPLATE_PARAM(Params)\ | ||
|  |     (TEMPLATE_PARAM)\ | ||
|  |     (Params) | ||
|  | 
 | ||
|  | #define BOOST_TYPEOF_TEMPLATE_PARAM_GETPARAMS(This)\ | ||
|  |     BOOST_TYPEOF_TOSEQ(BOOST_PP_SEQ_ELEM(1, This)) | ||
|  | 
 | ||
|  | //Encode / decode this | ||
|  | #define BOOST_TYPEOF_TEMPLATE_PARAM_ENCODE(This, n)\ | ||
|  |    typedef typename boost::type_of::encode_template<BOOST_PP_CAT(V, n),\ | ||
|  |        BOOST_PP_CAT(P, n)<BOOST_TYPEOF_SEQ_ENUM(BOOST_TYPEOF_MAKE_OBJS(BOOST_TYPEOF_TEMPLATE_PARAM_GETPARAMS(This)),BOOST_TYPEOF_PLACEHOLDER) >\ | ||
|  |    >::type BOOST_PP_CAT(V, BOOST_PP_INC(n)); | ||
|  | 
 | ||
|  | #define BOOST_TYPEOF_TEMPLATE_PARAM_DECODE(This, n)\ | ||
|  |    typedef boost::type_of::decode_template< BOOST_PP_CAT(iter, n) > BOOST_PP_CAT(d, n);\ | ||
|  |    typedef typename BOOST_PP_CAT(d, n)::type BOOST_PP_CAT(P, n);\ | ||
|  |    typedef typename BOOST_PP_CAT(d, n)::iter BOOST_PP_CAT(iter,BOOST_PP_INC(n)); | ||
|  | 
 | ||
|  | // template<class, unsigned int, ...> class | ||
|  | #define BOOST_TYPEOF_TEMPLATE_PARAM_EXPANDTYPE(This) \ | ||
|  |     template <BOOST_PP_SEQ_ENUM(BOOST_TYPEOF_TEMPLATE_PARAM_GETPARAMS(This)) > class | ||
|  | 
 | ||
|  | #define BOOST_TYPEOF_TEMPLATE_PARAM_PLACEHOLDER(Param)\ | ||
|  |     Nested_Template_Template_Arguments_Not_Supported | ||
|  | 
 | ||
|  | //'template<class,int> class' is reduced to 'class' | ||
|  | #define BOOST_TYPEOF_TEMPLATE_PARAM_DECLARATION_TYPE(Param) class | ||
|  | 
 | ||
|  | // T3<int, (unsigned int)0, ...> | ||
|  | #define BOOST_TYPEOF_TEMPLATE_PARAM_PLACEHOLDER_TYPES(Param, n)\ | ||
|  |     BOOST_PP_CAT(T,n)<BOOST_TYPEOF_SEQ_ENUM_1(BOOST_TYPEOF_MAKE_OBJS(BOOST_TYPEOF_TEMPLATE_PARAM_GETPARAMS(Param)),BOOST_TYPEOF_PLACEHOLDER) > | ||
|  | 
 | ||
|  | #define BOOST_TYPEOF_TEMPLATE_PARAM_ISTEMPLATE 1 | ||
|  | 
 | ||
|  | //////////////////////////// | ||
|  | // move to encode_decode? | ||
|  | 
 | ||
|  | BOOST_TYPEOF_BEGIN_ENCODE_NS | ||
|  | 
 | ||
|  | template<class V, class Type_Not_Registered_With_Typeof_System> struct encode_template_impl; | ||
|  | template<class T, class Iter> struct decode_template_impl; | ||
|  | 
 | ||
|  | BOOST_TYPEOF_END_ENCODE_NS | ||
|  | 
 | ||
|  | namespace boost { namespace type_of { | ||
|  | 
 | ||
|  |     template<class V, class T> struct encode_template | ||
|  |         : BOOST_TYPEOF_ENCODE_NS_QUALIFIER::encode_template_impl<V, T> | ||
|  |     {}; | ||
|  | 
 | ||
|  |     template<class Iter> struct decode_template | ||
|  |         : BOOST_TYPEOF_ENCODE_NS_QUALIFIER::decode_template_impl<typename Iter::type, typename Iter::next> | ||
|  |     {}; | ||
|  | }} | ||
|  | 
 | ||
|  | //////////////////////////// | ||
|  | // move to template_encoding.hpp? | ||
|  | 
 | ||
|  | //Template template registration | ||
|  | #define BOOST_TYPEOF_REGISTER_TYPE_FOR_TEMPLATE_TEMPLATE(Name,Params,ID)\ | ||
|  |     template<class V\ | ||
|  |         BOOST_TYPEOF_SEQ_ENUM_TRAILING(Params,BOOST_TYPEOF_REGISTER_TEMPLATE_PARAM_PAIR)\ | ||
|  |     >\ | ||
|  |     struct encode_template_impl<V,Name<\ | ||
|  |         BOOST_PP_ENUM_PARAMS(\ | ||
|  |         BOOST_PP_SEQ_SIZE(Params),\ | ||
|  |         P)> >\ | ||
|  |         : boost::type_of::push_back<V, boost::mpl::size_t<ID> >\ | ||
|  |     {\ | ||
|  |     };\ | ||
|  |     template<class Iter> struct decode_template_impl<boost::mpl::size_t<ID>, Iter>\ | ||
|  |     {\ | ||
|  |         BOOST_PP_REPEAT(BOOST_PP_SEQ_SIZE(Params),BOOST_TYPEOF_TYPEDEF_INT_PN,_)\ | ||
|  |         typedef Name<BOOST_TYPEOF_SEQ_ENUM(Params,BOOST_TYPEOF_PLACEHOLDER) > type;\ | ||
|  |         typedef Iter iter;\ | ||
|  |     }; | ||
|  | 
 | ||
|  | #define BOOST_TYPEOF_TYPEDEF_INT_PN(z,n,Params) typedef int BOOST_PP_CAT(P,n); | ||
|  | 
 | ||
|  | #ifdef __BORLANDC__ | ||
|  | #define BOOST_TYPEOF_DECODE_NESTED_TEMPLATE_HELPER_NAME BOOST_PP_CAT(\ | ||
|  |         BOOST_PP_CAT(\ | ||
|  |             BOOST_PP_CAT(\ | ||
|  |                 decode_nested_template_helper,\ | ||
|  |                 BOOST_TYPEOF_REGISTRATION_GROUP\ | ||
|  |             ),0x10000\ | ||
|  |         ),__LINE__\ | ||
|  |     ) | ||
|  | #define BOOST_TYPEOF_REGISTER_DECODE_NESTED_TEMPLATE_HELPER_IMPL(Name,Params,ID)\ | ||
|  |     struct BOOST_TYPEOF_DECODE_NESTED_TEMPLATE_HELPER_NAME {\ | ||
|  |         template<BOOST_TYPEOF_SEQ_ENUM(Params,BOOST_TYPEOF_REGISTER_DECLARE_DECODER_TYPE_PARAM_PAIR) >\ | ||
|  |         struct decode_params;\ | ||
|  |         template<BOOST_TYPEOF_SEQ_ENUM(Params,BOOST_TYPEOF_REGISTER_DECODER_TYPE_PARAM_PAIR) >\ | ||
|  |         struct decode_params<BOOST_TYPEOF_SEQ_ENUM(Params,BOOST_TYPEOF_PLACEHOLDER_TYPES) >\ | ||
|  |         {\ | ||
|  |             typedef Name<BOOST_PP_ENUM_PARAMS(BOOST_PP_SEQ_SIZE(Params),T)> type;\ | ||
|  |         };\ | ||
|  |     }; | ||
|  | //Template template param decoding | ||
|  | #define BOOST_TYPEOF_TYPEDEF_DECODED_TEMPLATE_TEMPLATE_TYPE(Name,Params)\ | ||
|  |     typedef typename BOOST_TYPEOF_DECODE_NESTED_TEMPLATE_HELPER_NAME::decode_params<BOOST_PP_ENUM_PARAMS(BOOST_PP_SEQ_SIZE(Params),P)>::type type; | ||
|  | 
 | ||
|  | #else | ||
|  | #define BOOST_TYPEOF_REGISTER_DECODE_NESTED_TEMPLATE_HELPER_IMPL(Name,Params,ID) | ||
|  | 
 | ||
|  | //Template template param decoding | ||
|  | #define BOOST_TYPEOF_TYPEDEF_DECODED_TEMPLATE_TEMPLATE_TYPE(Name,Params)\ | ||
|  |     template<BOOST_TYPEOF_SEQ_ENUM(Params,BOOST_TYPEOF_REGISTER_DECLARE_DECODER_TYPE_PARAM_PAIR) >\ | ||
|  |     struct decode_params;\ | ||
|  |     template<BOOST_TYPEOF_SEQ_ENUM(Params,BOOST_TYPEOF_REGISTER_DECODER_TYPE_PARAM_PAIR) >\ | ||
|  |     struct decode_params<BOOST_TYPEOF_SEQ_ENUM(Params,BOOST_TYPEOF_PLACEHOLDER_TYPES) >\ | ||
|  |     {\ | ||
|  |         typedef Name<BOOST_PP_ENUM_PARAMS(BOOST_PP_SEQ_SIZE(Params),T)> type;\ | ||
|  |     };\ | ||
|  |     typedef typename decode_params<BOOST_PP_ENUM_PARAMS(BOOST_PP_SEQ_SIZE(Params),P)>::type type; | ||
|  | #endif | ||
|  | #define BOOST_TYPEOF_REGISTER_DECLARE_DECODER_TYPE_PARAM_PAIR(z,n,elem) \ | ||
|  |     BOOST_TYPEOF_VIRTUAL(DECLARATION_TYPE, elem)(elem) BOOST_PP_CAT(T, n) | ||
|  | 
 | ||
|  | // BOOST_TYPEOF_HAS_TEMPLATES | ||
|  | #define BOOST_TYPEOF_HAS_TEMPLATES(Params)\ | ||
|  |     BOOST_PP_SEQ_FOLD_LEFT(BOOST_TYPEOF_HAS_TEMPLATES_OP, 0, Params) | ||
|  | 
 | ||
|  | #define BOOST_TYPEOF_HAS_TEMPLATES_OP(s, state, elem)\ | ||
|  |     BOOST_PP_OR(state, BOOST_TYPEOF_VIRTUAL(ISTEMPLATE, elem)) | ||
|  | 
 | ||
|  | //Define template template arguments | ||
|  | #define BOOST_TYPEOF_REGISTER_TEMPLATE_TEMPLATE_IMPL(Name,Params,ID)\ | ||
|  |     BOOST_PP_IF(BOOST_TYPEOF_HAS_TEMPLATES(Params),\ | ||
|  |         BOOST_TYPEOF_REGISTER_DECODE_NESTED_TEMPLATE_HELPER_IMPL,\ | ||
|  |         BOOST_TYPEOF_REGISTER_TYPE_FOR_TEMPLATE_TEMPLATE)(Name,Params,ID) | ||
|  | 
 | ||
|  | #endif //BOOST_TYPEOF_TEMPLATE_TEMPLATE_PARAM_HPP_INCLUDED |