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
 | 
