epoc32/include/stdapis/boost/variant/detail/substitute.hpp
branchSymbian2
changeset 2 2fe1408b6811
equal deleted inserted replaced
1:666f914201fb 2:2fe1408b6811
       
     1 
       
     2 #if !defined(BOOST_PP_IS_ITERATING)
       
     3 
       
     4 ///// header body
       
     5 
       
     6 //-----------------------------------------------------------------------------
       
     7 // boost variant/detail/substitute.hpp header file
       
     8 // See http://www.boost.org for updates, documentation, and revision history.
       
     9 //-----------------------------------------------------------------------------
       
    10 //
       
    11 // Copyright (c) 2003
       
    12 // Eric Friedman
       
    13 //
       
    14 // Distributed under the Boost Software License, Version 1.0. (See
       
    15 // accompanying file LICENSE_1_0.txt or copy at
       
    16 // http://www.boost.org/LICENSE_1_0.txt)
       
    17 
       
    18 #ifndef BOOST_VARIANT_DETAIL_SUBSTITUTE_HPP
       
    19 #define BOOST_VARIANT_DETAIL_SUBSTITUTE_HPP
       
    20 
       
    21 #include "boost/mpl/aux_/config/ctps.hpp"
       
    22 
       
    23 #include "boost/variant/detail/substitute_fwd.hpp"
       
    24 #include "boost/mpl/aux_/lambda_arity_param.hpp"
       
    25 #include "boost/mpl/aux_/preprocessor/params.hpp"
       
    26 #include "boost/mpl/aux_/preprocessor/repeat.hpp"
       
    27 #include "boost/mpl/int_fwd.hpp"
       
    28 #include "boost/mpl/limits/arity.hpp"
       
    29 #include "boost/preprocessor/cat.hpp"
       
    30 #include "boost/preprocessor/empty.hpp"
       
    31 #include "boost/preprocessor/arithmetic/inc.hpp"
       
    32 #include "boost/preprocessor/iterate.hpp"
       
    33 
       
    34 namespace boost {
       
    35 namespace detail { namespace variant {
       
    36 
       
    37 #if !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
       
    38 
       
    39 ///////////////////////////////////////////////////////////////////////////////
       
    40 // (detail) metafunction substitute
       
    41 //
       
    42 // Substitutes one type for another in the given type expression.
       
    43 //
       
    44 
       
    45 //
       
    46 // primary template
       
    47 //
       
    48 template <
       
    49       typename T, typename Dest, typename Source
       
    50       BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(
       
    51           typename Arity /* = ... (see substitute_fwd.hpp) */
       
    52         )
       
    53     >
       
    54 struct substitute
       
    55 {
       
    56     typedef T type;
       
    57 };
       
    58 
       
    59 //
       
    60 // tag substitution specializations
       
    61 //
       
    62 
       
    63 #define BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(CV_) \
       
    64     template <typename Dest, typename Source> \
       
    65     struct substitute< \
       
    66           CV_ Source \
       
    67         , Dest \
       
    68         , Source \
       
    69           BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>) \
       
    70         > \
       
    71     { \
       
    72         typedef CV_ Dest type; \
       
    73     }; \
       
    74     /**/
       
    75 
       
    76 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG( BOOST_PP_EMPTY() )
       
    77 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(const)
       
    78 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(volatile)
       
    79 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(const volatile)
       
    80 
       
    81 #undef BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG
       
    82 
       
    83 //
       
    84 // pointer specializations
       
    85 //
       
    86 #define BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(CV_) \
       
    87     template <typename T, typename Dest, typename Source> \
       
    88     struct substitute< \
       
    89           T * CV_ \
       
    90         , Dest \
       
    91         , Source \
       
    92           BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>) \
       
    93         > \
       
    94     { \
       
    95         typedef typename substitute< \
       
    96               T, Dest, Source \
       
    97             >::type * CV_ type; \
       
    98     }; \
       
    99     /**/
       
   100 
       
   101 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER( BOOST_PP_EMPTY() )
       
   102 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(const)
       
   103 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(volatile)
       
   104 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(const volatile)
       
   105 
       
   106 #undef BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER
       
   107 
       
   108 //
       
   109 // reference specializations
       
   110 //
       
   111 template <typename T, typename Dest, typename Source>
       
   112 struct substitute<
       
   113       T&
       
   114     , Dest
       
   115     , Source
       
   116       BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>)
       
   117     >
       
   118 {
       
   119     typedef typename substitute<
       
   120           T, Dest, Source
       
   121         >::type & type;
       
   122 };
       
   123 
       
   124 //
       
   125 // template expression (i.e., F<...>) specializations
       
   126 //
       
   127 
       
   128 #define BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF_IMPL(N) \
       
   129     typedef typename substitute< \
       
   130           BOOST_PP_CAT(U,N), Dest, Source \
       
   131         >::type BOOST_PP_CAT(u,N); \
       
   132     /**/
       
   133 
       
   134 #define BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF(z, N, _) \
       
   135     BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF_IMPL( BOOST_PP_INC(N) ) \
       
   136     /**/
       
   137 
       
   138 #define BOOST_PP_ITERATION_LIMITS (0,BOOST_MPL_LIMIT_METAFUNCTION_ARITY)
       
   139 #define BOOST_PP_FILENAME_1 "boost/variant/detail/substitute.hpp"
       
   140 #include BOOST_PP_ITERATE()
       
   141 
       
   142 #undef BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF_IMPL
       
   143 #undef BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF
       
   144 
       
   145 #endif // !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
       
   146 
       
   147 }} // namespace detail::variant
       
   148 } // namespace boost
       
   149 
       
   150 #endif // BOOST_VARIANT_DETAIL_SUBSTITUTE_HPP
       
   151 
       
   152 ///// iteration, depth == 1
       
   153 
       
   154 #elif BOOST_PP_ITERATION_DEPTH() == 1
       
   155 #define i BOOST_PP_FRAME_ITERATION(1)
       
   156 
       
   157 #if i > 0
       
   158 
       
   159 //
       
   160 // template specializations
       
   161 //
       
   162 template <
       
   163       template < BOOST_MPL_PP_PARAMS(i,typename P) > class T
       
   164     , BOOST_MPL_PP_PARAMS(i,typename U)
       
   165     , typename Dest
       
   166     , typename Source
       
   167     >
       
   168 struct substitute<
       
   169       T< BOOST_MPL_PP_PARAMS(i,U) >
       
   170     , Dest
       
   171     , Source
       
   172       BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<( i )>)
       
   173     >
       
   174 {
       
   175 private:
       
   176     BOOST_MPL_PP_REPEAT(i, BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF, _)
       
   177 
       
   178 public:
       
   179     typedef T< BOOST_MPL_PP_PARAMS(i,u) > type;
       
   180 };
       
   181 
       
   182 //
       
   183 // function specializations
       
   184 //
       
   185 template <
       
   186       typename R
       
   187     , BOOST_MPL_PP_PARAMS(i,typename U)
       
   188     , typename Dest
       
   189     , typename Source
       
   190     >
       
   191 struct substitute<
       
   192       R (*)( BOOST_MPL_PP_PARAMS(i,U) )
       
   193     , Dest
       
   194     , Source
       
   195       BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>)
       
   196     >
       
   197 {
       
   198 private:
       
   199     typedef typename substitute< R, Dest, Source >::type r;
       
   200     BOOST_MPL_PP_REPEAT(i, BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF, _)
       
   201 
       
   202 public:
       
   203     typedef r (*type)( BOOST_MPL_PP_PARAMS(i,u) );
       
   204 };
       
   205 
       
   206 #elif i == 0
       
   207 
       
   208 //
       
   209 // zero-arg function specialization
       
   210 //
       
   211 template <
       
   212       typename R, typename Dest, typename Source
       
   213     >
       
   214 struct substitute<
       
   215       R (*)( void )
       
   216     , Dest
       
   217     , Source
       
   218       BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>)
       
   219     >
       
   220 {
       
   221 private:
       
   222     typedef typename substitute< R, Dest, Source >::type r;
       
   223 
       
   224 public:
       
   225     typedef r (*type)( void );
       
   226 };
       
   227 
       
   228 #endif // i
       
   229 
       
   230 #undef i
       
   231 #endif // BOOST_PP_IS_ITERATING