| 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
 |