epoc32/include/stdapis/boost/mpl/aux_/full_lambda.hpp
branchSymbian3
changeset 4 837f303aceeb
parent 3 e1b950c65cb4
     1.1 --- a/epoc32/include/stdapis/boost/mpl/aux_/full_lambda.hpp	Wed Mar 31 12:27:01 2010 +0100
     1.2 +++ b/epoc32/include/stdapis/boost/mpl/aux_/full_lambda.hpp	Wed Mar 31 12:33:34 2010 +0100
     1.3 @@ -1,3 +1,10 @@
     1.4 +
     1.5 +#if !defined(BOOST_PP_IS_ITERATING)
     1.6 +
     1.7 +///// header body
     1.8 +
     1.9 +#ifndef BOOST_MPL_AUX_FULL_LAMBDA_HPP_INCLUDED
    1.10 +#define BOOST_MPL_AUX_FULL_LAMBDA_HPP_INCLUDED
    1.11  
    1.12  // Copyright Aleksey Gurtovoy 2001-2004
    1.13  //
    1.14 @@ -5,17 +12,80 @@
    1.15  // (See accompanying file LICENSE_1_0.txt or copy at 
    1.16  // http://www.boost.org/LICENSE_1_0.txt)
    1.17  //
    1.18 +// See http://www.boost.org/libs/mpl for documentation.
    1.19  
    1.20 -// Preprocessed version of "boost/mpl/aux_/full_lambda.hpp" header
    1.21 -// -- DO NOT modify by hand!
    1.22 +// $Source: /cvsroot/boost/boost/boost/mpl/aux_/full_lambda.hpp,v $
    1.23 +// $Date: 2004/09/04 01:10:19 $
    1.24 +// $Revision: 1.14 $
    1.25 +
    1.26 +#if !defined(BOOST_MPL_PREPROCESSING_MODE)
    1.27 +#   include <boost/mpl/lambda_fwd.hpp>
    1.28 +#   include <boost/mpl/bind_fwd.hpp>
    1.29 +#   include <boost/mpl/protect.hpp>
    1.30 +#   include <boost/mpl/quote.hpp>
    1.31 +#   include <boost/mpl/arg.hpp>
    1.32 +#   include <boost/mpl/bool.hpp>
    1.33 +#   include <boost/mpl/int_fwd.hpp>
    1.34 +#   include <boost/mpl/aux_/template_arity.hpp>
    1.35 +#   include <boost/mpl/aux_/na_spec.hpp>
    1.36 +#   include <boost/mpl/aux_/config/ttp.hpp>
    1.37 +#   if defined(BOOST_MPL_CFG_EXTENDED_TEMPLATE_PARAMETERS_MATCHING)
    1.38 +#       include <boost/mpl/if.hpp>
    1.39 +#   endif
    1.40 +#endif
    1.41 +
    1.42 +#include <boost/mpl/aux_/lambda_arity_param.hpp>
    1.43 +#include <boost/mpl/aux_/config/use_preprocessed.hpp>
    1.44 +
    1.45 +#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
    1.46 +    && !defined(BOOST_MPL_PREPROCESSING_MODE)
    1.47 +
    1.48 +#   define BOOST_MPL_PREPROCESSED_HEADER full_lambda.hpp
    1.49 +#   include <boost/mpl/aux_/include_preprocessed.hpp>
    1.50 +
    1.51 +#else
    1.52 +
    1.53 +#   include <boost/mpl/limits/arity.hpp>
    1.54 +#   include <boost/mpl/aux_/preprocessor/default_params.hpp>
    1.55 +#   include <boost/mpl/aux_/preprocessor/params.hpp>
    1.56 +#   include <boost/mpl/aux_/preprocessor/enum.hpp>
    1.57 +#   include <boost/mpl/aux_/preprocessor/repeat.hpp>
    1.58 +#   include <boost/mpl/aux_/config/dmc_ambiguous_ctps.hpp>
    1.59 +
    1.60 +#   include <boost/preprocessor/iterate.hpp>
    1.61 +#   include <boost/preprocessor/comma_if.hpp>
    1.62 +#   include <boost/preprocessor/inc.hpp>
    1.63 +#   include <boost/preprocessor/cat.hpp>
    1.64  
    1.65  namespace boost { namespace mpl {
    1.66  
    1.67 +// local macros, #undef-ined at the end of the header
    1.68 +#   define AUX778076_LAMBDA_PARAMS(i_, param) \
    1.69 +    BOOST_MPL_PP_PARAMS(i_, param) \
    1.70 +    /**/
    1.71 +
    1.72 +#   define AUX778076_BIND_PARAMS(param) \
    1.73 +    BOOST_MPL_PP_PARAMS( \
    1.74 +          BOOST_MPL_LIMIT_METAFUNCTION_ARITY \
    1.75 +        , param \
    1.76 +        ) \
    1.77 +    /**/
    1.78 +
    1.79 +#   define AUX778076_BIND_N_PARAMS(i_, param) \
    1.80 +    BOOST_PP_COMMA_IF(i_) \
    1.81 +    BOOST_MPL_PP_PARAMS(i_, param) \
    1.82 +    /**/
    1.83 +
    1.84 +#   define AUX778076_ARITY_PARAM(param) \
    1.85 +    BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(param) \
    1.86 +    /**/
    1.87 +
    1.88 +
    1.89 +#define n_ BOOST_MPL_LIMIT_METAFUNCTION_ARITY
    1.90  namespace aux {
    1.91  
    1.92  template<
    1.93 -      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false
    1.94 -    , bool C5 = false
    1.95 +      BOOST_MPL_PP_DEFAULT_PARAMS(n_,bool C,false)
    1.96      >
    1.97  struct lambda_or
    1.98      : true_
    1.99 @@ -23,17 +93,18 @@
   1.100  };
   1.101  
   1.102  template<>
   1.103 -struct lambda_or< false,false,false,false,false >
   1.104 +struct lambda_or< BOOST_MPL_PP_ENUM(n_,false) >
   1.105      : false_
   1.106  {
   1.107  };
   1.108  
   1.109  } // namespace aux
   1.110 +#undef n_
   1.111  
   1.112  template<
   1.113        typename T
   1.114      , typename Tag
   1.115 -   
   1.116 +    AUX778076_ARITY_PARAM(typename Arity)
   1.117      >
   1.118  struct lambda
   1.119  {
   1.120 @@ -50,462 +121,23 @@
   1.121  {
   1.122  };
   1.123  
   1.124 +
   1.125  template< int N, typename Tag >
   1.126 -struct lambda< arg<N>, Tag >
   1.127 +struct lambda< arg<N>,Tag AUX778076_ARITY_PARAM(int_<-1>) >
   1.128  {
   1.129      typedef true_ is_le;
   1.130      typedef mpl::arg<N> result_; // qualified for the sake of MIPSpro 7.41
   1.131 -    typedef mpl::protect<result_> type;
   1.132 +    typedef mpl::protect<result_> type; 
   1.133  };
   1.134  
   1.135 -template<
   1.136 -      typename F
   1.137 -    , typename Tag
   1.138 -    >
   1.139 -struct lambda<
   1.140 -          bind0<F>
   1.141 -        , Tag
   1.142 -       
   1.143 -        >
   1.144 -{
   1.145 -    typedef false_ is_le;
   1.146 -    typedef bind0<
   1.147 -          F
   1.148 -        > result_;
   1.149  
   1.150 -    typedef result_ type;
   1.151 -};
   1.152 -
   1.153 -namespace aux {
   1.154 -
   1.155 -template<
   1.156 -      typename IsLE, typename Tag
   1.157 -    , template< typename P1 > class F
   1.158 -    , typename L1
   1.159 -    >
   1.160 -struct le_result1
   1.161 -{
   1.162 -    typedef F<
   1.163 -          typename L1::type
   1.164 -        > result_;
   1.165 -
   1.166 -    typedef result_ type;
   1.167 -};
   1.168 -
   1.169 -template<
   1.170 -      typename Tag
   1.171 -    , template< typename P1 > class F
   1.172 -    , typename L1
   1.173 -    >
   1.174 -struct le_result1< true_,Tag,F,L1 >
   1.175 -{
   1.176 -    typedef bind1<
   1.177 -          quote1< F,Tag >
   1.178 -        , typename L1::result_
   1.179 -        > result_;
   1.180 -
   1.181 -    typedef mpl::protect<result_> type;
   1.182 -};
   1.183 -
   1.184 -} // namespace aux
   1.185 -
   1.186 -template<
   1.187 -      template< typename P1 > class F
   1.188 -    , typename T1
   1.189 -    , typename Tag
   1.190 -    >
   1.191 -struct lambda<
   1.192 -          F<T1>
   1.193 -        , Tag
   1.194 -       
   1.195 -        >
   1.196 -{
   1.197 -    typedef lambda< T1,Tag > l1;
   1.198 -    typedef typename l1::is_le is_le1;
   1.199 -    typedef typename aux::lambda_or<
   1.200 -          is_le1::value
   1.201 -        >::type is_le;
   1.202 -
   1.203 -    typedef aux::le_result1<
   1.204 -          is_le, Tag, F, l1
   1.205 -        > le_result_;
   1.206 -
   1.207 -    typedef typename le_result_::result_ result_;
   1.208 -    typedef typename le_result_::type type;
   1.209 -};
   1.210 -
   1.211 -template<
   1.212 -      typename F, typename T1
   1.213 -    , typename Tag
   1.214 -    >
   1.215 -struct lambda<
   1.216 -          bind1< F,T1 >
   1.217 -        , Tag
   1.218 -       
   1.219 -        >
   1.220 -{
   1.221 -    typedef false_ is_le;
   1.222 -    typedef bind1<
   1.223 -          F
   1.224 -        , T1
   1.225 -        > result_;
   1.226 -
   1.227 -    typedef result_ type;
   1.228 -};
   1.229 -
   1.230 -namespace aux {
   1.231 -
   1.232 -template<
   1.233 -      typename IsLE, typename Tag
   1.234 -    , template< typename P1, typename P2 > class F
   1.235 -    , typename L1, typename L2
   1.236 -    >
   1.237 -struct le_result2
   1.238 -{
   1.239 -    typedef F<
   1.240 -          typename L1::type, typename L2::type
   1.241 -        > result_;
   1.242 -
   1.243 -    typedef result_ type;
   1.244 -};
   1.245 -
   1.246 -template<
   1.247 -      typename Tag
   1.248 -    , template< typename P1, typename P2 > class F
   1.249 -    , typename L1, typename L2
   1.250 -    >
   1.251 -struct le_result2< true_,Tag,F,L1,L2 >
   1.252 -{
   1.253 -    typedef bind2<
   1.254 -          quote2< F,Tag >
   1.255 -        , typename L1::result_, typename L2::result_
   1.256 -        > result_;
   1.257 -
   1.258 -    typedef mpl::protect<result_> type;
   1.259 -};
   1.260 -
   1.261 -} // namespace aux
   1.262 -
   1.263 -template<
   1.264 -      template< typename P1, typename P2 > class F
   1.265 -    , typename T1, typename T2
   1.266 -    , typename Tag
   1.267 -    >
   1.268 -struct lambda<
   1.269 -          F< T1,T2 >
   1.270 -        , Tag
   1.271 -       
   1.272 -        >
   1.273 -{
   1.274 -    typedef lambda< T1,Tag > l1;
   1.275 -    typedef lambda< T2,Tag > l2;
   1.276 -    
   1.277 -    typedef typename l1::is_le is_le1;
   1.278 -    typedef typename l2::is_le is_le2;
   1.279 -    
   1.280 -
   1.281 -    typedef typename aux::lambda_or<
   1.282 -          is_le1::value, is_le2::value
   1.283 -        >::type is_le;
   1.284 -
   1.285 -    typedef aux::le_result2<
   1.286 -          is_le, Tag, F, l1, l2
   1.287 -        > le_result_;
   1.288 -
   1.289 -    typedef typename le_result_::result_ result_;
   1.290 -    typedef typename le_result_::type type;
   1.291 -};
   1.292 -
   1.293 -template<
   1.294 -      typename F, typename T1, typename T2
   1.295 -    , typename Tag
   1.296 -    >
   1.297 -struct lambda<
   1.298 -          bind2< F,T1,T2 >
   1.299 -        , Tag
   1.300 -       
   1.301 -        >
   1.302 -{
   1.303 -    typedef false_ is_le;
   1.304 -    typedef bind2<
   1.305 -          F
   1.306 -        , T1, T2
   1.307 -        > result_;
   1.308 -
   1.309 -    typedef result_ type;
   1.310 -};
   1.311 -
   1.312 -namespace aux {
   1.313 -
   1.314 -template<
   1.315 -      typename IsLE, typename Tag
   1.316 -    , template< typename P1, typename P2, typename P3 > class F
   1.317 -    , typename L1, typename L2, typename L3
   1.318 -    >
   1.319 -struct le_result3
   1.320 -{
   1.321 -    typedef F<
   1.322 -          typename L1::type, typename L2::type, typename L3::type
   1.323 -        > result_;
   1.324 -
   1.325 -    typedef result_ type;
   1.326 -};
   1.327 -
   1.328 -template<
   1.329 -      typename Tag
   1.330 -    , template< typename P1, typename P2, typename P3 > class F
   1.331 -    , typename L1, typename L2, typename L3
   1.332 -    >
   1.333 -struct le_result3< true_,Tag,F,L1,L2,L3 >
   1.334 -{
   1.335 -    typedef bind3<
   1.336 -          quote3< F,Tag >
   1.337 -        , typename L1::result_, typename L2::result_, typename L3::result_
   1.338 -        > result_;
   1.339 -
   1.340 -    typedef mpl::protect<result_> type;
   1.341 -};
   1.342 -
   1.343 -} // namespace aux
   1.344 -
   1.345 -template<
   1.346 -      template< typename P1, typename P2, typename P3 > class F
   1.347 -    , typename T1, typename T2, typename T3
   1.348 -    , typename Tag
   1.349 -    >
   1.350 -struct lambda<
   1.351 -          F< T1,T2,T3 >
   1.352 -        , Tag
   1.353 -       
   1.354 -        >
   1.355 -{
   1.356 -    typedef lambda< T1,Tag > l1;
   1.357 -    typedef lambda< T2,Tag > l2;
   1.358 -    typedef lambda< T3,Tag > l3;
   1.359 -    
   1.360 -    typedef typename l1::is_le is_le1;
   1.361 -    typedef typename l2::is_le is_le2;
   1.362 -    typedef typename l3::is_le is_le3;
   1.363 -    
   1.364 -
   1.365 -    typedef typename aux::lambda_or<
   1.366 -          is_le1::value, is_le2::value, is_le3::value
   1.367 -        >::type is_le;
   1.368 -
   1.369 -    typedef aux::le_result3<
   1.370 -          is_le, Tag, F, l1, l2, l3
   1.371 -        > le_result_;
   1.372 -
   1.373 -    typedef typename le_result_::result_ result_;
   1.374 -    typedef typename le_result_::type type;
   1.375 -};
   1.376 -
   1.377 -template<
   1.378 -      typename F, typename T1, typename T2, typename T3
   1.379 -    , typename Tag
   1.380 -    >
   1.381 -struct lambda<
   1.382 -          bind3< F,T1,T2,T3 >
   1.383 -        , Tag
   1.384 -       
   1.385 -        >
   1.386 -{
   1.387 -    typedef false_ is_le;
   1.388 -    typedef bind3<
   1.389 -          F
   1.390 -        , T1, T2, T3
   1.391 -        > result_;
   1.392 -
   1.393 -    typedef result_ type;
   1.394 -};
   1.395 -
   1.396 -namespace aux {
   1.397 -
   1.398 -template<
   1.399 -      typename IsLE, typename Tag
   1.400 -    , template< typename P1, typename P2, typename P3, typename P4 > class F
   1.401 -    , typename L1, typename L2, typename L3, typename L4
   1.402 -    >
   1.403 -struct le_result4
   1.404 -{
   1.405 -    typedef F<
   1.406 -          typename L1::type, typename L2::type, typename L3::type
   1.407 -        , typename L4::type
   1.408 -        > result_;
   1.409 -
   1.410 -    typedef result_ type;
   1.411 -};
   1.412 -
   1.413 -template<
   1.414 -      typename Tag
   1.415 -    , template< typename P1, typename P2, typename P3, typename P4 > class F
   1.416 -    , typename L1, typename L2, typename L3, typename L4
   1.417 -    >
   1.418 -struct le_result4< true_,Tag,F,L1,L2,L3,L4 >
   1.419 -{
   1.420 -    typedef bind4<
   1.421 -          quote4< F,Tag >
   1.422 -        , typename L1::result_, typename L2::result_, typename L3::result_
   1.423 -        , typename L4::result_
   1.424 -        > result_;
   1.425 -
   1.426 -    typedef mpl::protect<result_> type;
   1.427 -};
   1.428 -
   1.429 -} // namespace aux
   1.430 -
   1.431 -template<
   1.432 -      template< typename P1, typename P2, typename P3, typename P4 > class F
   1.433 -    , typename T1, typename T2, typename T3, typename T4
   1.434 -    , typename Tag
   1.435 -    >
   1.436 -struct lambda<
   1.437 -          F< T1,T2,T3,T4 >
   1.438 -        , Tag
   1.439 -       
   1.440 -        >
   1.441 -{
   1.442 -    typedef lambda< T1,Tag > l1;
   1.443 -    typedef lambda< T2,Tag > l2;
   1.444 -    typedef lambda< T3,Tag > l3;
   1.445 -    typedef lambda< T4,Tag > l4;
   1.446 -    
   1.447 -    typedef typename l1::is_le is_le1;
   1.448 -    typedef typename l2::is_le is_le2;
   1.449 -    typedef typename l3::is_le is_le3;
   1.450 -    typedef typename l4::is_le is_le4;
   1.451 -    
   1.452 -
   1.453 -    typedef typename aux::lambda_or<
   1.454 -          is_le1::value, is_le2::value, is_le3::value, is_le4::value
   1.455 -        >::type is_le;
   1.456 -
   1.457 -    typedef aux::le_result4<
   1.458 -          is_le, Tag, F, l1, l2, l3, l4
   1.459 -        > le_result_;
   1.460 -
   1.461 -    typedef typename le_result_::result_ result_;
   1.462 -    typedef typename le_result_::type type;
   1.463 -};
   1.464 -
   1.465 -template<
   1.466 -      typename F, typename T1, typename T2, typename T3, typename T4
   1.467 -    , typename Tag
   1.468 -    >
   1.469 -struct lambda<
   1.470 -          bind4< F,T1,T2,T3,T4 >
   1.471 -        , Tag
   1.472 -       
   1.473 -        >
   1.474 -{
   1.475 -    typedef false_ is_le;
   1.476 -    typedef bind4<
   1.477 -          F
   1.478 -        , T1, T2, T3, T4
   1.479 -        > result_;
   1.480 -
   1.481 -    typedef result_ type;
   1.482 -};
   1.483 -
   1.484 -namespace aux {
   1.485 -
   1.486 -template<
   1.487 -      typename IsLE, typename Tag
   1.488 -    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F
   1.489 -    , typename L1, typename L2, typename L3, typename L4, typename L5
   1.490 -    >
   1.491 -struct le_result5
   1.492 -{
   1.493 -    typedef F<
   1.494 -          typename L1::type, typename L2::type, typename L3::type
   1.495 -        , typename L4::type, typename L5::type
   1.496 -        > result_;
   1.497 -
   1.498 -    typedef result_ type;
   1.499 -};
   1.500 -
   1.501 -template<
   1.502 -      typename Tag
   1.503 -    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F
   1.504 -    , typename L1, typename L2, typename L3, typename L4, typename L5
   1.505 -    >
   1.506 -struct le_result5< true_,Tag,F,L1,L2,L3,L4,L5 >
   1.507 -{
   1.508 -    typedef bind5<
   1.509 -          quote5< F,Tag >
   1.510 -        , typename L1::result_, typename L2::result_, typename L3::result_
   1.511 -        , typename L4::result_, typename L5::result_
   1.512 -        > result_;
   1.513 -
   1.514 -    typedef mpl::protect<result_> type;
   1.515 -};
   1.516 -
   1.517 -} // namespace aux
   1.518 -
   1.519 -template<
   1.520 -      template<
   1.521 -          typename P1, typename P2, typename P3, typename P4
   1.522 -        , typename P5
   1.523 -        >
   1.524 -      class F
   1.525 -    , typename T1, typename T2, typename T3, typename T4, typename T5
   1.526 -    , typename Tag
   1.527 -    >
   1.528 -struct lambda<
   1.529 -          F< T1,T2,T3,T4,T5 >
   1.530 -        , Tag
   1.531 -       
   1.532 -        >
   1.533 -{
   1.534 -    typedef lambda< T1,Tag > l1;
   1.535 -    typedef lambda< T2,Tag > l2;
   1.536 -    typedef lambda< T3,Tag > l3;
   1.537 -    typedef lambda< T4,Tag > l4;
   1.538 -    typedef lambda< T5,Tag > l5;
   1.539 -    
   1.540 -    typedef typename l1::is_le is_le1;
   1.541 -    typedef typename l2::is_le is_le2;
   1.542 -    typedef typename l3::is_le is_le3;
   1.543 -    typedef typename l4::is_le is_le4;
   1.544 -    typedef typename l5::is_le is_le5;
   1.545 -    
   1.546 -
   1.547 -    typedef typename aux::lambda_or<
   1.548 -          is_le1::value, is_le2::value, is_le3::value, is_le4::value
   1.549 -        , is_le5::value
   1.550 -        >::type is_le;
   1.551 -
   1.552 -    typedef aux::le_result5<
   1.553 -          is_le, Tag, F, l1, l2, l3, l4, l5
   1.554 -        > le_result_;
   1.555 -
   1.556 -    typedef typename le_result_::result_ result_;
   1.557 -    typedef typename le_result_::type type;
   1.558 -};
   1.559 -
   1.560 -template<
   1.561 -      typename F, typename T1, typename T2, typename T3, typename T4
   1.562 -    , typename T5
   1.563 -    , typename Tag
   1.564 -    >
   1.565 -struct lambda<
   1.566 -          bind5< F,T1,T2,T3,T4,T5 >
   1.567 -        , Tag
   1.568 -       
   1.569 -        >
   1.570 -{
   1.571 -    typedef false_ is_le;
   1.572 -    typedef bind5<
   1.573 -          F
   1.574 -        , T1, T2, T3, T4, T5
   1.575 -        > result_;
   1.576 -
   1.577 -    typedef result_ type;
   1.578 -};
   1.579 +#define BOOST_PP_ITERATION_PARAMS_1 \
   1.580 +    (3,(0, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, <boost/mpl/aux_/full_lambda.hpp>))
   1.581 +#include BOOST_PP_ITERATE()
   1.582  
   1.583  /// special case for 'protect'
   1.584  template< typename T, typename Tag >
   1.585 -struct lambda< mpl::protect<T>, Tag >
   1.586 +struct lambda< mpl::protect<T>,Tag AUX778076_ARITY_PARAM(int_<1>) >
   1.587  {
   1.588      typedef false_ is_le;
   1.589      typedef mpl::protect<T> result_;
   1.590 @@ -513,25 +145,51 @@
   1.591  };
   1.592  
   1.593  /// specializations for the main 'bind' form
   1.594 -
   1.595  template<
   1.596 -      typename F, typename T1, typename T2, typename T3, typename T4
   1.597 -    , typename T5
   1.598 +      typename F, AUX778076_BIND_PARAMS(typename T)
   1.599      , typename Tag
   1.600      >
   1.601  struct lambda<
   1.602 -          bind< F,T1,T2,T3,T4,T5 >
   1.603 +          bind<F,AUX778076_BIND_PARAMS(T)>
   1.604          , Tag
   1.605 -       
   1.606 +        AUX778076_ARITY_PARAM(int_<BOOST_PP_INC(BOOST_MPL_LIMIT_METAFUNCTION_ARITY)>)
   1.607          >
   1.608  {
   1.609      typedef false_ is_le;
   1.610 -    typedef bind< F,T1,T2,T3,T4,T5 > result_;
   1.611 +    typedef bind<F, AUX778076_BIND_PARAMS(T)> result_;
   1.612      typedef result_ type;
   1.613  };
   1.614  
   1.615 +
   1.616 +#if defined(BOOST_MPL_CFG_EXTENDED_TEMPLATE_PARAMETERS_MATCHING)
   1.617 +
   1.618 +template<
   1.619 +      typename F
   1.620 +    , typename Tag1
   1.621 +    , typename Tag2
   1.622 +    , typename Arity
   1.623 +    >
   1.624 +struct lambda<
   1.625 +          lambda<F,Tag1,Arity>
   1.626 +        , Tag2
   1.627 +        , int_<3>
   1.628 +        >
   1.629 +{
   1.630 +    typedef lambda< F,Tag2 > l1;
   1.631 +    typedef lambda< Tag1,Tag2 > l2;
   1.632 +
   1.633 +    typedef typename l1::is_le is_le;
   1.634 +    typedef bind1< quote1<aux::template_arity>, typename l1::result_ > arity_;
   1.635 +    typedef lambda< typename if_<is_le,arity_,Arity>::type,Tag2 > l3;
   1.636 +    
   1.637 +    typedef aux::le_result3<is_le, Tag2, mpl::lambda, l1, l2, l3> le_result_;
   1.638 +    typedef typename le_result_::result_ result_;
   1.639 +    typedef typename le_result_::type type;
   1.640 +};
   1.641 +
   1.642 +#elif !defined(BOOST_MPL_CFG_DMC_AMBIGUOUS_CTPS)
   1.643 +
   1.644  /// workaround for MWCW 8.3+/EDG < 303, leads to ambiguity on Digital Mars
   1.645 -
   1.646  template<
   1.647        typename F, typename Tag1, typename Tag2
   1.648      >
   1.649 @@ -542,13 +200,151 @@
   1.650  {
   1.651      typedef lambda< F,Tag2 > l1;
   1.652      typedef lambda< Tag1,Tag2 > l2;
   1.653 +    
   1.654      typedef typename l1::is_le is_le;
   1.655      typedef aux::le_result2<is_le, Tag2, mpl::lambda, l1, l2> le_result_;
   1.656      typedef typename le_result_::result_ result_;
   1.657      typedef typename le_result_::type type;
   1.658  };
   1.659  
   1.660 +#endif
   1.661 +
   1.662 +#   undef AUX778076_ARITY_PARAM
   1.663 +#   undef AUX778076_BIND_N_PARAMS
   1.664 +#   undef AUX778076_BIND_PARAMS
   1.665 +#   undef AUX778076_LAMBDA_PARAMS
   1.666 +
   1.667 +#if !defined(BOOST_MPL_CFG_EXTENDED_TEMPLATE_PARAMETERS_MATCHING)
   1.668  BOOST_MPL_AUX_NA_SPEC(2, lambda)
   1.669 +#else
   1.670 +BOOST_MPL_AUX_NA_SPEC2(2, 3, lambda)
   1.671 +#endif
   1.672  
   1.673  }}
   1.674  
   1.675 +#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
   1.676 +#endif // BOOST_MPL_AUX_FULL_LAMBDA_HPP_INCLUDED
   1.677 +
   1.678 +///// iteration, depth == 1
   1.679 +
   1.680 +#elif BOOST_PP_ITERATION_DEPTH() == 1
   1.681 +#define i_ BOOST_PP_FRAME_ITERATION(1)
   1.682 +
   1.683 +#if i_ > 0
   1.684 +
   1.685 +namespace aux {
   1.686 +
   1.687 +#   define AUX778076_RESULT(unused, i_, T) \
   1.688 +    BOOST_PP_COMMA_IF(i_) \
   1.689 +    typename BOOST_PP_CAT(T, BOOST_PP_INC(i_))::result_ \
   1.690 +    /**/
   1.691 +
   1.692 +#   define AUX778076_TYPE(unused, i_, T) \
   1.693 +    BOOST_PP_COMMA_IF(i_) \
   1.694 +    typename BOOST_PP_CAT(T, BOOST_PP_INC(i_))::type \
   1.695 +    /**/
   1.696 +
   1.697 +template<
   1.698 +      typename IsLE, typename Tag
   1.699 +    , template< AUX778076_LAMBDA_PARAMS(i_, typename P) > class F
   1.700 +    , AUX778076_LAMBDA_PARAMS(i_, typename L)
   1.701 +    >
   1.702 +struct BOOST_PP_CAT(le_result,i_)
   1.703 +{
   1.704 +    typedef F<
   1.705 +          BOOST_MPL_PP_REPEAT(i_, AUX778076_TYPE, L)
   1.706 +        > result_;
   1.707 +    
   1.708 +    typedef result_ type;
   1.709 +};
   1.710 +
   1.711 +template<
   1.712 +      typename Tag
   1.713 +    , template< AUX778076_LAMBDA_PARAMS(i_, typename P) > class F
   1.714 +    , AUX778076_LAMBDA_PARAMS(i_, typename L)
   1.715 +    >
   1.716 +struct BOOST_PP_CAT(le_result,i_)< true_,Tag,F,AUX778076_LAMBDA_PARAMS(i_, L) >
   1.717 +{
   1.718 +    typedef BOOST_PP_CAT(bind,i_)<
   1.719 +          BOOST_PP_CAT(quote,i_)<F,Tag>
   1.720 +        , BOOST_MPL_PP_REPEAT(i_, AUX778076_RESULT, L)
   1.721 +        > result_;
   1.722 +
   1.723 +    typedef mpl::protect<result_> type;
   1.724 +};
   1.725 +
   1.726 +#   undef AUX778076_TYPE
   1.727 +#   undef AUX778076_RESULT
   1.728 +
   1.729 +} // namespace aux
   1.730 +
   1.731 +
   1.732 +#   define AUX778076_LAMBDA_TYPEDEF(unused, i_, T) \
   1.733 +    typedef lambda< BOOST_PP_CAT(T, BOOST_PP_INC(i_)), Tag > \
   1.734 +        BOOST_PP_CAT(l,BOOST_PP_INC(i_)); \
   1.735 +/**/
   1.736 +
   1.737 +#   define AUX778076_IS_LE_TYPEDEF(unused, i_, unused2) \
   1.738 +    typedef typename BOOST_PP_CAT(l,BOOST_PP_INC(i_))::is_le \
   1.739 +        BOOST_PP_CAT(is_le,BOOST_PP_INC(i_)); \
   1.740 +/**/
   1.741 +
   1.742 +#   define AUX778076_IS_LAMBDA_EXPR(unused, i_, unused2) \
   1.743 +    BOOST_PP_COMMA_IF(i_) \
   1.744 +    BOOST_PP_CAT(is_le,BOOST_PP_INC(i_))::value \
   1.745 +/**/
   1.746 +
   1.747 +template<
   1.748 +      template< AUX778076_LAMBDA_PARAMS(i_, typename P) > class F
   1.749 +    , AUX778076_LAMBDA_PARAMS(i_, typename T)
   1.750 +    , typename Tag
   1.751 +    >
   1.752 +struct lambda< 
   1.753 +          F<AUX778076_LAMBDA_PARAMS(i_, T)>
   1.754 +        , Tag
   1.755 +        AUX778076_ARITY_PARAM(int_<i_>)
   1.756 +        >
   1.757 +{
   1.758 +    BOOST_MPL_PP_REPEAT(i_, AUX778076_LAMBDA_TYPEDEF, T)
   1.759 +    BOOST_MPL_PP_REPEAT(i_, AUX778076_IS_LE_TYPEDEF, unused)
   1.760 +
   1.761 +    typedef typename aux::lambda_or<
   1.762 +          BOOST_MPL_PP_REPEAT(i_, AUX778076_IS_LAMBDA_EXPR, unused)
   1.763 +        >::type is_le;
   1.764 +
   1.765 +    typedef aux::BOOST_PP_CAT(le_result,i_)<
   1.766 +          is_le, Tag, F, AUX778076_LAMBDA_PARAMS(i_, l)
   1.767 +        > le_result_;
   1.768 +    
   1.769 +    typedef typename le_result_::result_ result_;
   1.770 +    typedef typename le_result_::type type;
   1.771 +};
   1.772 +
   1.773 +
   1.774 +#   undef AUX778076_IS_LAMBDA_EXPR
   1.775 +#   undef AUX778076_IS_LE_TYPEDEF
   1.776 +#   undef AUX778076_LAMBDA_TYPEDEF
   1.777 +
   1.778 +#endif // i_ > 0
   1.779 +
   1.780 +template<
   1.781 +      typename F AUX778076_BIND_N_PARAMS(i_, typename T)
   1.782 +    , typename Tag
   1.783 +    >
   1.784 +struct lambda<
   1.785 +          BOOST_PP_CAT(bind,i_)<F AUX778076_BIND_N_PARAMS(i_, T)>
   1.786 +        , Tag
   1.787 +        AUX778076_ARITY_PARAM(int_<BOOST_PP_INC(i_)>)
   1.788 +        >
   1.789 +{
   1.790 +    typedef false_ is_le;
   1.791 +    typedef BOOST_PP_CAT(bind,i_)<
   1.792 +          F
   1.793 +        AUX778076_BIND_N_PARAMS(i_, T)
   1.794 +        > result_;
   1.795 +        
   1.796 +    typedef result_ type;
   1.797 +};
   1.798 +
   1.799 +#undef i_
   1.800 +#endif // BOOST_PP_IS_ITERATING