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