epoc32/include/stdapis/boost/mpl/aux_/lambda_support.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
#ifndef BOOST_MPL_AUX_LAMBDA_SUPPORT_HPP_INCLUDED
williamr@2
     3
#define BOOST_MPL_AUX_LAMBDA_SUPPORT_HPP_INCLUDED
williamr@2
     4
williamr@2
     5
// Copyright Aleksey Gurtovoy 2001-2004
williamr@2
     6
//
williamr@2
     7
// Distributed under the Boost Software License, Version 1.0. 
williamr@2
     8
// (See accompanying file LICENSE_1_0.txt or copy at 
williamr@2
     9
// http://www.boost.org/LICENSE_1_0.txt)
williamr@2
    10
//
williamr@2
    11
// See http://www.boost.org/libs/mpl for documentation.
williamr@2
    12
williamr@2
    13
// $Source: /cvsroot/boost/boost/boost/mpl/aux_/lambda_support.hpp,v $
williamr@2
    14
// $Date: 2005/08/25 16:27:21 $
williamr@2
    15
// $Revision: 1.13 $
williamr@2
    16
williamr@2
    17
#include <boost/mpl/aux_/config/lambda.hpp>
williamr@2
    18
williamr@2
    19
#if !defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT)
williamr@2
    20
williamr@2
    21
#   define BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(i, name, params) /**/
williamr@2
    22
#   define BOOST_MPL_AUX_LAMBDA_SUPPORT(i,name,params) /**/
williamr@2
    23
williamr@2
    24
#else
williamr@2
    25
williamr@2
    26
#   include <boost/mpl/int_fwd.hpp>
williamr@2
    27
#   include <boost/mpl/aux_/yes_no.hpp>
williamr@2
    28
#   include <boost/mpl/aux_/na_fwd.hpp>
williamr@2
    29
#   include <boost/mpl/aux_/preprocessor/params.hpp>
williamr@2
    30
#   include <boost/mpl/aux_/preprocessor/enum.hpp>
williamr@2
    31
#   include <boost/mpl/aux_/config/msvc.hpp>
williamr@2
    32
#   include <boost/mpl/aux_/config/workaround.hpp>
williamr@2
    33
williamr@2
    34
#   include <boost/preprocessor/tuple/to_list.hpp>
williamr@2
    35
#   include <boost/preprocessor/list/for_each_i.hpp>
williamr@2
    36
#   include <boost/preprocessor/inc.hpp>
williamr@2
    37
#   include <boost/preprocessor/cat.hpp>
williamr@2
    38
williamr@2
    39
#   define BOOST_MPL_AUX_LAMBDA_SUPPORT_ARG_TYPEDEF_FUNC(R,typedef_,i,param) \
williamr@2
    40
    typedef_ param BOOST_PP_CAT(arg,BOOST_PP_INC(i)); \
williamr@2
    41
    /**/
williamr@2
    42
williamr@2
    43
// agurt, 07/mar/03: restore an old revision for the sake of SGI MIPSpro C++
williamr@2
    44
#if BOOST_WORKAROUND(__EDG_VERSION__, <= 238) 
williamr@2
    45
williamr@2
    46
#   define BOOST_MPL_AUX_LAMBDA_SUPPORT(i, name, params) \
williamr@2
    47
    typedef BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::int_<i> arity; \
williamr@2
    48
    BOOST_PP_LIST_FOR_EACH_I_R( \
williamr@2
    49
          1 \
williamr@2
    50
        , BOOST_MPL_AUX_LAMBDA_SUPPORT_ARG_TYPEDEF_FUNC \
williamr@2
    51
        , typedef \
williamr@2
    52
        , BOOST_PP_TUPLE_TO_LIST(i,params) \
williamr@2
    53
        ) \
williamr@2
    54
    struct rebind \
williamr@2
    55
    { \
williamr@2
    56
        template< BOOST_MPL_PP_PARAMS(i,typename U) > struct apply \
williamr@2
    57
            : name< BOOST_MPL_PP_PARAMS(i,U) > \
williamr@2
    58
        { \
williamr@2
    59
        }; \
williamr@2
    60
    }; \
williamr@2
    61
    /**/
williamr@2
    62
williamr@2
    63
#   define BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(i, name, params) \
williamr@2
    64
    BOOST_MPL_AUX_LAMBDA_SUPPORT(i, name, params) \
williamr@2
    65
    /**/
williamr@2
    66
williamr@2
    67
#elif BOOST_WORKAROUND(__EDG_VERSION__, <= 244) && !defined(BOOST_INTEL_CXX_VERSION)
williamr@2
    68
// agurt, 18/jan/03: old EDG-based compilers actually enforce 11.4 para 9
williamr@2
    69
// (in strict mode), so we have to provide an alternative to the 
williamr@2
    70
// MSVC-optimized implementation
williamr@2
    71
williamr@2
    72
#   define BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(i, name, params) \
williamr@2
    73
    typedef BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::int_<i> arity; \
williamr@2
    74
    BOOST_PP_LIST_FOR_EACH_I_R( \
williamr@2
    75
          1 \
williamr@2
    76
        , BOOST_MPL_AUX_LAMBDA_SUPPORT_ARG_TYPEDEF_FUNC \
williamr@2
    77
        , typedef \
williamr@2
    78
        , BOOST_PP_TUPLE_TO_LIST(i,params) \
williamr@2
    79
        ) \
williamr@2
    80
    struct rebind; \
williamr@2
    81
/**/
williamr@2
    82
williamr@2
    83
#   define BOOST_MPL_AUX_LAMBDA_SUPPORT(i, name, params) \
williamr@2
    84
    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(i, name, params) \
williamr@2
    85
}; \
williamr@2
    86
template< BOOST_MPL_PP_PARAMS(i,typename T) > \
williamr@2
    87
struct name<BOOST_MPL_PP_PARAMS(i,T)>::rebind \
williamr@2
    88
{ \
williamr@2
    89
    template< BOOST_MPL_PP_PARAMS(i,typename U) > struct apply \
williamr@2
    90
        : name< BOOST_MPL_PP_PARAMS(i,U) > \
williamr@2
    91
    { \
williamr@2
    92
    }; \
williamr@2
    93
/**/
williamr@2
    94
williamr@2
    95
#else // __EDG_VERSION__
williamr@2
    96
williamr@2
    97
namespace boost { namespace mpl { namespace aux {
williamr@2
    98
template< typename T > struct has_rebind_tag;
williamr@2
    99
}}}
williamr@2
   100
williamr@2
   101
#   define BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(i, name, params) \
williamr@2
   102
    typedef BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::int_<i> arity; \
williamr@2
   103
    BOOST_PP_LIST_FOR_EACH_I_R( \
williamr@2
   104
          1 \
williamr@2
   105
        , BOOST_MPL_AUX_LAMBDA_SUPPORT_ARG_TYPEDEF_FUNC \
williamr@2
   106
        , typedef \
williamr@2
   107
        , BOOST_PP_TUPLE_TO_LIST(i,params) \
williamr@2
   108
        ) \
williamr@2
   109
    friend class BOOST_PP_CAT(name,_rebind); \
williamr@2
   110
    typedef BOOST_PP_CAT(name,_rebind) rebind; \
williamr@2
   111
/**/
williamr@2
   112
williamr@2
   113
#if BOOST_WORKAROUND(__BORLANDC__, < 0x600)
williamr@2
   114
#   define BOOST_MPL_AUX_LAMBDA_SUPPORT_HAS_REBIND(i, name, params) \
williamr@2
   115
template< BOOST_MPL_PP_PARAMS(i,typename T) > \
williamr@2
   116
::boost::mpl::aux::yes_tag operator|( \
williamr@2
   117
      ::boost::mpl::aux::has_rebind_tag<int> \
williamr@2
   118
    , name<BOOST_MPL_PP_PARAMS(i,T)>* \
williamr@2
   119
    ); \
williamr@2
   120
::boost::mpl::aux::no_tag operator|( \
williamr@2
   121
      ::boost::mpl::aux::has_rebind_tag<int> \
williamr@2
   122
    , name< BOOST_MPL_PP_ENUM(i,::boost::mpl::na) >* \
williamr@2
   123
    ); \
williamr@2
   124
/**/
williamr@2
   125
#elif !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
williamr@2
   126
#   define BOOST_MPL_AUX_LAMBDA_SUPPORT_HAS_REBIND(i, name, params) \
williamr@2
   127
template< BOOST_MPL_PP_PARAMS(i,typename T) > \
williamr@2
   128
::boost::mpl::aux::yes_tag operator|( \
williamr@2
   129
      ::boost::mpl::aux::has_rebind_tag<int> \
williamr@2
   130
    , ::boost::mpl::aux::has_rebind_tag< name<BOOST_MPL_PP_PARAMS(i,T)> >* \
williamr@2
   131
    ); \
williamr@2
   132
/**/
williamr@2
   133
#else
williamr@2
   134
#   define BOOST_MPL_AUX_LAMBDA_SUPPORT_HAS_REBIND(i, name, params) /**/
williamr@2
   135
#endif
williamr@2
   136
williamr@2
   137
#   if !defined(__BORLANDC__)
williamr@2
   138
#   define BOOST_MPL_AUX_LAMBDA_SUPPORT(i, name, params) \
williamr@2
   139
    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(i, name, params) \
williamr@2
   140
}; \
williamr@2
   141
BOOST_MPL_AUX_LAMBDA_SUPPORT_HAS_REBIND(i, name, params) \
williamr@2
   142
class BOOST_PP_CAT(name,_rebind) \
williamr@2
   143
{ \
williamr@2
   144
 public: \
williamr@2
   145
    template< BOOST_MPL_PP_PARAMS(i,typename U) > struct apply \
williamr@2
   146
        : name< BOOST_MPL_PP_PARAMS(i,U) > \
williamr@2
   147
    { \
williamr@2
   148
    }; \
williamr@2
   149
/**/
williamr@2
   150
#   else
williamr@2
   151
#   define BOOST_MPL_AUX_LAMBDA_SUPPORT(i, name, params) \
williamr@2
   152
    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(i, name, params) \
williamr@2
   153
}; \
williamr@2
   154
BOOST_MPL_AUX_LAMBDA_SUPPORT_HAS_REBIND(i, name, params) \
williamr@2
   155
class BOOST_PP_CAT(name,_rebind) \
williamr@2
   156
{ \
williamr@2
   157
 public: \
williamr@2
   158
    template< BOOST_MPL_PP_PARAMS(i,typename U) > struct apply \
williamr@2
   159
    { \
williamr@2
   160
        typedef typename name< BOOST_MPL_PP_PARAMS(i,U) >::type type; \
williamr@2
   161
    }; \
williamr@2
   162
/**/
williamr@2
   163
#   endif // __BORLANDC__
williamr@2
   164
williamr@2
   165
#endif // __EDG_VERSION__
williamr@2
   166
williamr@2
   167
#endif // BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT
williamr@2
   168
williamr@2
   169
#endif // BOOST_MPL_AUX_LAMBDA_SUPPORT_HPP_INCLUDED