616 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			616 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | // Boost Lambda Library  lambda_functor_base.hpp ----------------------------- | ||
|  | // | ||
|  | // Copyright (C) 1999, 2000 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi) | ||
|  | // | ||
|  | // 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 |