123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279 |
- #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;
- };
- //
- // function specializations
- //
- template <
- typename R
- , typename... A
- , typename Dest
- , typename Source
- >
- struct substitute<
- R (*)(A...)
- , Dest
- , Source
- BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>)
- >
- {
- private:
- typedef typename substitute< R, Dest, Source >::type r;
- public:
- typedef r (*type)(typename substitute<
- A, Dest, Source
- >::type...);
- };
- #else
- #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_DO_NOT_USE_VARIADIC_TEMPLATES)
- #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
|