diff -r 000000000000 -r bde4ae8d615e os/ossrv/ossrv_pub/boost_apis/boost/spirit/phoenix/composite.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/ossrv/ossrv_pub/boost_apis/boost/spirit/phoenix/composite.hpp Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,1423 @@ +/*============================================================================= + Phoenix V1.2.1 + Copyright (c) 2001-2002 Joel de Guzman + + Use, modification and distribution is subject to 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_COMPOSITE_HPP +#define PHOENIX_COMPOSITE_HPP + +/////////////////////////////////////////////////////////////////////////////// +#include + +/////////////////////////////////////////////////////////////////////////////// +namespace phoenix { + +/////////////////////////////////////////////////////////////////////////////// +// +// composite class +// +// A composite is an actor base class composed of zero or more +// actors (see actor.hpp) and an operation. A composite is itself +// an actor superclass and conforms to its conceptual interface. +// Its eval member function un-funnels the tupled actual arguments +// from the tuple by invoking each of the actors' eval member +// function. The results of each are then passed on as arguments to +// the operation. Specializations are provided to handle different +// numbers of actors. +// +// Schematically: +// +// actor0.eval(tupled_args) --> arg0 --> | +// actor1.eval(tupled_args) --> arg1 --> | +// actor2.eval(tupled_args) --> arg3 --> | --> operation(arg0...argN) +// ... | +// actorN.eval(tupled_args) --> argN --> | +// +// The operation can be any suitable functor that can accept the +// arguments passed in by the composite. The operation is expected +// to have a member operator() that carries out the actual +// operation. There should be a one to one correspondence between +// actors of the composite and the arguments of the operation's +// member operator(). +// +// The operation is also expected to have a nested template class +// result. The nested template class result should have a +// typedef 'type' that reflects the return type of its member +// operator(). This is essentially a type computer that answers the +// metaprogramming question "Given arguments of type T0...TN, what +// will be its operator()'s return type?". +// +// There is a special case for operations that accept no arguments. +// Such nullary operations are only required to define a typedef +// result_type that reflects the return type of its operator(). +// +// Here's an example of a simple operation that squares a number: +// +// struct square { +// +// template +// struct result { typedef ArgT type; }; +// +// template +// ArgT operator()(ArgT n) const { return n * n; } +// }; +// +// As can be seen, operations can be polymorphic. Its arguments and +// return type are not fixed to a particular type. The example +// above for example, can handle any ArgT type as long as it has a +// multiplication operator. +// +// Composites are not created directly. Instead, there are meta- +// programs provided that indirectly create composites. See +// operators.hpp, binders.hpp and functions.hpp for examples. +// +/////////////////////////////////////////////////////////////////////////////// +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 + + , typename NU = nil_t // Not used +> +struct composite; + +/////////////////////////////////////////////////////////////////////////////// +// +// composite <0 actor> class +// +/////////////////////////////////////////////////////////////////////////////// +template +struct composite0_result { + + typedef typename OperationT::result_type type; +}; + +////////////////////////////////// +template +struct composite 3 + nil_t, nil_t, nil_t, +#if PHOENIX_LIMIT > 6 + nil_t, nil_t, nil_t, +#if PHOENIX_LIMIT > 9 + nil_t, nil_t, nil_t, +#if PHOENIX_LIMIT > 12 + nil_t, nil_t, nil_t, +#endif +#endif +#endif +#endif + nil_t // Unused +> { + + typedef composite self_t; + + template + struct result { + + typedef typename composite0_result< + OperationT, TupleT + >::type type; + }; + + composite(OperationT const& op_) + : op(op_) {} + + template + typename OperationT::result_type + eval(TupleT const& /*args*/) const + { + return op(); + } + + mutable OperationT op; // operation +}; + +/////////////////////////////////////////////////////////////////////////////// +// +// composite <1 actor> class +// +/////////////////////////////////////////////////////////////////////////////// +template +struct composite1_result { + + typedef typename OperationT::template result< + typename actor_result::plain_type + >::type type; +}; + +////////////////////////////////// +template +struct composite 3 + nil_t, nil_t, nil_t, +#if PHOENIX_LIMIT > 6 + nil_t, nil_t, nil_t, +#if PHOENIX_LIMIT > 9 + nil_t, nil_t, nil_t, +#if PHOENIX_LIMIT > 12 + nil_t, nil_t, nil_t, +#endif +#endif +#endif +#endif + nil_t // Unused +> { + + typedef composite self_t; + + template + struct result { + + typedef typename composite1_result< + OperationT, TupleT, A + >::type type; + }; + + composite(OperationT const& op_, + A const& a_) + : op(op_), a(a_) {} + + template + typename actor_result::type + eval(TupleT const& args) const + { + typename actor_result::type ra = a.eval(args); + return op(ra); + } + + mutable OperationT op; // operation + A a; // actors +}; + +/////////////////////////////////////////////////////////////////////////////// +// +// composite <2 actors> class +// +/////////////////////////////////////////////////////////////////////////////// +template +struct composite2_result { + + typedef typename OperationT::template result< + typename actor_result::plain_type, + typename actor_result::plain_type + >::type type; +}; + +////////////////////////////////// +template +struct composite 3 + nil_t, nil_t, nil_t, +#if PHOENIX_LIMIT > 6 + nil_t, nil_t, nil_t, +#if PHOENIX_LIMIT > 9 + nil_t, nil_t, nil_t, +#if PHOENIX_LIMIT > 12 + nil_t, nil_t, nil_t, +#endif +#endif +#endif +#endif + nil_t // Unused +> { + + typedef composite self_t; + + template + struct result { + + typedef typename composite2_result< + OperationT, TupleT, A, B + >::type type; + }; + + composite(OperationT const& op_, + A const& a_, B const& b_) + : op(op_), a(a_), b(b_) {} + + template + typename actor_result::type + eval(TupleT const& args) const + { + typename actor_result::type ra = a.eval(args); + typename actor_result::type rb = b.eval(args); + return op(ra, rb); + } + + mutable OperationT op; // operation + A a; B b; // actors +}; + +/////////////////////////////////////////////////////////////////////////////// +// +// composite <3 actors> class +// +/////////////////////////////////////////////////////////////////////////////// +template +struct composite3_result { + + typedef typename OperationT::template result< + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type + >::type type; +}; + +////////////////////////////////// +template +struct composite 3 + nil_t, nil_t, nil_t, +#if PHOENIX_LIMIT > 6 + nil_t, nil_t, nil_t, +#if PHOENIX_LIMIT > 9 + nil_t, nil_t, nil_t, +#if PHOENIX_LIMIT > 12 + nil_t, nil_t, nil_t, +#endif +#endif +#endif +#endif + nil_t // Unused +> { + + typedef composite self_t; + + template + struct result { + + typedef typename composite3_result< + OperationT, TupleT, A, B, C + >::type type; + }; + + composite(OperationT const& op_, + A const& a_, B const& b_, C const& c_) + : op(op_), a(a_), b(b_), c(c_) {} + + template + typename actor_result::type + eval(TupleT const& args) const + { + typename actor_result::type ra = a.eval(args); + typename actor_result::type rb = b.eval(args); + typename actor_result::type rc = c.eval(args); + return op(ra, rb, rc); + } + + mutable OperationT op; // operation + A a; B b; C c; // actors +}; + +#if PHOENIX_LIMIT > 3 +/////////////////////////////////////////////////////////////////////////////// +// +// composite <4 actors> class +// +/////////////////////////////////////////////////////////////////////////////// +template +struct composite4_result { + + typedef typename OperationT::template result< + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type + >::type type; +}; + +////////////////////////////////// +template +struct composite 6 + nil_t, nil_t, nil_t, +#if PHOENIX_LIMIT > 9 + nil_t, nil_t, nil_t, +#if PHOENIX_LIMIT > 12 + nil_t, nil_t, nil_t, +#endif +#endif +#endif + nil_t // Unused +> { + + typedef composite self_t; + + template + struct result { + + typedef typename composite4_result< + OperationT, TupleT, A, B, C, D + >::type type; + }; + + composite(OperationT const& op_, + A const& a_, B const& b_, C const& c_, D const& d_) + : op(op_), a(a_), b(b_), c(c_), d(d_) {} + + template + typename actor_result::type + eval(TupleT const& args) const + { + typename actor_result::type ra = a.eval(args); + typename actor_result::type rb = b.eval(args); + typename actor_result::type rc = c.eval(args); + typename actor_result::type rd = d.eval(args); + return op(ra, rb, rc, rd); + } + + mutable OperationT op; // operation + A a; B b; C c; D d; // actors +}; + +/////////////////////////////////////////////////////////////////////////////// +// +// composite <5 actors> class +// +/////////////////////////////////////////////////////////////////////////////// +template +struct composite5_result { + + typedef typename OperationT::template result< + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type + >::type type; +}; + +////////////////////////////////// +template +struct composite 6 + nil_t, nil_t, nil_t, +#if PHOENIX_LIMIT > 9 + nil_t, nil_t, nil_t, +#if PHOENIX_LIMIT > 12 + nil_t, nil_t, nil_t, +#endif +#endif +#endif + nil_t // Unused +> { + + typedef composite self_t; + + template + struct result { + + typedef typename composite5_result< + OperationT, TupleT, A, B, C, D, E + >::type type; + }; + + composite(OperationT const& op_, + A const& a_, B const& b_, C const& c_, D const& d_, E const& e_) + : op(op_), a(a_), b(b_), c(c_), d(d_), e(e_) {} + + template + typename actor_result::type + eval(TupleT const& args) const + { + typename actor_result::type ra = a.eval(args); + typename actor_result::type rb = b.eval(args); + typename actor_result::type rc = c.eval(args); + typename actor_result::type rd = d.eval(args); + typename actor_result::type re = e.eval(args); + return op(ra, rb, rc, rd, re); + } + + mutable OperationT op; // operation + A a; B b; C c; D d; E e; // actors +}; + +/////////////////////////////////////////////////////////////////////////////// +// +// composite <6 actors> class +// +/////////////////////////////////////////////////////////////////////////////// +template +struct composite6_result { + + typedef typename OperationT::template result< + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type + >::type type; +}; + +////////////////////////////////// +template +struct composite 6 + nil_t, nil_t, nil_t, +#if PHOENIX_LIMIT > 9 + nil_t, nil_t, nil_t, +#if PHOENIX_LIMIT > 12 + nil_t, nil_t, nil_t, +#endif +#endif +#endif + nil_t // Unused +> { + + typedef composite self_t; + + template + struct result { + + typedef typename composite6_result< + OperationT, TupleT, A, B, C, D, E, F + >::type type; + }; + + composite(OperationT const& op_, + A const& a_, B const& b_, C const& c_, D const& d_, E const& e_, + F const& f_) + : op(op_), a(a_), b(b_), c(c_), d(d_), e(e_), + f(f_) {} + + template + typename actor_result::type + eval(TupleT const& args) const + { + typename actor_result::type ra = a.eval(args); + typename actor_result::type rb = b.eval(args); + typename actor_result::type rc = c.eval(args); + typename actor_result::type rd = d.eval(args); + typename actor_result::type re = e.eval(args); + typename actor_result::type rf = f.eval(args); + return op(ra, rb, rc, rd, re, rf); + } + + mutable OperationT op; // operation + A a; B b; C c; D d; E e; F f; // actors +}; + +#if PHOENIX_LIMIT > 6 +/////////////////////////////////////////////////////////////////////////////// +// +// composite <7 actors> class +// +/////////////////////////////////////////////////////////////////////////////// +template +struct composite7_result { + + typedef typename OperationT::template result< + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type + >::type type; +}; + +////////////////////////////////// +template +struct composite 9 + nil_t, nil_t, nil_t, +#if PHOENIX_LIMIT > 12 + nil_t, nil_t, nil_t, +#endif +#endif + nil_t // Unused +> { + + typedef composite self_t; + + template + struct result { + + typedef typename composite7_result< + OperationT, TupleT, A, B, C, D, E, F, G + >::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_) + : op(op_), a(a_), b(b_), c(c_), d(d_), e(e_), + f(f_), g(g_) {} + + template + typename actor_result::type + eval(TupleT const& args) const + { + typename actor_result::type ra = a.eval(args); + typename actor_result::type rb = b.eval(args); + typename actor_result::type rc = c.eval(args); + typename actor_result::type rd = d.eval(args); + typename actor_result::type re = e.eval(args); + typename actor_result::type rf = f.eval(args); + typename actor_result::type rg = g.eval(args); + return op(ra, rb, rc, rd, re, rf, rg); + } + + mutable OperationT op; // operation + A a; B b; C c; D d; E e; F f; G g; // actors +}; + +/////////////////////////////////////////////////////////////////////////////// +// +// composite <8 actors> class +// +/////////////////////////////////////////////////////////////////////////////// +template +struct composite8_result { + + typedef typename OperationT::template result< + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type + >::type type; +}; + +////////////////////////////////// +template +struct composite 9 + nil_t, nil_t, nil_t, +#if PHOENIX_LIMIT > 12 + nil_t, nil_t, nil_t, +#endif +#endif + nil_t // Unused +> { + + typedef composite self_t; + + template + struct result { + + typedef typename composite8_result< + OperationT, TupleT, A, B, C, D, E, F, G, H + >::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_) + : op(op_), a(a_), b(b_), c(c_), d(d_), e(e_), + f(f_), g(g_), h(h_) {} + + template + typename actor_result::type + eval(TupleT const& args) const + { + typename actor_result::type ra = a.eval(args); + typename actor_result::type rb = b.eval(args); + typename actor_result::type rc = c.eval(args); + typename actor_result::type rd = d.eval(args); + typename actor_result::type re = e.eval(args); + typename actor_result::type rf = f.eval(args); + typename actor_result::type rg = g.eval(args); + typename actor_result::type rh = h.eval(args); + return op(ra, rb, rc, rd, re, rf, rg, rh); + } + + mutable OperationT op; // operation + A a; B b; C c; D d; E e; F f; G g; H h; // actors +}; + +/////////////////////////////////////////////////////////////////////////////// +// +// composite <9 actors> class +// +/////////////////////////////////////////////////////////////////////////////// +template +struct composite9_result { + + typedef typename OperationT::template result< + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type + >::type type; +}; + +////////////////////////////////// +template +struct composite 9 + nil_t, nil_t, nil_t, +#if PHOENIX_LIMIT > 12 + nil_t, nil_t, nil_t, +#endif +#endif + nil_t // Unused +> { + + typedef composite self_t; + + template + struct result { + + typedef typename composite9_result< + OperationT, TupleT, A, B, C, D, E, F, G, H, I + >::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_) + : op(op_), a(a_), b(b_), c(c_), d(d_), e(e_), + f(f_), g(g_), h(h_), i(i_) {} + + template + typename actor_result::type + eval(TupleT const& args) const + { + typename actor_result::type ra = a.eval(args); + typename actor_result::type rb = b.eval(args); + typename actor_result::type rc = c.eval(args); + typename actor_result::type rd = d.eval(args); + typename actor_result::type re = e.eval(args); + typename actor_result::type rf = f.eval(args); + typename actor_result::type rg = g.eval(args); + typename actor_result::type rh = h.eval(args); + typename actor_result::type ri = i.eval(args); + return op(ra, rb, rc, rd, re, rf, rg, rh, ri); + } + + mutable OperationT op; // operation + A a; B b; C c; D d; E e; F f; G g; H h; I i; // actors +}; + +#if PHOENIX_LIMIT > 9 +/////////////////////////////////////////////////////////////////////////////// +// +// composite <10 actors> class +// +/////////////////////////////////////////////////////////////////////////////// +template +struct composite10_result { + + typedef typename OperationT::template result< + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type + >::type type; +}; + +////////////////////////////////// +template +struct composite 12 + nil_t, nil_t, nil_t, +#endif + nil_t // Unused +> { + + typedef composite self_t; + + template + struct result { + + typedef typename composite10_result< + OperationT, TupleT, A, B, C, D, E, F, G, H, I, J + >::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_) + : op(op_), a(a_), b(b_), c(c_), d(d_), e(e_), + f(f_), g(g_), h(h_), i(i_), j(j_) {} + + template + typename actor_result::type + eval(TupleT const& args) const + { + typename actor_result::type ra = a.eval(args); + typename actor_result::type rb = b.eval(args); + typename actor_result::type rc = c.eval(args); + typename actor_result::type rd = d.eval(args); + typename actor_result::type re = e.eval(args); + typename actor_result::type rf = f.eval(args); + typename actor_result::type rg = g.eval(args); + typename actor_result::type rh = h.eval(args); + typename actor_result::type ri = i.eval(args); + typename actor_result::type rj = j.eval(args); + return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj); + } + + mutable OperationT op; // operation + A a; B b; C c; D d; E e; F f; G g; H h; I i; J j; // actors +}; + +/////////////////////////////////////////////////////////////////////////////// +// +// composite <11 actors> class +// +/////////////////////////////////////////////////////////////////////////////// +template +struct composite11_result { + + typedef typename OperationT::template result< + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type + >::type type; +}; + +////////////////////////////////// +template +struct composite 12 + nil_t, nil_t, nil_t, +#endif + nil_t // Unused +> { + + typedef composite self_t; + + template + struct result { + + typedef typename composite11_result< + OperationT, TupleT, A, B, C, D, E, F, G, H, I, J, K + >::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_) + : op(op_), a(a_), b(b_), c(c_), d(d_), e(e_), + f(f_), g(g_), h(h_), i(i_), j(j_), + k(k_) {} + + template + typename actor_result::type + eval(TupleT const& args) const + { + typename actor_result::type ra = a.eval(args); + typename actor_result::type rb = b.eval(args); + typename actor_result::type rc = c.eval(args); + typename actor_result::type rd = d.eval(args); + typename actor_result::type re = e.eval(args); + typename actor_result::type rf = f.eval(args); + typename actor_result::type rg = g.eval(args); + typename actor_result::type rh = h.eval(args); + typename actor_result::type ri = i.eval(args); + typename actor_result::type rj = j.eval(args); + typename actor_result::type rk = k.eval(args); + return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj, rk); + } + + 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;// actors +}; + +/////////////////////////////////////////////////////////////////////////////// +// +// composite <12 actors> class +// +/////////////////////////////////////////////////////////////////////////////// +template +struct composite12_result { + + typedef typename OperationT::template result< + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type + >::type type; +}; + +////////////////////////////////// +template +struct composite 12 + nil_t, nil_t, nil_t, +#endif + nil_t // Unused +> { + + typedef composite self_t; + + template + struct result { + + typedef typename composite12_result< + OperationT, TupleT, A, B, C, D, E, F, G, H, I, J, K, L + >::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_) + : 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_) {} + + template + typename actor_result::type + eval(TupleT const& args) const + { + typename actor_result::type ra = a.eval(args); + typename actor_result::type rb = b.eval(args); + typename actor_result::type rc = c.eval(args); + typename actor_result::type rd = d.eval(args); + typename actor_result::type re = e.eval(args); + typename actor_result::type rf = f.eval(args); + typename actor_result::type rg = g.eval(args); + typename actor_result::type rh = h.eval(args); + typename actor_result::type ri = i.eval(args); + typename actor_result::type rj = j.eval(args); + typename actor_result::type rk = k.eval(args); + typename actor_result::type rl = l.eval(args); + return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj, rk, rl); + } + + 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;// actors +}; + +#if PHOENIX_LIMIT > 12 +/////////////////////////////////////////////////////////////////////////////// +// +// composite <13 actors> class +// +/////////////////////////////////////////////////////////////////////////////// +template +struct composite13_result { + + typedef typename OperationT::template result< + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type + >::type type; +}; + +////////////////////////////////// +template +struct composite { + + typedef composite self_t; + + template + struct result { + + typedef typename composite13_result< + OperationT, TupleT, A, B, C, D, E, F, G, H, I, J, K, L, M + >::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_) + : 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_) {} + + template + typename actor_result::type + eval(TupleT const& args) const + { + typename actor_result::type ra = a.eval(args); + typename actor_result::type rb = b.eval(args); + typename actor_result::type rc = c.eval(args); + typename actor_result::type rd = d.eval(args); + typename actor_result::type re = e.eval(args); + typename actor_result::type rf = f.eval(args); + typename actor_result::type rg = g.eval(args); + typename actor_result::type rh = h.eval(args); + typename actor_result::type ri = i.eval(args); + typename actor_result::type rj = j.eval(args); + typename actor_result::type rk = k.eval(args); + typename actor_result::type rl = l.eval(args); + typename actor_result::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 +struct composite14_result { + + typedef typename OperationT::template result< + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type + >::type type; +}; + +////////////////////////////////// +template +struct composite { + + typedef composite self_t; + + template + 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 actor_result::type + eval(TupleT const& args) const + { + typename actor_result::type ra = a.eval(args); + typename actor_result::type rb = b.eval(args); + typename actor_result::type rc = c.eval(args); + typename actor_result::type rd = d.eval(args); + typename actor_result::type re = e.eval(args); + typename actor_result::type rf = f.eval(args); + typename actor_result::type rg = g.eval(args); + typename actor_result::type rh = h.eval(args); + typename actor_result::type ri = i.eval(args); + typename actor_result::type rj = j.eval(args); + typename actor_result::type rk = k.eval(args); + typename actor_result::type rl = l.eval(args); + typename actor_result::type rm = m.eval(args); + typename actor_result::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 +struct composite15_result { + + typedef typename OperationT::template result< + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type, + typename actor_result::plain_type + >::type type; +}; + +////////////////////////////////// +template +struct composite { + + typedef composite self_t; + + template + 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 actor_result::type + eval(TupleT const& args) const + { + typename actor_result::type ra = a.eval(args); + typename actor_result::type rb = b.eval(args); + typename actor_result::type rc = c.eval(args); + typename actor_result::type rd = d.eval(args); + typename actor_result::type re = e.eval(args); + typename actor_result::type rf = f.eval(args); + typename actor_result::type rg = g.eval(args); + typename actor_result::type rh = h.eval(args); + typename actor_result::type ri = i.eval(args); + typename actor_result::type rj = j.eval(args); + typename actor_result::type rk = k.eval(args); + typename actor_result::type rl = l.eval(args); + typename actor_result::type rm = m.eval(args); + typename actor_result::type rn = n.eval(args); + typename actor_result::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 and if I were to generate an actual + // composite, what 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::type + , typename as_actor::type + , typename as_actor::type + +#if PHOENIX_LIMIT > 3 + , typename as_actor::type + , typename as_actor::type + , typename as_actor::type + +#if PHOENIX_LIMIT > 6 + , typename as_actor::type + , typename as_actor::type + , typename as_actor::type + +#if PHOENIX_LIMIT > 9 + , typename as_actor::type + , typename as_actor::type + , typename as_actor::type + +#if PHOENIX_LIMIT > 12 + , typename as_actor::type + , typename as_actor::type + , typename as_actor::type + +#endif +#endif +#endif +#endif + > composite_type; + + typedef actor 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 + struct make_unary { + + typedef typename make_composite + >::type type; + + static type + construct(actor const& _0) + { + typedef typename make_composite + >::composite_type + ret_t; + + return ret_t(OperationT(), _0); + } + }; + + ////////////////////////////////// LHS is an actor, RHS is unknown + template + struct make_binary1 { + + typedef typename make_composite + , B>::type type; + + static type + construct(actor const& _0, B const& _1) + { + typedef typename make_composite + , B>::composite_type + ret_t; + + return ret_t(OperationT(), _0, as_actor::convert(_1)); + } + }; + + ////////////////////////////////// LHS is unknown, RHS is an actor + template + struct make_binary2 { + + typedef typename make_composite + >::type type; + + static type + construct(A const& _0, actor const& _1) + { + typedef typename make_composite + >::composite_type + ret_t; + + return ret_t(OperationT(), as_actor::convert(_0), _1); + } + }; + + ////////////////////////////////// Both LHS and RHS are actors + template + struct make_binary3 { + + typedef typename make_composite + , actor >::type type; + + static type + construct(actor const& _0, actor const& _1) + { + typedef typename make_composite + , actor >::composite_type + ret_t; + + return ret_t(OperationT(), _0, _1); + } + }; + +} // namespace impl + +} // namespace phoenix + +#endif