📄 composite.hpp
字号:
typename actor_result<B, TupleT>::type rb = b.eval(args);
typename actor_result<C, TupleT>::type rc = c.eval(args);
typename actor_result<D, TupleT>::type rd = d.eval(args);
typename actor_result<E, TupleT>::type re = e.eval(args);
typename actor_result<F, TupleT>::type rf = f.eval(args);
typename actor_result<G, TupleT>::type rg = g.eval(args);
typename actor_result<H, TupleT>::type rh = h.eval(args);
typename actor_result<I, TupleT>::type ri = i.eval(args);
typename actor_result<J, TupleT>::type rj = j.eval(args);
typename actor_result<K, TupleT>::type rk = k.eval(args);
typename actor_result<L, TupleT>::type rl = l.eval(args);
typename actor_result<M, TupleT>::type rm = m.eval(args);
return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj, rk, rl, rm);
}
mutable OperationT op; // operation
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; // actors
};
///////////////////////////////////////////////////////////////////////////////
//
// composite <14 actors> class
//
///////////////////////////////////////////////////////////////////////////////
template <typename OperationT, typename TupleT,
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>
struct composite14_result {
typedef typename OperationT::template result<
typename actor_result<A, TupleT>::plain_type,
typename actor_result<B, TupleT>::plain_type,
typename actor_result<C, TupleT>::plain_type,
typename actor_result<D, TupleT>::plain_type,
typename actor_result<E, TupleT>::plain_type,
typename actor_result<F, TupleT>::plain_type,
typename actor_result<G, TupleT>::plain_type,
typename actor_result<H, TupleT>::plain_type,
typename actor_result<I, TupleT>::plain_type,
typename actor_result<J, TupleT>::plain_type,
typename actor_result<K, TupleT>::plain_type,
typename actor_result<L, TupleT>::plain_type,
typename actor_result<M, TupleT>::plain_type,
typename actor_result<N, TupleT>::plain_type
>::type type;
};
//////////////////////////////////
template <typename OperationT,
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>
struct composite<OperationT,
A, B, C, D, E, F, G, H, I, J, K, L, M, N, nil_t, nil_t
> {
typedef composite<OperationT,
A, B, C, D, E, F, G, H, I, J, K, L, M, N> self_t;
template <typename TupleT>
struct result {
typedef typename composite14_result<
OperationT, TupleT, A, B, C, D, E, F, G, H, I, J, K, L, M, N
>::type type;
};
composite(OperationT const& op_,
A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
F const& f_, G const& g_, H const& h_, I const& i_, J const& j_,
K const& k_, L const& l_, M const& m_, N const& n_)
: op(op_), 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_) {}
template <typename TupleT>
typename actor_result<self_t, TupleT>::type
eval(TupleT const& args) const
{
typename actor_result<A, TupleT>::type ra = a.eval(args);
typename actor_result<B, TupleT>::type rb = b.eval(args);
typename actor_result<C, TupleT>::type rc = c.eval(args);
typename actor_result<D, TupleT>::type rd = d.eval(args);
typename actor_result<E, TupleT>::type re = e.eval(args);
typename actor_result<F, TupleT>::type rf = f.eval(args);
typename actor_result<G, TupleT>::type rg = g.eval(args);
typename actor_result<H, TupleT>::type rh = h.eval(args);
typename actor_result<I, TupleT>::type ri = i.eval(args);
typename actor_result<J, TupleT>::type rj = j.eval(args);
typename actor_result<K, TupleT>::type rk = k.eval(args);
typename actor_result<L, TupleT>::type rl = l.eval(args);
typename actor_result<M, TupleT>::type rm = m.eval(args);
typename actor_result<N, TupleT>::type rn = n.eval(args);
return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj, rk, rl, rm, rn);
}
mutable OperationT op; // operation
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; // actors
};
///////////////////////////////////////////////////////////////////////////////
//
// composite <15 actors> class
//
///////////////////////////////////////////////////////////////////////////////
template <typename OperationT, typename TupleT,
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>
struct composite15_result {
typedef typename OperationT::template result<
typename actor_result<A, TupleT>::plain_type,
typename actor_result<B, TupleT>::plain_type,
typename actor_result<C, TupleT>::plain_type,
typename actor_result<D, TupleT>::plain_type,
typename actor_result<E, TupleT>::plain_type,
typename actor_result<F, TupleT>::plain_type,
typename actor_result<G, TupleT>::plain_type,
typename actor_result<H, TupleT>::plain_type,
typename actor_result<I, TupleT>::plain_type,
typename actor_result<J, TupleT>::plain_type,
typename actor_result<K, TupleT>::plain_type,
typename actor_result<L, TupleT>::plain_type,
typename actor_result<M, TupleT>::plain_type,
typename actor_result<N, TupleT>::plain_type,
typename actor_result<O, TupleT>::plain_type
>::type type;
};
//////////////////////////////////
template <typename OperationT,
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>
struct composite<OperationT,
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, nil_t
> {
typedef composite<OperationT,
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O> self_t;
template <typename TupleT>
struct result {
typedef typename composite15_result<
OperationT, TupleT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O
>::type type;
};
composite(OperationT const& op_,
A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
F const& f_, G const& g_, H const& h_, I const& i_, J const& j_,
K const& k_, L const& l_, M const& m_, N const& n_, O const& o_)
: op(op_), 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_) {}
template <typename TupleT>
typename actor_result<self_t, TupleT>::type
eval(TupleT const& args) const
{
typename actor_result<A, TupleT>::type ra = a.eval(args);
typename actor_result<B, TupleT>::type rb = b.eval(args);
typename actor_result<C, TupleT>::type rc = c.eval(args);
typename actor_result<D, TupleT>::type rd = d.eval(args);
typename actor_result<E, TupleT>::type re = e.eval(args);
typename actor_result<F, TupleT>::type rf = f.eval(args);
typename actor_result<G, TupleT>::type rg = g.eval(args);
typename actor_result<H, TupleT>::type rh = h.eval(args);
typename actor_result<I, TupleT>::type ri = i.eval(args);
typename actor_result<J, TupleT>::type rj = j.eval(args);
typename actor_result<K, TupleT>::type rk = k.eval(args);
typename actor_result<L, TupleT>::type rl = l.eval(args);
typename actor_result<M, TupleT>::type rm = m.eval(args);
typename actor_result<N, TupleT>::type rn = n.eval(args);
typename actor_result<O, TupleT>::type ro = o.eval(args);
return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj, rk, rl, rm, rn, ro);
}
mutable OperationT op; // operation
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; // actors
};
#endif
#endif
#endif
#endif
namespace impl {
///////////////////////////////////////////////////////////////////////////
//
// make_composite is basically a type computer that answers the
// question "Given types T0..TN, what composite type should I
// create <composite_type> and if I were to generate an actual
// composite, what type <type> should I return?"
//
///////////////////////////////////////////////////////////////////////////
template <
typename OperationT
, typename A = nil_t
, typename B = nil_t
, typename C = nil_t
#if PHOENIX_LIMIT > 3
, typename D = nil_t
, typename E = nil_t
, typename F = nil_t
#if PHOENIX_LIMIT > 6
, typename G = nil_t
, typename H = nil_t
, typename I = nil_t
#if PHOENIX_LIMIT > 9
, typename J = nil_t
, typename K = nil_t
, typename L = nil_t
#if PHOENIX_LIMIT > 12
, typename M = nil_t
, typename N = nil_t
, typename O = nil_t
#endif
#endif
#endif
#endif
>
struct make_composite {
typedef composite<OperationT
, typename as_actor<A>::type
, typename as_actor<B>::type
, typename as_actor<C>::type
#if PHOENIX_LIMIT > 3
, typename as_actor<D>::type
, typename as_actor<E>::type
, typename as_actor<F>::type
#if PHOENIX_LIMIT > 6
, typename as_actor<G>::type
, typename as_actor<H>::type
, typename as_actor<I>::type
#if PHOENIX_LIMIT > 9
, typename as_actor<J>::type
, typename as_actor<K>::type
, typename as_actor<L>::type
#if PHOENIX_LIMIT > 12
, typename as_actor<M>::type
, typename as_actor<N>::type
, typename as_actor<O>::type
#endif
#endif
#endif
#endif
> composite_type;
typedef actor<composite_type> type;
};
///////////////////////////////////////////////////////////////////////////
//
// make_unary, make_binary, make_binary1, make_binary2 and
// make_binary3 utilities are provided here for easy creation of
// unary and binary composites.
//
///////////////////////////////////////////////////////////////////////////
////////////////////////////////// input is an actor
template <typename OperationT, typename BaseT>
struct make_unary {
typedef typename make_composite
<OperationT, actor<BaseT> >::type type;
static type
construct(actor<BaseT> const& _0)
{
typedef typename make_composite
<OperationT, actor<BaseT> >::composite_type
ret_t;
return ret_t(OperationT(), _0);
}
};
////////////////////////////////// LHS is an actor, RHS is unknown
template <typename OperationT, typename BaseT, typename B>
struct make_binary1 {
typedef typename make_composite
<OperationT, actor<BaseT>, B>::type type;
static type
construct(actor<BaseT> const& _0, B const& _1)
{
typedef typename make_composite
<OperationT, actor<BaseT>, B>::composite_type
ret_t;
return ret_t(OperationT(), _0, as_actor<B>::convert(_1));
}
};
////////////////////////////////// LHS is unknown, RHS is an actor
template <typename OperationT, typename A, typename BaseT>
struct make_binary2 {
typedef typename make_composite
<OperationT, A, actor<BaseT> >::type type;
static type
construct(A const& _0, actor<BaseT> const& _1)
{
typedef typename make_composite
<OperationT, A, actor<BaseT> >::composite_type
ret_t;
return ret_t(OperationT(), as_actor<A>::convert(_0), _1);
}
};
////////////////////////////////// Both LHS and RHS are actors
template <typename OperationT, typename BaseA, typename BaseB>
struct make_binary3 {
typedef typename make_composite
<OperationT, actor<BaseA>, actor<BaseB> >::type type;
static type
construct(actor<BaseA> const& _0, actor<BaseB> const& _1)
{
typedef typename make_composite
<OperationT, actor<BaseA>, actor<BaseB> >::composite_type
ret_t;
return ret_t(OperationT(), _0, _1);
}
};
} // namespace impl
} // namespace phoenix
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -