lambda_functor_base.hpp

来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 600 行 · 第 1/2 页

HPP
600
字号
// 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 specializatoins 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_non_ref_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

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?