Home | History | Annotate | Download | only in gcc
      1 
      2 // Copyright Aleksey Gurtovoy 2001-2004
      3 //
      4 // Distributed under the Boost Software License, Version 1.0.
      5 // (See accompanying file LICENSE_1_0.txt or copy at
      6 // http://www.boost.org/LICENSE_1_0.txt)
      7 //
      8 
      9 // Preprocessed version of "boost/mpl/aux_/full_lambda.hpp" header
     10 // -- DO NOT modify by hand!
     11 
     12 namespace boost { namespace mpl {
     13 
     14 namespace aux {
     15 
     16 template<
     17       bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false
     18     , bool C5 = false
     19     >
     20 struct lambda_or
     21     : true_
     22 {
     23 };
     24 
     25 template<>
     26 struct lambda_or< false,false,false,false,false >
     27     : false_
     28 {
     29 };
     30 
     31 } // namespace aux
     32 
     33 template<
     34       typename T
     35     , typename Tag
     36     , typename Arity
     37     >
     38 struct lambda
     39 {
     40     typedef false_ is_le;
     41     typedef T result_;
     42     typedef T type;
     43 };
     44 
     45 template<
     46       typename T
     47     >
     48 struct is_lambda_expression
     49     : lambda<T>::is_le
     50 {
     51 };
     52 
     53 template< int N, typename Tag >
     54 struct lambda< arg<N>,Tag, int_< -1 > >
     55 {
     56     typedef true_ is_le;
     57     typedef mpl::arg<N> result_; // qualified for the sake of MIPSpro 7.41
     58     typedef mpl::protect<result_> type;
     59 };
     60 
     61 template<
     62       typename F
     63     , typename Tag
     64     >
     65 struct lambda<
     66           bind0<F>
     67         , Tag
     68         , int_<1>
     69         >
     70 {
     71     typedef false_ is_le;
     72     typedef bind0<
     73           F
     74         > result_;
     75 
     76     typedef result_ type;
     77 };
     78 
     79 namespace aux {
     80 
     81 template<
     82       typename IsLE, typename Tag
     83     , template< typename P1 > class F
     84     , typename L1
     85     >
     86 struct le_result1
     87 {
     88     typedef F<
     89           typename L1::type
     90         > result_;
     91 
     92     typedef result_ type;
     93 };
     94 
     95 template<
     96       typename Tag
     97     , template< typename P1 > class F
     98     , typename L1
     99     >
    100 struct le_result1< true_,Tag,F,L1 >
    101 {
    102     typedef bind1<
    103           quote1< F,Tag >
    104         , typename L1::result_
    105         > result_;
    106 
    107     typedef mpl::protect<result_> type;
    108 };
    109 
    110 } // namespace aux
    111 
    112 template<
    113       template< typename P1 > class F
    114     , typename T1
    115     , typename Tag
    116     >
    117 struct lambda<
    118           F<T1>
    119         , Tag
    120         , int_<1>
    121         >
    122 {
    123     typedef lambda< T1,Tag > l1;
    124     typedef typename l1::is_le is_le1;
    125     typedef typename aux::lambda_or<
    126           is_le1::value
    127         >::type is_le;
    128 
    129     typedef aux::le_result1<
    130           is_le, Tag, F, l1
    131         > le_result_;
    132 
    133     typedef typename le_result_::result_ result_;
    134     typedef typename le_result_::type type;
    135 };
    136 
    137 template<
    138       typename F, typename T1
    139     , typename Tag
    140     >
    141 struct lambda<
    142           bind1< F,T1 >
    143         , Tag
    144         , int_<2>
    145         >
    146 {
    147     typedef false_ is_le;
    148     typedef bind1<
    149           F
    150         , T1
    151         > result_;
    152 
    153     typedef result_ type;
    154 };
    155 
    156 namespace aux {
    157 
    158 template<
    159       typename IsLE, typename Tag
    160     , template< typename P1, typename P2 > class F
    161     , typename L1, typename L2
    162     >
    163 struct le_result2
    164 {
    165     typedef F<
    166           typename L1::type, typename L2::type
    167         > result_;
    168 
    169     typedef result_ type;
    170 };
    171 
    172 template<
    173       typename Tag
    174     , template< typename P1, typename P2 > class F
    175     , typename L1, typename L2
    176     >
    177 struct le_result2< true_,Tag,F,L1,L2 >
    178 {
    179     typedef bind2<
    180           quote2< F,Tag >
    181         , typename L1::result_, typename L2::result_
    182         > result_;
    183 
    184     typedef mpl::protect<result_> type;
    185 };
    186 
    187 } // namespace aux
    188 
    189 template<
    190       template< typename P1, typename P2 > class F
    191     , typename T1, typename T2
    192     , typename Tag
    193     >
    194 struct lambda<
    195           F< T1,T2 >
    196         , Tag
    197         , int_<2>
    198         >
    199 {
    200     typedef lambda< T1,Tag > l1;
    201     typedef lambda< T2,Tag > l2;
    202 
    203     typedef typename l1::is_le is_le1;
    204     typedef typename l2::is_le is_le2;
    205 
    206 
    207     typedef typename aux::lambda_or<
    208           is_le1::value, is_le2::value
    209         >::type is_le;
    210 
    211     typedef aux::le_result2<
    212           is_le, Tag, F, l1, l2
    213         > le_result_;
    214 
    215     typedef typename le_result_::result_ result_;
    216     typedef typename le_result_::type type;
    217 };
    218 
    219 template<
    220       typename F, typename T1, typename T2
    221     , typename Tag
    222     >
    223 struct lambda<
    224           bind2< F,T1,T2 >
    225         , Tag
    226         , int_<3>
    227         >
    228 {
    229     typedef false_ is_le;
    230     typedef bind2<
    231           F
    232         , T1, T2
    233         > result_;
    234 
    235     typedef result_ type;
    236 };
    237 
    238 namespace aux {
    239 
    240 template<
    241       typename IsLE, typename Tag
    242     , template< typename P1, typename P2, typename P3 > class F
    243     , typename L1, typename L2, typename L3
    244     >
    245 struct le_result3
    246 {
    247     typedef F<
    248           typename L1::type, typename L2::type, typename L3::type
    249         > result_;
    250 
    251     typedef result_ type;
    252 };
    253 
    254 template<
    255       typename Tag
    256     , template< typename P1, typename P2, typename P3 > class F
    257     , typename L1, typename L2, typename L3
    258     >
    259 struct le_result3< true_,Tag,F,L1,L2,L3 >
    260 {
    261     typedef bind3<
    262           quote3< F,Tag >
    263         , typename L1::result_, typename L2::result_, typename L3::result_
    264         > result_;
    265 
    266     typedef mpl::protect<result_> type;
    267 };
    268 
    269 } // namespace aux
    270 
    271 template<
    272       template< typename P1, typename P2, typename P3 > class F
    273     , typename T1, typename T2, typename T3
    274     , typename Tag
    275     >
    276 struct lambda<
    277           F< T1,T2,T3 >
    278         , Tag
    279         , int_<3>
    280         >
    281 {
    282     typedef lambda< T1,Tag > l1;
    283     typedef lambda< T2,Tag > l2;
    284     typedef lambda< T3,Tag > l3;
    285 
    286     typedef typename l1::is_le is_le1;
    287     typedef typename l2::is_le is_le2;
    288     typedef typename l3::is_le is_le3;
    289 
    290 
    291     typedef typename aux::lambda_or<
    292           is_le1::value, is_le2::value, is_le3::value
    293         >::type is_le;
    294 
    295     typedef aux::le_result3<
    296           is_le, Tag, F, l1, l2, l3
    297         > le_result_;
    298 
    299     typedef typename le_result_::result_ result_;
    300     typedef typename le_result_::type type;
    301 };
    302 
    303 template<
    304       typename F, typename T1, typename T2, typename T3
    305     , typename Tag
    306     >
    307 struct lambda<
    308           bind3< F,T1,T2,T3 >
    309         , Tag
    310         , int_<4>
    311         >
    312 {
    313     typedef false_ is_le;
    314     typedef bind3<
    315           F
    316         , T1, T2, T3
    317         > result_;
    318 
    319     typedef result_ type;
    320 };
    321 
    322 namespace aux {
    323 
    324 template<
    325       typename IsLE, typename Tag
    326     , template< typename P1, typename P2, typename P3, typename P4 > class F
    327     , typename L1, typename L2, typename L3, typename L4
    328     >
    329 struct le_result4
    330 {
    331     typedef F<
    332           typename L1::type, typename L2::type, typename L3::type
    333         , typename L4::type
    334         > result_;
    335 
    336     typedef result_ type;
    337 };
    338 
    339 template<
    340       typename Tag
    341     , template< typename P1, typename P2, typename P3, typename P4 > class F
    342     , typename L1, typename L2, typename L3, typename L4
    343     >
    344 struct le_result4< true_,Tag,F,L1,L2,L3,L4 >
    345 {
    346     typedef bind4<
    347           quote4< F,Tag >
    348         , typename L1::result_, typename L2::result_, typename L3::result_
    349         , typename L4::result_
    350         > result_;
    351 
    352     typedef mpl::protect<result_> type;
    353 };
    354 
    355 } // namespace aux
    356 
    357 template<
    358       template< typename P1, typename P2, typename P3, typename P4 > class F
    359     , typename T1, typename T2, typename T3, typename T4
    360     , typename Tag
    361     >
    362 struct lambda<
    363           F< T1,T2,T3,T4 >
    364         , Tag
    365         , int_<4>
    366         >
    367 {
    368     typedef lambda< T1,Tag > l1;
    369     typedef lambda< T2,Tag > l2;
    370     typedef lambda< T3,Tag > l3;
    371     typedef lambda< T4,Tag > l4;
    372 
    373     typedef typename l1::is_le is_le1;
    374     typedef typename l2::is_le is_le2;
    375     typedef typename l3::is_le is_le3;
    376     typedef typename l4::is_le is_le4;
    377 
    378 
    379     typedef typename aux::lambda_or<
    380           is_le1::value, is_le2::value, is_le3::value, is_le4::value
    381         >::type is_le;
    382 
    383     typedef aux::le_result4<
    384           is_le, Tag, F, l1, l2, l3, l4
    385         > le_result_;
    386 
    387     typedef typename le_result_::result_ result_;
    388     typedef typename le_result_::type type;
    389 };
    390 
    391 template<
    392       typename F, typename T1, typename T2, typename T3, typename T4
    393     , typename Tag
    394     >
    395 struct lambda<
    396           bind4< F,T1,T2,T3,T4 >
    397         , Tag
    398         , int_<5>
    399         >
    400 {
    401     typedef false_ is_le;
    402     typedef bind4<
    403           F
    404         , T1, T2, T3, T4
    405         > result_;
    406 
    407     typedef result_ type;
    408 };
    409 
    410 namespace aux {
    411 
    412 template<
    413       typename IsLE, typename Tag
    414     , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F
    415     , typename L1, typename L2, typename L3, typename L4, typename L5
    416     >
    417 struct le_result5
    418 {
    419     typedef F<
    420           typename L1::type, typename L2::type, typename L3::type
    421         , typename L4::type, typename L5::type
    422         > result_;
    423 
    424     typedef result_ type;
    425 };
    426 
    427 template<
    428       typename Tag
    429     , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F
    430     , typename L1, typename L2, typename L3, typename L4, typename L5
    431     >
    432 struct le_result5< true_,Tag,F,L1,L2,L3,L4,L5 >
    433 {
    434     typedef bind5<
    435           quote5< F,Tag >
    436         , typename L1::result_, typename L2::result_, typename L3::result_
    437         , typename L4::result_, typename L5::result_
    438         > result_;
    439 
    440     typedef mpl::protect<result_> type;
    441 };
    442 
    443 } // namespace aux
    444 
    445 template<
    446       template<
    447           typename P1, typename P2, typename P3, typename P4
    448         , typename P5
    449         >
    450       class F
    451     , typename T1, typename T2, typename T3, typename T4, typename T5
    452     , typename Tag
    453     >
    454 struct lambda<
    455           F< T1,T2,T3,T4,T5 >
    456         , Tag
    457         , int_<5>
    458         >
    459 {
    460     typedef lambda< T1,Tag > l1;
    461     typedef lambda< T2,Tag > l2;
    462     typedef lambda< T3,Tag > l3;
    463     typedef lambda< T4,Tag > l4;
    464     typedef lambda< T5,Tag > l5;
    465 
    466     typedef typename l1::is_le is_le1;
    467     typedef typename l2::is_le is_le2;
    468     typedef typename l3::is_le is_le3;
    469     typedef typename l4::is_le is_le4;
    470     typedef typename l5::is_le is_le5;
    471 
    472 
    473     typedef typename aux::lambda_or<
    474           is_le1::value, is_le2::value, is_le3::value, is_le4::value
    475         , is_le5::value
    476         >::type is_le;
    477 
    478     typedef aux::le_result5<
    479           is_le, Tag, F, l1, l2, l3, l4, l5
    480         > le_result_;
    481 
    482     typedef typename le_result_::result_ result_;
    483     typedef typename le_result_::type type;
    484 };
    485 
    486 template<
    487       typename F, typename T1, typename T2, typename T3, typename T4
    488     , typename T5
    489     , typename Tag
    490     >
    491 struct lambda<
    492           bind5< F,T1,T2,T3,T4,T5 >
    493         , Tag
    494         , int_<6>
    495         >
    496 {
    497     typedef false_ is_le;
    498     typedef bind5<
    499           F
    500         , T1, T2, T3, T4, T5
    501         > result_;
    502 
    503     typedef result_ type;
    504 };
    505 
    506 /// special case for 'protect'
    507 template< typename T, typename Tag >
    508 struct lambda< mpl::protect<T>,Tag, int_<1> >
    509 {
    510     typedef false_ is_le;
    511     typedef mpl::protect<T> result_;
    512     typedef result_ type;
    513 };
    514 
    515 /// specializations for the main 'bind' form
    516 
    517 template<
    518       typename F, typename T1, typename T2, typename T3, typename T4
    519     , typename T5
    520     , typename Tag
    521     >
    522 struct lambda<
    523           bind< F,T1,T2,T3,T4,T5 >
    524         , Tag
    525         , int_<6>
    526         >
    527 {
    528     typedef false_ is_le;
    529     typedef bind< F,T1,T2,T3,T4,T5 > result_;
    530     typedef result_ type;
    531 };
    532 
    533 template<
    534       typename F
    535     , typename Tag1
    536     , typename Tag2
    537     , typename Arity
    538     >
    539 struct lambda<
    540           lambda< F,Tag1,Arity >
    541         , Tag2
    542         , int_<3>
    543         >
    544 {
    545     typedef lambda< F,Tag2 > l1;
    546     typedef lambda< Tag1,Tag2 > l2;
    547     typedef typename l1::is_le is_le;
    548     typedef bind1< quote1<aux::template_arity>, typename l1::result_ > arity_;
    549     typedef lambda< typename if_< is_le,arity_,Arity >::type, Tag2 > l3;
    550     typedef aux::le_result3<is_le, Tag2, mpl::lambda, l1, l2, l3> le_result_;
    551     typedef typename le_result_::result_ result_;
    552     typedef typename le_result_::type type;
    553 };
    554 
    555 BOOST_MPL_AUX_NA_SPEC2(2, 3, lambda)
    556 
    557 }}
    558 
    559