123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615 |
- // Boost Lambda Library lambda_functor_base.hpp -----------------------------
- //
- // Copyright (C) 1999, 2000 Jaakko Jarvi ([email protected])
- //
- // 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)
- //
- // For more information, see www.boost.org
- // ------------------------------------------------------------
- #ifndef BOOST_LAMBDA_LAMBDA_FUNCTOR_BASE_HPP
- #define BOOST_LAMBDA_LAMBDA_FUNCTOR_BASE_HPP
- #include "boost/type_traits/add_reference.hpp"
- #include "boost/type_traits/add_const.hpp"
- #include "boost/type_traits/remove_const.hpp"
- #include "boost/lambda/detail/lambda_fwd.hpp"
- #include "boost/lambda/detail/lambda_traits.hpp"
- namespace boost {
- namespace lambda {
- #if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
- #pragma warning(push)
- #pragma warning(disable:4512) //assignment operator could not be generated
- #endif
- // for return type deductions we wrap bound argument to this class,
- // which fulfils the base class contract for lambda_functors
- template <class T>
- class identity {
- T elem;
- public:
-
- typedef T element_t;
- // take all parameters as const references. Note that non-const references
- // stay as they are.
- typedef typename boost::add_reference<
- typename boost::add_const<T>::type
- >::type par_t;
- explicit identity(par_t t) : elem(t) {}
- template <typename SigArgs>
- struct sig { typedef typename boost::remove_const<element_t>::type type; };
- template<class RET, CALL_TEMPLATE_ARGS>
- RET call(CALL_FORMAL_ARGS) const { CALL_USE_ARGS; return elem; }
- };
- #if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
- #pragma warning(pop)
- #endif
- template <class T>
- inline lambda_functor<identity<T&> > var(T& t) { return identity<T&>(t); }
- // for lambda functors, var is an identity operator. It was forbidden
- // at some point, but we might want to var something that can be a
- // non-lambda functor or a lambda functor.
- template <class T>
- lambda_functor<T> var(const lambda_functor<T>& t) { return t; }
- template <class T> struct var_type {
- typedef lambda_functor<identity<T&> > type;
- };
- template <class T>
- inline
- lambda_functor<identity<typename bound_argument_conversion<const T>::type> >
- constant(const T& t) {
- return identity<typename bound_argument_conversion<const T>::type>(t);
- }
- template <class T>
- lambda_functor<T> constant(const lambda_functor<T>& t) { return t; }
- template <class T> struct constant_type {
- typedef
- lambda_functor<
- identity<typename bound_argument_conversion<const T>::type>
- > type;
- };
- template <class T>
- inline lambda_functor<identity<const T&> > constant_ref(const T& t) {
- return identity<const T&>(t);
- }
- template <class T>
- lambda_functor<T> constant_ref(const lambda_functor<T>& t) { return t; }
- template <class T> struct constant_ref_type {
- typedef
- lambda_functor<identity<const T&> > type;
- };
- // as_lambda_functor turns any types to lambda functors
- // non-lambda_functors will be bound argument types
- template <class T>
- struct as_lambda_functor {
- typedef typename
- detail::remove_reference_and_cv<T>::type plain_T;
- typedef typename
- detail::IF<is_lambda_functor<plain_T>::value,
- plain_T,
- lambda_functor<
- identity<typename bound_argument_conversion<T>::type>
- >
- >::RET type;
- };
- // turns arbitrary objects into lambda functors
- template <class T>
- inline
- lambda_functor<identity<typename bound_argument_conversion<const T>::type> >
- to_lambda_functor(const T& t) {
- return identity<typename bound_argument_conversion<const T>::type>(t);
- }
- template <class T>
- inline lambda_functor<T>
- to_lambda_functor(const lambda_functor<T>& t) {
- return t;
- }
- namespace detail {
- // In a call constify_rvals<T>::go(x)
- // x should be of type T. If T is a non-reference type, do
- // returns x as const reference.
- // Otherwise the type doesn't change.
- // The purpose of this class is to avoid
- // 'cannot bind temporaries to non-const references' errors.
- template <class T> struct constify_rvals {
- template<class U>
- static inline const U& go(const U& u) { return u; }
- };
- template <class T> struct constify_rvals<T&> {
- template<class U>
- static inline U& go(U& u) { return u; }
- };
- // check whether one of the elements of a tuple (cons list) is of type
- // null_type. Needed, because the compiler goes ahead and instantiates
- // sig template for nullary case even if the nullary operator() is not
- // called
- template <class T> struct is_null_type
- { BOOST_STATIC_CONSTANT(bool, value = false); };
- template <> struct is_null_type<null_type>
- { BOOST_STATIC_CONSTANT(bool, value = true); };
- template<class Tuple> struct has_null_type {
- BOOST_STATIC_CONSTANT(bool, value = (is_null_type<typename Tuple::head_type>::value || has_null_type<typename Tuple::tail_type>::value));
- };
- template<> struct has_null_type<null_type> {
- BOOST_STATIC_CONSTANT(bool, value = false);
- };
- // helpers -------------------
- template<class Args, class SigArgs>
- class deduce_argument_types_ {
- typedef typename as_lambda_functor<typename Args::head_type>::type lf_t;
- typedef typename lf_t::inherited::template sig<SigArgs>::type el_t;
- public:
- typedef
- boost::tuples::cons<
- el_t,
- typename deduce_argument_types_<typename Args::tail_type, SigArgs>::type
- > type;
- };
- template<class SigArgs>
- class deduce_argument_types_<null_type, SigArgs> {
- public:
- typedef null_type type;
- };
- // // note that tuples cannot have plain function types as elements.
- // // Hence, all other types will be non-const, except references to
- // // functions.
- // template <class T> struct remove_reference_except_from_functions {
- // typedef typename boost::remove_reference<T>::type t;
- // typedef typename detail::IF<boost::is_function<t>::value, T, t>::RET type;
- // };
- template<class Args, class SigArgs>
- class deduce_non_ref_argument_types_ {
- typedef typename as_lambda_functor<typename Args::head_type>::type lf_t;
- typedef typename lf_t::inherited::template sig<SigArgs>::type el_t;
- public:
- typedef
- boost::tuples::cons<
- // typename detail::remove_reference_except_from_functions<el_t>::type,
- typename boost::remove_reference<el_t>::type,
- typename deduce_non_ref_argument_types_<typename Args::tail_type, SigArgs>::type
- > type;
- };
- template<class SigArgs>
- class deduce_non_ref_argument_types_<null_type, SigArgs> {
- public:
- typedef null_type type;
- };
- // -------------
- // take stored Args and Open Args, and return a const list with
- // deduced elements (real return types)
- template<class Args, class SigArgs>
- class deduce_argument_types {
- typedef typename deduce_argument_types_<Args, SigArgs>::type t1;
- public:
- typedef typename detail::IF<
- has_null_type<t1>::value, null_type, t1
- >::RET type;
- };
- // take stored Args and Open Args, and return a const list with
- // deduced elements (references are stripped from the element types)
- template<class Args, class SigArgs>
- class deduce_non_ref_argument_types {
- typedef typename deduce_non_ref_argument_types_<Args, SigArgs>::type t1;
- public:
- typedef typename detail::IF<
- has_null_type<t1>::value, null_type, t1
- >::RET type;
- };
- template <int N, class Args, class SigArgs>
- struct nth_return_type_sig {
- typedef typename
- as_lambda_functor<
- typename boost::tuples::element<N, Args>::type
- // typename tuple_element_as_reference<N, Args>::type
- >::type lf_type;
- typedef typename lf_type::inherited::template sig<SigArgs>::type type;
- };
- template<int N, class Tuple> struct element_or_null {
- typedef typename boost::tuples::element<N, Tuple>::type type;
- };
- template<int N> struct element_or_null<N, null_type> {
- typedef null_type type;
- };
-
-
- } // end detail
-
- // -- lambda_functor base ---------------------
- // the explicit_return_type_action case -----------------------------------
- template<class RET, class Args>
- class lambda_functor_base<explicit_return_type_action<RET>, Args>
- {
- public:
- Args args;
- typedef RET result_type;
- explicit lambda_functor_base(const Args& a) : args(a) {}
- template <class SigArgs> struct sig { typedef RET type; };
- template<class RET_, CALL_TEMPLATE_ARGS>
- RET call(CALL_FORMAL_ARGS) const
- {
- return detail::constify_rvals<RET>::go(
- detail::r_select<RET>::go(boost::tuples::get<0>(args), CALL_ACTUAL_ARGS));
- }
- };
- // the protect_action case -----------------------------------
- template<class Args>
- class lambda_functor_base<protect_action, Args>
- {
- public:
- Args args;
- public:
- explicit lambda_functor_base(const Args& a) : args(a) {}
- template<class RET, CALL_TEMPLATE_ARGS>
- RET call(CALL_FORMAL_ARGS) const
- {
- CALL_USE_ARGS;
- return boost::tuples::get<0>(args);
- }
- template<class SigArgs> struct sig {
- // typedef typename detail::tuple_element_as_reference<0, SigArgs>::type type;
- typedef typename boost::tuples::element<0, Args>::type type;
- };
- };
- // Do nothing --------------------------------------------------------
- class do_nothing_action {};
- template<class Args>
- class lambda_functor_base<do_nothing_action, Args> {
- // Args args;
- public:
- // explicit lambda_functor_base(const Args& a) {}
- lambda_functor_base() {}
- template<class RET, CALL_TEMPLATE_ARGS> RET call(CALL_FORMAL_ARGS) const {
- return CALL_USE_ARGS;
- }
- template<class SigArgs> struct sig { typedef void type; };
- };
- // These specializations provide a shorter notation to define actions.
- // These lambda_functor_base instances take care of the recursive evaluation
- // of the arguments and pass the evaluated arguments to the apply function
- // of an action class. To make action X work with these classes, one must
- // instantiate the lambda_functor_base as:
- // lambda_functor_base<action<ARITY, X>, Args>
- // Where ARITY is the arity of the apply function in X
- // The return type is queried as:
- // return_type_N<X, EvaluatedArgumentTypes>::type
- // for which there must be a specialization.
- // Function actions, casts, throws,... all go via these classes.
- template<class Act, class Args>
- class lambda_functor_base<action<0, Act>, Args>
- {
- public:
- // Args args; not needed
- explicit lambda_functor_base(const Args& /*a*/) {}
-
- template<class SigArgs> struct sig {
- typedef typename return_type_N<Act, null_type>::type type;
- };
-
- template<class RET, CALL_TEMPLATE_ARGS>
- RET call(CALL_FORMAL_ARGS) const {
- CALL_USE_ARGS;
- return Act::template apply<RET>();
- }
- };
- #if defined BOOST_LAMBDA_LAMBDA_FUNCTOR_BASE_FIRST_PART
- #error "Multiple defines of BOOST_LAMBDA_LAMBDA_FUNCTOR_BASE_FIRST_PART"
- #endif
-
-
- #define BOOST_LAMBDA_LAMBDA_FUNCTOR_BASE_FIRST_PART(ARITY) \
- template<class Act, class Args> \
- class lambda_functor_base<action<ARITY, Act>, Args> \
- { \
- public: \
- Args args; \
- \
- explicit lambda_functor_base(const Args& a) : args(a) {} \
- \
- template<class SigArgs> struct sig { \
- typedef typename \
- detail::deduce_argument_types<Args, SigArgs>::type rets_t; \
- public: \
- typedef typename \
- return_type_N_prot<Act, rets_t>::type type; \
- }; \
- \
- \
- template<class RET, CALL_TEMPLATE_ARGS> \
- RET call(CALL_FORMAL_ARGS) const { \
- using boost::tuples::get; \
- using detail::constify_rvals; \
- using detail::r_select; \
- using detail::element_or_null; \
- using detail::deduce_argument_types;
- BOOST_LAMBDA_LAMBDA_FUNCTOR_BASE_FIRST_PART(1)
- typedef typename
- deduce_argument_types<Args, tuple<CALL_REFERENCE_TYPES> >::type rets_t;
- typedef typename element_or_null<0, rets_t>::type rt0;
- return Act::template apply<RET>(
- constify_rvals<rt0>::go(r_select<rt0>::go(get<0>(args), CALL_ACTUAL_ARGS))
- );
- }
- };
- BOOST_LAMBDA_LAMBDA_FUNCTOR_BASE_FIRST_PART(2)
-
- typedef typename
- deduce_argument_types<Args, tuple<CALL_REFERENCE_TYPES> >::type rets_t;
- typedef typename element_or_null<0, rets_t>::type rt0;
- typedef typename element_or_null<1, rets_t>::type rt1;
- return Act::template apply<RET>(
- constify_rvals<rt0>::go(r_select<rt0>::go(get<0>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt1>::go(r_select<rt1>::go(get<1>(args), CALL_ACTUAL_ARGS))
- );
- }
- };
- BOOST_LAMBDA_LAMBDA_FUNCTOR_BASE_FIRST_PART(3)
- typedef typename
- deduce_argument_types<Args, tuple<CALL_REFERENCE_TYPES> >::type rets_t;
- typedef typename element_or_null<0, rets_t>::type rt0;
- typedef typename element_or_null<1, rets_t>::type rt1;
- typedef typename element_or_null<2, rets_t>::type rt2;
- return Act::template apply<RET>(
- constify_rvals<rt0>::go(r_select<rt0>::go(get<0>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt1>::go(r_select<rt1>::go(get<1>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt2>::go(r_select<rt2>::go(get<2>(args), CALL_ACTUAL_ARGS))
- );
- }
- };
- BOOST_LAMBDA_LAMBDA_FUNCTOR_BASE_FIRST_PART(4)
- typedef typename
- deduce_argument_types<Args, tuple<CALL_REFERENCE_TYPES> >::type rets_t;
- typedef typename element_or_null<0, rets_t>::type rt0;
- typedef typename element_or_null<1, rets_t>::type rt1;
- typedef typename element_or_null<2, rets_t>::type rt2;
- typedef typename element_or_null<3, rets_t>::type rt3;
- return Act::template apply<RET>(
- constify_rvals<rt0>::go(r_select<rt0>::go(get<0>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt1>::go(r_select<rt1>::go(get<1>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt2>::go(r_select<rt2>::go(get<2>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt3>::go(r_select<rt3>::go(get<3>(args), CALL_ACTUAL_ARGS))
- );
- }
- };
- BOOST_LAMBDA_LAMBDA_FUNCTOR_BASE_FIRST_PART(5)
- typedef typename
- deduce_argument_types<Args, tuple<CALL_REFERENCE_TYPES> >::type rets_t;
- typedef typename element_or_null<0, rets_t>::type rt0;
- typedef typename element_or_null<1, rets_t>::type rt1;
- typedef typename element_or_null<2, rets_t>::type rt2;
- typedef typename element_or_null<3, rets_t>::type rt3;
- typedef typename element_or_null<4, rets_t>::type rt4;
- return Act::template apply<RET>(
- constify_rvals<rt0>::go(r_select<rt0>::go(get<0>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt1>::go(r_select<rt1>::go(get<1>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt2>::go(r_select<rt2>::go(get<2>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt3>::go(r_select<rt3>::go(get<3>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt4>::go(r_select<rt4>::go(get<4>(args), CALL_ACTUAL_ARGS))
- );
- }
- };
- BOOST_LAMBDA_LAMBDA_FUNCTOR_BASE_FIRST_PART(6)
- typedef typename
- deduce_argument_types<Args, tuple<CALL_REFERENCE_TYPES> >::type rets_t;
- typedef typename element_or_null<0, rets_t>::type rt0;
- typedef typename element_or_null<1, rets_t>::type rt1;
- typedef typename element_or_null<2, rets_t>::type rt2;
- typedef typename element_or_null<3, rets_t>::type rt3;
- typedef typename element_or_null<4, rets_t>::type rt4;
- typedef typename element_or_null<5, rets_t>::type rt5;
- return Act::template apply<RET>(
- constify_rvals<rt0>::go(r_select<rt0>::go(get<0>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt1>::go(r_select<rt1>::go(get<1>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt2>::go(r_select<rt2>::go(get<2>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt3>::go(r_select<rt3>::go(get<3>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt4>::go(r_select<rt4>::go(get<4>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt5>::go(r_select<rt5>::go(get<5>(args), CALL_ACTUAL_ARGS))
- );
- }
- };
- BOOST_LAMBDA_LAMBDA_FUNCTOR_BASE_FIRST_PART(7)
- typedef typename
- deduce_argument_types<Args, tuple<CALL_REFERENCE_TYPES> >::type rets_t;
- typedef typename element_or_null<0, rets_t>::type rt0;
- typedef typename element_or_null<1, rets_t>::type rt1;
- typedef typename element_or_null<2, rets_t>::type rt2;
- typedef typename element_or_null<3, rets_t>::type rt3;
- typedef typename element_or_null<4, rets_t>::type rt4;
- typedef typename element_or_null<5, rets_t>::type rt5;
- typedef typename element_or_null<6, rets_t>::type rt6;
- return Act::template apply<RET>(
- constify_rvals<rt0>::go(r_select<rt0>::go(get<0>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt1>::go(r_select<rt1>::go(get<1>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt2>::go(r_select<rt2>::go(get<2>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt3>::go(r_select<rt3>::go(get<3>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt4>::go(r_select<rt4>::go(get<4>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt5>::go(r_select<rt5>::go(get<5>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt6>::go(r_select<rt6>::go(get<6>(args), CALL_ACTUAL_ARGS))
- );
- }
- };
- BOOST_LAMBDA_LAMBDA_FUNCTOR_BASE_FIRST_PART(8)
- typedef typename
- deduce_argument_types<Args, tuple<CALL_REFERENCE_TYPES> >::type rets_t;
- typedef typename element_or_null<0, rets_t>::type rt0;
- typedef typename element_or_null<1, rets_t>::type rt1;
- typedef typename element_or_null<2, rets_t>::type rt2;
- typedef typename element_or_null<3, rets_t>::type rt3;
- typedef typename element_or_null<4, rets_t>::type rt4;
- typedef typename element_or_null<5, rets_t>::type rt5;
- typedef typename element_or_null<6, rets_t>::type rt6;
- typedef typename element_or_null<7, rets_t>::type rt7;
- return Act::template apply<RET>(
- constify_rvals<rt0>::go(r_select<rt0>::go(get<0>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt1>::go(r_select<rt1>::go(get<1>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt2>::go(r_select<rt2>::go(get<2>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt3>::go(r_select<rt3>::go(get<3>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt4>::go(r_select<rt4>::go(get<4>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt5>::go(r_select<rt5>::go(get<5>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt6>::go(r_select<rt6>::go(get<6>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt7>::go(r_select<rt7>::go(get<7>(args), CALL_ACTUAL_ARGS))
- );
- }
- };
- BOOST_LAMBDA_LAMBDA_FUNCTOR_BASE_FIRST_PART(9)
- typedef typename
- deduce_argument_types<Args, tuple<CALL_REFERENCE_TYPES> >::type rets_t;
- typedef typename element_or_null<0, rets_t>::type rt0;
- typedef typename element_or_null<1, rets_t>::type rt1;
- typedef typename element_or_null<2, rets_t>::type rt2;
- typedef typename element_or_null<3, rets_t>::type rt3;
- typedef typename element_or_null<4, rets_t>::type rt4;
- typedef typename element_or_null<5, rets_t>::type rt5;
- typedef typename element_or_null<6, rets_t>::type rt6;
- typedef typename element_or_null<7, rets_t>::type rt7;
- typedef typename element_or_null<8, rets_t>::type rt8;
- return Act::template apply<RET>(
- constify_rvals<rt0>::go(r_select<rt0>::go(get<0>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt1>::go(r_select<rt1>::go(get<1>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt2>::go(r_select<rt2>::go(get<2>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt3>::go(r_select<rt3>::go(get<3>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt4>::go(r_select<rt4>::go(get<4>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt5>::go(r_select<rt5>::go(get<5>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt6>::go(r_select<rt6>::go(get<6>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt7>::go(r_select<rt7>::go(get<7>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt8>::go(r_select<rt8>::go(get<8>(args), CALL_ACTUAL_ARGS))
- );
- }
- };
- BOOST_LAMBDA_LAMBDA_FUNCTOR_BASE_FIRST_PART(10)
- typedef typename
- deduce_argument_types<Args, tuple<CALL_REFERENCE_TYPES> >::type rets_t;
- typedef typename element_or_null<0, rets_t>::type rt0;
- typedef typename element_or_null<1, rets_t>::type rt1;
- typedef typename element_or_null<2, rets_t>::type rt2;
- typedef typename element_or_null<3, rets_t>::type rt3;
- typedef typename element_or_null<4, rets_t>::type rt4;
- typedef typename element_or_null<5, rets_t>::type rt5;
- typedef typename element_or_null<6, rets_t>::type rt6;
- typedef typename element_or_null<7, rets_t>::type rt7;
- typedef typename element_or_null<8, rets_t>::type rt8;
- typedef typename element_or_null<9, rets_t>::type rt9;
- return Act::template apply<RET>(
- constify_rvals<rt0>::go(r_select<rt0>::go(get<0>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt1>::go(r_select<rt1>::go(get<1>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt2>::go(r_select<rt2>::go(get<2>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt3>::go(r_select<rt3>::go(get<3>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt4>::go(r_select<rt4>::go(get<4>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt5>::go(r_select<rt5>::go(get<5>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt6>::go(r_select<rt6>::go(get<6>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt7>::go(r_select<rt7>::go(get<7>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt8>::go(r_select<rt8>::go(get<8>(args), CALL_ACTUAL_ARGS)),
- constify_rvals<rt9>::go(r_select<rt9>::go(get<9>(args), CALL_ACTUAL_ARGS))
- );
- }
- };
- #undef BOOST_LAMBDA_LAMBDA_FUNCTOR_BASE_FIRST_PART
- } // namespace lambda
- } // namespace boost
- #endif
|