

// Copyright Aleksey Gurtovoy 2000-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_/lambda_no_ctps.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_

{

};



template< typename Arity > struct lambda_impl

{

    template< typename T, typename Tag, typename Protect > struct result_

    {

        typedef T type;

        typedef is_placeholder<T> is_le;

    };

};



template<> struct lambda_impl< int_<1> >

{

    template< typename F, typename Tag, typename Protect > struct result_

    {

        typedef lambda< typename F::arg1, Tag, false_ > l1;

        typedef typename l1::is_le is_le1;

        typedef aux::lambda_or<

              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value

            > is_le;



        typedef bind1<

              typename F::rebind

            , typename l1::type

            > bind_;



        typedef typename if_<

              is_le

            , if_< Protect, mpl::protect<bind_>, bind_ >

            , identity<F>

            >::type type_;



        typedef typename type_::type type;

    };

};



template<> struct lambda_impl< int_<2> >

{

    template< typename F, typename Tag, typename Protect > struct result_

    {

        typedef lambda< typename F::arg1, Tag, false_ > l1;

        typedef lambda< typename F::arg2, Tag, false_ > l2;

        

        typedef typename l1::is_le is_le1;

        typedef typename l2::is_le is_le2;

        



        typedef aux::lambda_or<

              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value

            > is_le;



        typedef bind2<

              typename F::rebind

            , typename l1::type, typename l2::type

            > bind_;



        typedef typename if_<

              is_le

            , if_< Protect, mpl::protect<bind_>, bind_ >

            , identity<F>

            >::type type_;



        typedef typename type_::type type;

    };

};



template<> struct lambda_impl< int_<3> >

{

    template< typename F, typename Tag, typename Protect > struct result_

    {

        typedef lambda< typename F::arg1, Tag, false_ > l1;

        typedef lambda< typename F::arg2, Tag, false_ > l2;

        typedef lambda< typename F::arg3, Tag, false_ > l3;

        

        typedef typename l1::is_le is_le1;

        typedef typename l2::is_le is_le2;

        typedef typename l3::is_le is_le3;

        



        typedef aux::lambda_or<

              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value

            > is_le;



        typedef bind3<

              typename F::rebind

            , typename l1::type, typename l2::type, typename l3::type

            > bind_;



        typedef typename if_<

              is_le

            , if_< Protect, mpl::protect<bind_>, bind_ >

            , identity<F>

            >::type type_;



        typedef typename type_::type type;

    };

};



template<> struct lambda_impl< int_<4> >

{

    template< typename F, typename Tag, typename Protect > struct result_

    {

        typedef lambda< typename F::arg1, Tag, false_ > l1;

        typedef lambda< typename F::arg2, Tag, false_ > l2;

        typedef lambda< typename F::arg3, Tag, false_ > l3;

        typedef lambda< typename F::arg4, Tag, false_ > 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 aux::lambda_or<

              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value

            > is_le;



        typedef bind4<

              typename F::rebind

            , typename l1::type, typename l2::type, typename l3::type

            , typename l4::type

            > bind_;



        typedef typename if_<

              is_le

            , if_< Protect, mpl::protect<bind_>, bind_ >

            , identity<F>

            >::type type_;



        typedef typename type_::type type;

    };

};



template<> struct lambda_impl< int_<5> >

{

    template< typename F, typename Tag, typename Protect > struct result_

    {

        typedef lambda< typename F::arg1, Tag, false_ > l1;

        typedef lambda< typename F::arg2, Tag, false_ > l2;

        typedef lambda< typename F::arg3, Tag, false_ > l3;

        typedef lambda< typename F::arg4, Tag, false_ > l4;

        typedef lambda< typename F::arg5, Tag, false_ > 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 aux::lambda_or<

              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le5)::value

            > is_le;



        typedef bind5<

              typename F::rebind

            , typename l1::type, typename l2::type, typename l3::type

            , typename l4::type, typename l5::type

            > bind_;



        typedef typename if_<

              is_le

            , if_< Protect, mpl::protect<bind_>, bind_ >

            , identity<F>

            >::type type_;



        typedef typename type_::type type;

    };

};



} // namespace aux



template<

      typename T

    , typename Tag

    , typename Protect

    >

struct lambda

{

    /// Metafunction forwarding confuses MSVC 6.x

    typedef typename aux::template_arity<T>::type arity_;

    typedef typename aux::lambda_impl<arity_>

        ::template result_< T,Tag,Protect > l_;



    typedef typename l_::type type;

    typedef typename l_::is_le is_le;

    BOOST_MPL_AUX_LAMBDA_SUPPORT(3, lambda, (T, Tag, Protect))

};



BOOST_MPL_AUX_NA_SPEC2(1, 3, lambda)



template<

      typename T

    >

struct is_lambda_expression

    : lambda<T>::is_le

{

};



}}



