| |
| // 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 "ndnboost/mpl/aux_/full_lambda.hpp" header |
| // -- DO NOT modify by hand! |
| |
| namespace ndnboost { 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) |
| |
| }} |
| |