actor.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 596 行 · 第 1/2 页

HPP
596
字号
/*=============================================================================    Phoenix v1.2    Copyright (c) 2001-2002 Joel de Guzman  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)==============================================================================*/#ifndef PHOENIX_ACTOR_HPP#define PHOENIX_ACTOR_HPP///////////////////////////////////////////////////////////////////////////////#include <boost/spirit/home/classic/phoenix/tuples.hpp>///////////////////////////////////////////////////////////////////////////////namespace phoenix {//  These are forward declared here because we cannot include impl.hpp//  or operators.hpp yet but the actor's assignment operator and index//  operator are required to be members.//////////////////////////////////struct assign_op;struct index_op;//////////////////////////////////namespace impl {    template <typename OperationT, typename BaseT, typename B>    struct make_binary1;}///////////////////////////////////////////////////////////////////////////////////  unpack_tuple class////      This class is used to unpack a supplied tuple such, that the members of //      this tuple will be handled as if they would be supplied separately./////////////////////////////////////////////////////////////////////////////////template <typename TupleT>struct unpack_tuple : public TupleT {    typedef TupleT tuple_t;        unpack_tuple() {}    unpack_tuple(tuple_t const &tuple_) : TupleT(tuple_) {}};///////////////////////////////////////////////////////////////////////////////////  actor class////      This class is a protocol class for all actors. This class is//      essentially an interface contract. The actor class does not//      really know how how to act on anything but instead relies on the//      template parameter BaseT (from which the actor will derive from)//      to do the actual action.////      An actor is a functor that is capable of accepting arguments up//      to a predefined maximum. It is up to the base class to do the//      actual processing or possibly to limit the arity (no. of//      arguments) passed in. Upon invocation of the functor through a//      supplied operator(), the actor funnels the arguments passed in//      by the client into a tuple and calls the base eval member//      function.////      Schematically:////          arg0 ---------|//          arg1 ---------|//          arg2 ---------|---> tupled_args ---> base.eval//          ...           |//          argN ---------|////          actor::operator()(arg0, arg1... argN)//              ---> BaseT::eval(tupled_args);////      Actor base classes from which this class inherits from are//      expected to have a corresponding member function eval compatible//      with the conceptual Interface:////          template <typename TupleT>//          actor_return_type//          eval(TupleT const& args) const;////      where args are the actual arguments passed in by the client//      funneled into a tuple (see tuple.hpp for details).////      The actor_return_type can be anything. Base classes are free to//      return any type, even argument dependent types (types that are//      deduced from the types of the arguments). After evaluating the//      parameters and doing some computations or actions, the eval//      member function concludes by returning something back to the//      client. To do this, the forwarding function (the actor's//      operator()) needs to know the return type of the eval member//      function that it is calling. For this purpose, actor base//      classes are required to provide a nested template class:////          template <typename TupleT>//          struct result;////      This auxiliary class provides the result type information//      returned by the eval member function of a base actor class. The//      nested template class result should have a typedef 'type' that//      reflects the return type of its member function eval. It is//      basically a type computer that answers the question "given//      arguments packed into a TupleT type, what will be the result//      type of the eval member function of ActorT?". The template class//      actor_result queries this to extract the return type of an//      actor. Example:////          typedef typename actor_result<ActorT, TupleT>::type//              actor_return_type;////      where actor_return_type is the actual type returned by ActorT's//      eval member function given some arguments in a TupleT./////////////////////////////////////////////////////////////////////////////////template <typename ActorT, typename TupleT>struct actor_result {    typedef typename ActorT::template result<TupleT>::type type;    typedef typename remove_reference<type>::type plain_type;};//////////////////////////////////template <typename BaseT>struct actor : public BaseT {    actor();    actor(BaseT const& base);    typename actor_result<BaseT, tuple<> >::type    operator()() const;    template <typename A>    typename actor_result<BaseT, tuple<A&> >::type    operator()(A& a) const;    template <typename A, typename B>    typename actor_result<BaseT, tuple<A&, B&> >::type    operator()(A& a, B& b) const;    template <typename A, typename B, typename C>    typename actor_result<BaseT, tuple<A&, B&, C&> >::type    operator()(A& a, B& b, C& c) const;#if PHOENIX_LIMIT > 3    template <typename A, typename B, typename C, typename D>    typename actor_result<BaseT, tuple<A&, B&, C&, D&> >::type    operator()(A& a, B& b, C& c, D& d) const;    template <typename A, typename B, typename C, typename D, typename E>    typename actor_result<BaseT, tuple<A&, B&, C&, D&, E&> >::type    operator()(A& a, B& b, C& c, D& d, E& e) const;    template <        typename A, typename B, typename C, typename D, typename E,        typename F>    typename actor_result<BaseT, tuple<A&, B&, C&, D&, E&, F&> >::type    operator()(A& a, B& b, C& c, D& d, E& e, F& f) const;#if PHOENIX_LIMIT > 6    template <        typename A, typename B, typename C, typename D, typename E,        typename F, typename G>    typename actor_result<BaseT, tuple<A&, B&, C&, D&, E&, F&, G&> >::type    operator()(A& a, B& b, C& c, D& d, E& e, F& f, G& g) const;    template <        typename A, typename B, typename C, typename D, typename E,        typename F, typename G, typename H>    typename actor_result<BaseT,        tuple<A&, B&, C&, D&, E&, F&, G&, H&>    >::type    operator()(A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h) const;    template <        typename A, typename B, typename C, typename D, typename E,        typename F, typename G, typename H, typename I>    typename actor_result<BaseT,        tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&>    >::type    operator()(A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i) const;#if PHOENIX_LIMIT > 9    template <        typename A, typename B, typename C, typename D, typename E,        typename F, typename G, typename H, typename I, typename J>    typename actor_result<BaseT,        tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&>    >::type    operator()(        A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i, J& j) const;    template <        typename A, typename B, typename C, typename D, typename E,        typename F, typename G, typename H, typename I, typename J,        typename K>    typename actor_result<BaseT,        tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&>    >::type    operator()(        A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i, J& j,        K& k) const;    template <        typename A, typename B, typename C, typename D, typename E,        typename F, typename G, typename H, typename I, typename J,        typename K, typename L>    typename actor_result<BaseT,        tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&>    >::type    operator()(        A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i, J& j,        K& k, L& l) const;#if PHOENIX_LIMIT > 12    template <        typename A, typename B, typename C, typename D, typename E,        typename F, typename G, typename H, typename I, typename J,        typename K, typename L, typename M>    typename actor_result<BaseT,        tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&, M&>    >::type    operator()(        A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i, J& j,        K& k, L& l, M& m) const;    template <        typename A, typename B, typename C, typename D, typename E,        typename F, typename G, typename H, typename I, typename J,        typename K, typename L, typename M, typename N>    typename actor_result<BaseT,        tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&, M&, N&>    >::type    operator()(        A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i, J& j,        K& k, L& l, M& m, N& n) const;    template <        typename A, typename B, typename C, typename D, typename E,        typename F, typename G, typename H, typename I, typename J,        typename K, typename L, typename M, typename N, typename O>    typename actor_result<BaseT,        tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&, M&, N&, O&>    >::type    operator()(        A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i, J& j,        K& k, L& l, M& m, N& n, O& o) const;#endif#endif#endif#endif    template <typename TupleT>    typename actor_result<BaseT, unpack_tuple<TupleT> >::type    operator()(unpack_tuple<TupleT> const &t) const;        template <typename B>    typename impl::make_binary1<assign_op, BaseT, B>::type    operator=(B const& b) const;    template <typename B>    typename impl::make_binary1<index_op, BaseT, B>::type    operator[](B const& b) const;};///////////////////////////////////////////////////////////////////////////////  as_actor////      as_actor is a meta-program that converts an arbitrary type into//      an actor. All participants in the framework must be first-class//      actors. This meta-program is used all throughout the framework//      whenever an unknown type needs to be converted to an actor.//      as_actor specializations are expected to have a typedef 'type'.//      This is the destination actor type. A static member function//      'convert' converts an object to this target type.////      The meta-program does no conversion if the object to be//      converted is already an actor./////////////////////////////////////////////////////////////////////////////template <typename T>struct as_actor;//////////////////////////////////template <typename BaseT>struct as_actor<actor<BaseT> > {    typedef actor<BaseT> type;    static type convert(actor<BaseT> const& x) { return x; }};

⌨️ 快捷键说明

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