// Copyright Aleksey Gurtovoy 2001-2004 | |
// | |
// Distributed under the Boost Software License, Version 1.0. | |
// (See accompanying file LICENSE_1_0.txt or copy at | |
// http://www.boost.org/LICENSE_1_0.txt) | |
// | |
// Preprocessed version of "boost/mpl/aux_/full_lambda.hpp" header | |
// -- DO NOT modify by hand! | |
namespace boost { namespace mpl { | |
namespace aux { | |
template< | |
bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false | |
, bool C5 = false | |
> | |
struct lambda_or | |
: true_ | |
{ | |
}; | |
template<> | |
struct lambda_or< false,false,false,false,false > | |
: false_ | |
{ | |
}; | |
} // namespace aux | |
template< | |
typename T | |
, typename Tag | |
> | |
struct lambda | |
{ | |
typedef false_ is_le; | |
typedef T result_; | |
typedef T type; | |
}; | |
template< | |
typename T | |
> | |
struct is_lambda_expression | |
: lambda<T>::is_le | |
{ | |
}; | |
template< int N, typename Tag > | |
struct lambda< arg<N>, Tag > | |
{ | |
typedef true_ is_le; | |
typedef mpl::arg<N> result_; // qualified for the sake of MIPSpro 7.41 | |
typedef mpl::protect<result_> type; | |
}; | |
template< | |
typename F | |
, typename Tag | |
> | |
struct lambda< | |
bind0<F> | |
, Tag | |
> | |
{ | |
typedef false_ is_le; | |
typedef bind0< | |
F | |
> result_; | |
typedef result_ type; | |
}; | |
namespace aux { | |
template< | |
typename IsLE, typename Tag | |
, template< typename P1 > class F | |
, typename L1 | |
> | |
struct le_result1 | |
{ | |
typedef F< | |
typename L1::type | |
> result_; | |
typedef result_ type; | |
}; | |
template< | |
typename Tag | |
, template< typename P1 > class F | |
, typename L1 | |
> | |
struct le_result1< true_,Tag,F,L1 > | |
{ | |
typedef bind1< | |
quote1< F,Tag > | |
, typename L1::result_ | |
> result_; | |
typedef mpl::protect<result_> type; | |
}; | |
} // namespace aux | |
template< | |
template< typename P1 > class F | |
, typename T1 | |
, typename Tag | |
> | |
struct lambda< | |
F<T1> | |
, Tag | |
> | |
{ | |
typedef lambda< T1,Tag > l1; | |
typedef typename l1::is_le is_le1; | |
typedef typename aux::lambda_or< | |
is_le1::value | |
>::type is_le; | |
typedef aux::le_result1< | |
is_le, Tag, F, l1 | |
> le_result_; | |
typedef typename le_result_::result_ result_; | |
typedef typename le_result_::type type; | |
}; | |
template< | |
typename F, typename T1 | |
, typename Tag | |
> | |
struct lambda< | |
bind1< F,T1 > | |
, Tag | |
> | |
{ | |
typedef false_ is_le; | |
typedef bind1< | |
F | |
, T1 | |
> result_; | |
typedef result_ type; | |
}; | |
namespace aux { | |
template< | |
typename IsLE, typename Tag | |
, template< typename P1, typename P2 > class F | |
, typename L1, typename L2 | |
> | |
struct le_result2 | |
{ | |
typedef F< | |
typename L1::type, typename L2::type | |
> result_; | |
typedef result_ type; | |
}; | |
template< | |
typename Tag | |
, template< typename P1, typename P2 > class F | |
, typename L1, typename L2 | |
> | |
struct le_result2< true_,Tag,F,L1,L2 > | |
{ | |
typedef bind2< | |
quote2< F,Tag > | |
, typename L1::result_, typename L2::result_ | |
> result_; | |
typedef mpl::protect<result_> type; | |
}; | |
} // namespace aux | |
template< | |
template< typename P1, typename P2 > class F | |
, typename T1, typename T2 | |
, typename Tag | |
> | |
struct lambda< | |
F< T1,T2 > | |
, Tag | |
> | |
{ | |
typedef lambda< T1,Tag > l1; | |
typedef lambda< T2,Tag > l2; | |
typedef typename l1::is_le is_le1; | |
typedef typename l2::is_le is_le2; | |
typedef typename aux::lambda_or< | |
is_le1::value, is_le2::value | |
>::type is_le; | |
typedef aux::le_result2< | |
is_le, Tag, F, l1, l2 | |
> le_result_; | |
typedef typename le_result_::result_ result_; | |
typedef typename le_result_::type type; | |
}; | |
template< | |
typename F, typename T1, typename T2 | |
, typename Tag | |
> | |
struct lambda< | |
bind2< F,T1,T2 > | |
, Tag | |
> | |
{ | |
typedef false_ is_le; | |
typedef bind2< | |
F | |
, T1, T2 | |
> result_; | |
typedef result_ type; | |
}; | |
namespace aux { | |
template< | |
typename IsLE, typename Tag | |
, template< typename P1, typename P2, typename P3 > class F | |
, typename L1, typename L2, typename L3 | |
> | |
struct le_result3 | |
{ | |
typedef F< | |
typename L1::type, typename L2::type, typename L3::type | |
> result_; | |
typedef result_ type; | |
}; | |
template< | |
typename Tag | |
, template< typename P1, typename P2, typename P3 > class F | |
, typename L1, typename L2, typename L3 | |
> | |
struct le_result3< true_,Tag,F,L1,L2,L3 > | |
{ | |
typedef bind3< | |
quote3< F,Tag > | |
, typename L1::result_, typename L2::result_, typename L3::result_ | |
> result_; | |
typedef mpl::protect<result_> type; | |
}; | |
} // namespace aux | |
template< | |
template< typename P1, typename P2, typename P3 > class F | |
, typename T1, typename T2, typename T3 | |
, typename Tag | |
> | |
struct lambda< | |
F< T1,T2,T3 > | |
, Tag | |
> | |
{ | |
typedef lambda< T1,Tag > l1; | |
typedef lambda< T2,Tag > l2; | |
typedef lambda< T3,Tag > l3; | |
typedef typename l1::is_le is_le1; | |
typedef typename l2::is_le is_le2; | |
typedef typename l3::is_le is_le3; | |
typedef typename aux::lambda_or< | |
is_le1::value, is_le2::value, is_le3::value | |
>::type is_le; | |
typedef aux::le_result3< | |
is_le, Tag, F, l1, l2, l3 | |
> le_result_; | |
typedef typename le_result_::result_ result_; | |
typedef typename le_result_::type type; | |
}; | |
template< | |
typename F, typename T1, typename T2, typename T3 | |
, typename Tag | |
> | |
struct lambda< | |
bind3< F,T1,T2,T3 > | |
, Tag | |
> | |
{ | |
typedef false_ is_le; | |
typedef bind3< | |
F | |
, T1, T2, T3 | |
> result_; | |
typedef result_ type; | |
}; | |
namespace aux { | |
template< | |
typename IsLE, typename Tag | |
, template< typename P1, typename P2, typename P3, typename P4 > class F | |
, typename L1, typename L2, typename L3, typename L4 | |
> | |
struct le_result4 | |
{ | |
typedef F< | |
typename L1::type, typename L2::type, typename L3::type | |
, typename L4::type | |
> result_; | |
typedef result_ type; | |
}; | |
template< | |
typename Tag | |
, template< typename P1, typename P2, typename P3, typename P4 > class F | |
, typename L1, typename L2, typename L3, typename L4 | |
> | |
struct le_result4< true_,Tag,F,L1,L2,L3,L4 > | |
{ | |
typedef bind4< | |
quote4< F,Tag > | |
, typename L1::result_, typename L2::result_, typename L3::result_ | |
, typename L4::result_ | |
> result_; | |
typedef mpl::protect<result_> type; | |
}; | |
} // namespace aux | |
template< | |
template< typename P1, typename P2, typename P3, typename P4 > class F | |
, typename T1, typename T2, typename T3, typename T4 | |
, typename Tag | |
> | |
struct lambda< | |
F< T1,T2,T3,T4 > | |
, Tag | |
> | |
{ | |
typedef lambda< T1,Tag > l1; | |
typedef lambda< T2,Tag > l2; | |
typedef lambda< T3,Tag > l3; | |
typedef lambda< T4,Tag > l4; | |
typedef typename l1::is_le is_le1; | |
typedef typename l2::is_le is_le2; | |
typedef typename l3::is_le is_le3; | |
typedef typename l4::is_le is_le4; | |
typedef typename aux::lambda_or< | |
is_le1::value, is_le2::value, is_le3::value, is_le4::value | |
>::type is_le; | |
typedef aux::le_result4< | |
is_le, Tag, F, l1, l2, l3, l4 | |
> le_result_; | |
typedef typename le_result_::result_ result_; | |
typedef typename le_result_::type type; | |
}; | |
template< | |
typename F, typename T1, typename T2, typename T3, typename T4 | |
, typename Tag | |
> | |
struct lambda< | |
bind4< F,T1,T2,T3,T4 > | |
, Tag | |
> | |
{ | |
typedef false_ is_le; | |
typedef bind4< | |
F | |
, T1, T2, T3, T4 | |
> result_; | |
typedef result_ type; | |
}; | |
namespace aux { | |
template< | |
typename IsLE, typename Tag | |
, template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F | |
, typename L1, typename L2, typename L3, typename L4, typename L5 | |
> | |
struct le_result5 | |
{ | |
typedef F< | |
typename L1::type, typename L2::type, typename L3::type | |
, typename L4::type, typename L5::type | |
> result_; | |
typedef result_ type; | |
}; | |
template< | |
typename Tag | |
, template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F | |
, typename L1, typename L2, typename L3, typename L4, typename L5 | |
> | |
struct le_result5< true_,Tag,F,L1,L2,L3,L4,L5 > | |
{ | |
typedef bind5< | |
quote5< F,Tag > | |
, typename L1::result_, typename L2::result_, typename L3::result_ | |
, typename L4::result_, typename L5::result_ | |
> result_; | |
typedef mpl::protect<result_> type; | |
}; | |
} // namespace aux | |
template< | |
template< | |
typename P1, typename P2, typename P3, typename P4 | |
, typename P5 | |
> | |
class F | |
, typename T1, typename T2, typename T3, typename T4, typename T5 | |
, typename Tag | |
> | |
struct lambda< | |
F< T1,T2,T3,T4,T5 > | |
, Tag | |
> | |
{ | |
typedef lambda< T1,Tag > l1; | |
typedef lambda< T2,Tag > l2; | |
typedef lambda< T3,Tag > l3; | |
typedef lambda< T4,Tag > l4; | |
typedef lambda< T5,Tag > l5; | |
typedef typename l1::is_le is_le1; | |
typedef typename l2::is_le is_le2; | |
typedef typename l3::is_le is_le3; | |
typedef typename l4::is_le is_le4; | |
typedef typename l5::is_le is_le5; | |
typedef typename aux::lambda_or< | |
is_le1::value, is_le2::value, is_le3::value, is_le4::value | |
, is_le5::value | |
>::type is_le; | |
typedef aux::le_result5< | |
is_le, Tag, F, l1, l2, l3, l4, l5 | |
> le_result_; | |
typedef typename le_result_::result_ result_; | |
typedef typename le_result_::type type; | |
}; | |
template< | |
typename F, typename T1, typename T2, typename T3, typename T4 | |
, typename T5 | |
, typename Tag | |
> | |
struct lambda< | |
bind5< F,T1,T2,T3,T4,T5 > | |
, Tag | |
> | |
{ | |
typedef false_ is_le; | |
typedef bind5< | |
F | |
, T1, T2, T3, T4, T5 | |
> result_; | |
typedef result_ type; | |
}; | |
/// special case for 'protect' | |
template< typename T, typename Tag > | |
struct lambda< mpl::protect<T>, Tag > | |
{ | |
typedef false_ is_le; | |
typedef mpl::protect<T> result_; | |
typedef result_ type; | |
}; | |
/// specializations for the main 'bind' form | |
template< | |
typename F, typename T1, typename T2, typename T3, typename T4 | |
, typename T5 | |
, typename Tag | |
> | |
struct lambda< | |
bind< F,T1,T2,T3,T4,T5 > | |
, Tag | |
> | |
{ | |
typedef false_ is_le; | |
typedef bind< F,T1,T2,T3,T4,T5 > result_; | |
typedef result_ type; | |
}; | |
/// workaround for MWCW 8.3+/EDG < 303, leads to ambiguity on Digital Mars | |
template< | |
typename F, typename Tag1, typename Tag2 | |
> | |
struct lambda< | |
lambda< F,Tag1 > | |
, Tag2 | |
> | |
{ | |
typedef lambda< F,Tag2 > l1; | |
typedef lambda< Tag1,Tag2 > l2; | |
typedef typename l1::is_le is_le; | |
typedef aux::le_result2<is_le, Tag2, mpl::lambda, l1, l2> le_result_; | |
typedef typename le_result_::result_ result_; | |
typedef typename le_result_::type type; | |
}; | |
BOOST_MPL_AUX_NA_SPEC(2, lambda) | |
}} | |