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