254 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			254 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | 
 | ||
|  | #if !defined(BOOST_PP_IS_ITERATING) | ||
|  | 
 | ||
|  | ///// header body | ||
|  | 
 | ||
|  | //----------------------------------------------------------------------------- | ||
|  | // boost variant/detail/substitute.hpp header file | ||
|  | // See http://www.boost.org for updates, documentation, and revision history. | ||
|  | //----------------------------------------------------------------------------- | ||
|  | // | ||
|  | // Copyright (c) 2003 | ||
|  | // Eric Friedman | ||
|  | // | ||
|  | // 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_VARIANT_DETAIL_SUBSTITUTE_HPP | ||
|  | #define BOOST_VARIANT_DETAIL_SUBSTITUTE_HPP | ||
|  | 
 | ||
|  | #include <boost/mpl/aux_/config/ctps.hpp> | ||
|  | 
 | ||
|  | #include <boost/variant/detail/substitute_fwd.hpp> | ||
|  | #include <boost/variant/variant_fwd.hpp> // for BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES | ||
|  | #include <boost/mpl/aux_/lambda_arity_param.hpp> | ||
|  | #include <boost/mpl/aux_/preprocessor/params.hpp> | ||
|  | #include <boost/mpl/aux_/preprocessor/repeat.hpp> | ||
|  | #include <boost/mpl/int_fwd.hpp> | ||
|  | #include <boost/mpl/limits/arity.hpp> | ||
|  | #include <boost/preprocessor/cat.hpp> | ||
|  | #include <boost/preprocessor/empty.hpp> | ||
|  | #include <boost/preprocessor/arithmetic/inc.hpp> | ||
|  | #include <boost/preprocessor/iterate.hpp> | ||
|  | 
 | ||
|  | namespace boost { | ||
|  | namespace detail { namespace variant { | ||
|  | 
 | ||
|  | #if !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE) | ||
|  | 
 | ||
|  | /////////////////////////////////////////////////////////////////////////////// | ||
|  | // (detail) metafunction substitute | ||
|  | // | ||
|  | // Substitutes one type for another in the given type expression. | ||
|  | // | ||
|  | 
 | ||
|  | // | ||
|  | // primary template | ||
|  | // | ||
|  | template < | ||
|  |       typename T, typename Dest, typename Source | ||
|  |       BOOST_MPL_AUX_LAMBDA_ARITY_PARAM( | ||
|  |           typename Arity /* = ... (see substitute_fwd.hpp) */ | ||
|  |         ) | ||
|  |     > | ||
|  | struct substitute | ||
|  | { | ||
|  |     typedef T type; | ||
|  | }; | ||
|  | 
 | ||
|  | // | ||
|  | // tag substitution specializations | ||
|  | // | ||
|  | 
 | ||
|  | #define BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(CV_) \ | ||
|  |     template <typename Dest, typename Source> \ | ||
|  |     struct substitute< \ | ||
|  |           CV_ Source \ | ||
|  |         , Dest \ | ||
|  |         , Source \ | ||
|  |           BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>) \ | ||
|  |         > \ | ||
|  |     { \ | ||
|  |         typedef CV_ Dest type; \ | ||
|  |     }; \ | ||
|  |     /**/ | ||
|  | 
 | ||
|  | BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG( BOOST_PP_EMPTY() ) | ||
|  | BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(const) | ||
|  | BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(volatile) | ||
|  | BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(const volatile) | ||
|  | 
 | ||
|  | #undef BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG | ||
|  | 
 | ||
|  | // | ||
|  | // pointer specializations | ||
|  | // | ||
|  | #define BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(CV_) \ | ||
|  |     template <typename T, typename Dest, typename Source> \ | ||
|  |     struct substitute< \ | ||
|  |           T * CV_ \ | ||
|  |         , Dest \ | ||
|  |         , Source \ | ||
|  |           BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>) \ | ||
|  |         > \ | ||
|  |     { \ | ||
|  |         typedef typename substitute< \ | ||
|  |               T, Dest, Source \ | ||
|  |             >::type * CV_ type; \ | ||
|  |     }; \ | ||
|  |     /**/ | ||
|  | 
 | ||
|  | BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER( BOOST_PP_EMPTY() ) | ||
|  | BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(const) | ||
|  | BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(volatile) | ||
|  | BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(const volatile) | ||
|  | 
 | ||
|  | #undef BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER | ||
|  | 
 | ||
|  | // | ||
|  | // reference specializations | ||
|  | // | ||
|  | template <typename T, typename Dest, typename Source> | ||
|  | struct substitute< | ||
|  |       T& | ||
|  |     , Dest | ||
|  |     , Source | ||
|  |       BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>) | ||
|  |     > | ||
|  | { | ||
|  |     typedef typename substitute< | ||
|  |           T, Dest, Source | ||
|  |         >::type & type; | ||
|  | }; | ||
|  | 
 | ||
|  | // | ||
|  | // template expression (i.e., F<...>) specializations | ||
|  | // | ||
|  | 
 | ||
|  | #if !defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES) | ||
|  | template < | ||
|  |       template <typename...> class F | ||
|  |     , typename... Ts | ||
|  |     , typename Dest | ||
|  |     , typename Source | ||
|  |       BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(typename Arity) | ||
|  |     > | ||
|  | struct substitute< | ||
|  |       F<Ts...> | ||
|  |     , Dest | ||
|  |     , Source | ||
|  |       BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(Arity) | ||
|  |     > | ||
|  | { | ||
|  |     typedef F<typename substitute< | ||
|  |           Ts, Dest, Source | ||
|  |         >::type...> type; | ||
|  | }; | ||
|  | #endif // !defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES) | ||
|  | 
 | ||
|  | #define BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF_IMPL(N) \ | ||
|  |     typedef typename substitute< \ | ||
|  |           BOOST_PP_CAT(U,N), Dest, Source \ | ||
|  |         >::type BOOST_PP_CAT(u,N); \ | ||
|  |     /**/ | ||
|  | 
 | ||
|  | #define BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF(z, N, _) \ | ||
|  |     BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF_IMPL( BOOST_PP_INC(N) ) \ | ||
|  |     /**/ | ||
|  | 
 | ||
|  | #define BOOST_PP_ITERATION_LIMITS (0,BOOST_MPL_LIMIT_METAFUNCTION_ARITY) | ||
|  | #define BOOST_PP_FILENAME_1 <boost/variant/detail/substitute.hpp> | ||
|  | #include BOOST_PP_ITERATE() | ||
|  | 
 | ||
|  | #undef BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF_IMPL | ||
|  | #undef BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF | ||
|  | 
 | ||
|  | #endif // !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE) | ||
|  | 
 | ||
|  | }} // namespace detail::variant | ||
|  | } // namespace boost | ||
|  | 
 | ||
|  | #endif // BOOST_VARIANT_DETAIL_SUBSTITUTE_HPP | ||
|  | 
 | ||
|  | ///// iteration, depth == 1 | ||
|  | 
 | ||
|  | #elif BOOST_PP_ITERATION_DEPTH() == 1 | ||
|  | #define i BOOST_PP_FRAME_ITERATION(1) | ||
|  | 
 | ||
|  | #if i > 0 | ||
|  | 
 | ||
|  | // | ||
|  | // template specializations | ||
|  | // | ||
|  | template < | ||
|  |       template < BOOST_MPL_PP_PARAMS(i,typename P) > class T | ||
|  |     , BOOST_MPL_PP_PARAMS(i,typename U) | ||
|  |     , typename Dest | ||
|  |     , typename Source | ||
|  |     > | ||
|  | struct substitute< | ||
|  |       T< BOOST_MPL_PP_PARAMS(i,U) > | ||
|  |     , Dest | ||
|  |     , Source | ||
|  |       BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<( i )>) | ||
|  |     > | ||
|  | { | ||
|  | private: | ||
|  |     BOOST_MPL_PP_REPEAT(i, BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF, _) | ||
|  | 
 | ||
|  | public: | ||
|  |     typedef T< BOOST_MPL_PP_PARAMS(i,u) > type; | ||
|  | }; | ||
|  | 
 | ||
|  | // | ||
|  | // function specializations | ||
|  | // | ||
|  | template < | ||
|  |       typename R | ||
|  |     , BOOST_MPL_PP_PARAMS(i,typename U) | ||
|  |     , typename Dest | ||
|  |     , typename Source | ||
|  |     > | ||
|  | struct substitute< | ||
|  |       R (*)( BOOST_MPL_PP_PARAMS(i,U) ) | ||
|  |     , Dest | ||
|  |     , Source | ||
|  |       BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>) | ||
|  |     > | ||
|  | { | ||
|  | private: | ||
|  |     typedef typename substitute< R, Dest, Source >::type r; | ||
|  |     BOOST_MPL_PP_REPEAT(i, BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF, _) | ||
|  | 
 | ||
|  | public: | ||
|  |     typedef r (*type)( BOOST_MPL_PP_PARAMS(i,u) ); | ||
|  | }; | ||
|  | 
 | ||
|  | #elif i == 0 | ||
|  | 
 | ||
|  | // | ||
|  | // zero-arg function specialization | ||
|  | // | ||
|  | template < | ||
|  |       typename R, typename Dest, typename Source | ||
|  |     > | ||
|  | struct substitute< | ||
|  |       R (*)( void ) | ||
|  |     , Dest | ||
|  |     , Source | ||
|  |       BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>) | ||
|  |     > | ||
|  | { | ||
|  | private: | ||
|  |     typedef typename substitute< R, Dest, Source >::type r; | ||
|  | 
 | ||
|  | public: | ||
|  |     typedef r (*type)( void ); | ||
|  | }; | ||
|  | 
 | ||
|  | #endif // i | ||
|  | 
 | ||
|  | #undef i | ||
|  | #endif // BOOST_PP_IS_ITERATING |