1 /*=============================================================================
3 Copyright (c) 2001-2002 Joel de Guzman
5 Distributed under the Boost Software License, Version 1.0. (See accompanying
6 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 ==============================================================================*/
8 #ifndef PHOENIX_COMPOSITE_HPP
9 #define PHOENIX_COMPOSITE_HPP
11 ///////////////////////////////////////////////////////////////////////////////
12 #include <boost/spirit/home/classic/phoenix/actor.hpp>
14 ///////////////////////////////////////////////////////////////////////////////
17 #if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
19 #pragma warning(disable:4512) //assignment operator could not be generated
22 ///////////////////////////////////////////////////////////////////////////////
26 // A composite is an actor base class composed of zero or more
27 // actors (see actor.hpp) and an operation. A composite is itself
28 // an actor superclass and conforms to its conceptual interface.
29 // Its eval member function un-funnels the tupled actual arguments
30 // from the tuple by invoking each of the actors' eval member
31 // function. The results of each are then passed on as arguments to
32 // the operation. Specializations are provided to handle different
37 // actor0.eval(tupled_args) --> arg0 --> |
38 // actor1.eval(tupled_args) --> arg1 --> |
39 // actor2.eval(tupled_args) --> arg3 --> | --> operation(arg0...argN)
41 // actorN.eval(tupled_args) --> argN --> |
43 // The operation can be any suitable functor that can accept the
44 // arguments passed in by the composite. The operation is expected
45 // to have a member operator() that carries out the actual
46 // operation. There should be a one to one correspondence between
47 // actors of the composite and the arguments of the operation's
50 // The operation is also expected to have a nested template class
51 // result<T0...TN>. The nested template class result should have a
52 // typedef 'type' that reflects the return type of its member
53 // operator(). This is essentially a type computer that answers the
54 // metaprogramming question "Given arguments of type T0...TN, what
55 // will be its operator()'s return type?".
57 // There is a special case for operations that accept no arguments.
58 // Such nullary operations are only required to define a typedef
59 // result_type that reflects the return type of its operator().
61 // Here's an example of a simple operation that squares a number:
65 // template <typename ArgT>
66 // struct result { typedef ArgT type; };
68 // template <typename ArgT>
69 // ArgT operator()(ArgT n) const { return n * n; }
72 // As can be seen, operations can be polymorphic. Its arguments and
73 // return type are not fixed to a particular type. The example
74 // above for example, can handle any ArgT type as long as it has a
75 // multiplication operator.
77 // Composites are not created directly. Instead, there are meta-
78 // programs provided that indirectly create composites. See
79 // operators.hpp, binders.hpp and functions.hpp for examples.
81 ///////////////////////////////////////////////////////////////////////////////
103 #if PHOENIX_LIMIT > 12
113 , typename NU = nil_t // Not used
117 ///////////////////////////////////////////////////////////////////////////////
119 // composite <0 actor> class
121 ///////////////////////////////////////////////////////////////////////////////
122 template <typename OperationT, typename TupleT>
123 struct composite0_result {
125 typedef typename OperationT::result_type type;
128 //////////////////////////////////
129 template <typename OperationT>
130 struct composite<OperationT,
132 #if PHOENIX_LIMIT > 3
134 #if PHOENIX_LIMIT > 6
136 #if PHOENIX_LIMIT > 9
138 #if PHOENIX_LIMIT > 12
147 typedef composite<OperationT> self_t;
149 template <typename TupleT>
152 typedef typename composite0_result<
157 composite(OperationT const& op_)
160 template <typename TupleT>
161 typename OperationT::result_type
162 eval(TupleT const& /*args*/) const
167 mutable OperationT op; // operation
170 ///////////////////////////////////////////////////////////////////////////////
172 // composite <1 actor> class
174 ///////////////////////////////////////////////////////////////////////////////
175 template <typename OperationT, typename TupleT,
177 struct composite1_result {
179 typedef typename OperationT::template result<
180 typename actor_result<A, TupleT>::plain_type
184 //////////////////////////////////
185 template <typename OperationT,
187 struct composite<OperationT,
189 #if PHOENIX_LIMIT > 3
191 #if PHOENIX_LIMIT > 6
193 #if PHOENIX_LIMIT > 9
195 #if PHOENIX_LIMIT > 12
204 typedef composite<OperationT, A> self_t;
206 template <typename TupleT>
209 typedef typename composite1_result<
210 OperationT, TupleT, A
214 composite(OperationT const& op_,
218 template <typename TupleT>
219 typename actor_result<self_t, TupleT>::type
220 eval(TupleT const& args) const
222 typename actor_result<A, TupleT>::type ra = a.eval(args);
226 mutable OperationT op; // operation
230 ///////////////////////////////////////////////////////////////////////////////
232 // composite <2 actors> class
234 ///////////////////////////////////////////////////////////////////////////////
235 template <typename OperationT, typename TupleT,
236 typename A, typename B>
237 struct composite2_result {
239 typedef typename OperationT::template result<
240 typename actor_result<A, TupleT>::plain_type,
241 typename actor_result<B, TupleT>::plain_type
245 //////////////////////////////////
246 template <typename OperationT,
247 typename A, typename B>
248 struct composite<OperationT,
250 #if PHOENIX_LIMIT > 3
252 #if PHOENIX_LIMIT > 6
254 #if PHOENIX_LIMIT > 9
256 #if PHOENIX_LIMIT > 12
265 typedef composite<OperationT, A, B> self_t;
267 template <typename TupleT>
270 typedef typename composite2_result<
271 OperationT, TupleT, A, B
275 composite(OperationT const& op_,
276 A const& a_, B const& b_)
277 : op(op_), a(a_), b(b_) {}
279 template <typename TupleT>
280 typename actor_result<self_t, TupleT>::type
281 eval(TupleT const& args) const
283 typename actor_result<A, TupleT>::type ra = a.eval(args);
284 typename actor_result<B, TupleT>::type rb = b.eval(args);
288 mutable OperationT op; // operation
292 ///////////////////////////////////////////////////////////////////////////////
294 // composite <3 actors> class
296 ///////////////////////////////////////////////////////////////////////////////
297 template <typename OperationT, typename TupleT,
298 typename A, typename B, typename C>
299 struct composite3_result {
301 typedef typename OperationT::template result<
302 typename actor_result<A, TupleT>::plain_type,
303 typename actor_result<B, TupleT>::plain_type,
304 typename actor_result<C, TupleT>::plain_type
308 //////////////////////////////////
309 template <typename OperationT,
310 typename A, typename B, typename C>
311 struct composite<OperationT,
313 #if PHOENIX_LIMIT > 3
315 #if PHOENIX_LIMIT > 6
317 #if PHOENIX_LIMIT > 9
319 #if PHOENIX_LIMIT > 12
328 typedef composite<OperationT, A, B, C> self_t;
330 template <typename TupleT>
333 typedef typename composite3_result<
334 OperationT, TupleT, A, B, C
338 composite(OperationT const& op_,
339 A const& a_, B const& b_, C const& c_)
340 : op(op_), a(a_), b(b_), c(c_) {}
342 template <typename TupleT>
343 typename actor_result<self_t, TupleT>::type
344 eval(TupleT const& args) const
346 typename actor_result<A, TupleT>::type ra = a.eval(args);
347 typename actor_result<B, TupleT>::type rb = b.eval(args);
348 typename actor_result<C, TupleT>::type rc = c.eval(args);
349 return op(ra, rb, rc);
352 mutable OperationT op; // operation
353 A a; B b; C c; // actors
356 #if PHOENIX_LIMIT > 3
357 ///////////////////////////////////////////////////////////////////////////////
359 // composite <4 actors> class
361 ///////////////////////////////////////////////////////////////////////////////
362 template <typename OperationT, typename TupleT,
363 typename A, typename B, typename C, typename D>
364 struct composite4_result {
366 typedef typename OperationT::template result<
367 typename actor_result<A, TupleT>::plain_type,
368 typename actor_result<B, TupleT>::plain_type,
369 typename actor_result<C, TupleT>::plain_type,
370 typename actor_result<D, TupleT>::plain_type
374 //////////////////////////////////
375 template <typename OperationT,
376 typename A, typename B, typename C, typename D>
377 struct composite<OperationT,
378 A, B, C, D, nil_t, nil_t,
379 #if PHOENIX_LIMIT > 6
381 #if PHOENIX_LIMIT > 9
383 #if PHOENIX_LIMIT > 12
391 typedef composite<OperationT, A, B, C, D> self_t;
393 template <typename TupleT>
396 typedef typename composite4_result<
397 OperationT, TupleT, A, B, C, D
401 composite(OperationT const& op_,
402 A const& a_, B const& b_, C const& c_, D const& d_)
403 : op(op_), a(a_), b(b_), c(c_), d(d_) {}
405 template <typename TupleT>
406 typename actor_result<self_t, TupleT>::type
407 eval(TupleT const& args) const
409 typename actor_result<A, TupleT>::type ra = a.eval(args);
410 typename actor_result<B, TupleT>::type rb = b.eval(args);
411 typename actor_result<C, TupleT>::type rc = c.eval(args);
412 typename actor_result<D, TupleT>::type rd = d.eval(args);
413 return op(ra, rb, rc, rd);
416 mutable OperationT op; // operation
417 A a; B b; C c; D d; // actors
420 ///////////////////////////////////////////////////////////////////////////////
422 // composite <5 actors> class
424 ///////////////////////////////////////////////////////////////////////////////
425 template <typename OperationT, typename TupleT,
426 typename A, typename B, typename C, typename D, typename E>
427 struct composite5_result {
429 typedef typename OperationT::template result<
430 typename actor_result<A, TupleT>::plain_type,
431 typename actor_result<B, TupleT>::plain_type,
432 typename actor_result<C, TupleT>::plain_type,
433 typename actor_result<D, TupleT>::plain_type,
434 typename actor_result<E, TupleT>::plain_type
438 //////////////////////////////////
439 template <typename OperationT,
440 typename A, typename B, typename C, typename D, typename E>
441 struct composite<OperationT,
442 A, B, C, D, E, nil_t,
443 #if PHOENIX_LIMIT > 6
445 #if PHOENIX_LIMIT > 9
447 #if PHOENIX_LIMIT > 12
455 typedef composite<OperationT, A, B, C, D, E> self_t;
457 template <typename TupleT>
460 typedef typename composite5_result<
461 OperationT, TupleT, A, B, C, D, E
465 composite(OperationT const& op_,
466 A const& a_, B const& b_, C const& c_, D const& d_, E const& e_)
467 : op(op_), a(a_), b(b_), c(c_), d(d_), e(e_) {}
469 template <typename TupleT>
470 typename actor_result<self_t, TupleT>::type
471 eval(TupleT const& args) const
473 typename actor_result<A, TupleT>::type ra = a.eval(args);
474 typename actor_result<B, TupleT>::type rb = b.eval(args);
475 typename actor_result<C, TupleT>::type rc = c.eval(args);
476 typename actor_result<D, TupleT>::type rd = d.eval(args);
477 typename actor_result<E, TupleT>::type re = e.eval(args);
478 return op(ra, rb, rc, rd, re);
481 mutable OperationT op; // operation
482 A a; B b; C c; D d; E e; // actors
485 ///////////////////////////////////////////////////////////////////////////////
487 // composite <6 actors> class
489 ///////////////////////////////////////////////////////////////////////////////
490 template <typename OperationT, typename TupleT,
491 typename A, typename B, typename C, typename D, typename E,
493 struct composite6_result {
495 typedef typename OperationT::template result<
496 typename actor_result<A, TupleT>::plain_type,
497 typename actor_result<B, TupleT>::plain_type,
498 typename actor_result<C, TupleT>::plain_type,
499 typename actor_result<D, TupleT>::plain_type,
500 typename actor_result<E, TupleT>::plain_type,
501 typename actor_result<F, TupleT>::plain_type
505 //////////////////////////////////
506 template <typename OperationT,
507 typename A, typename B, typename C, typename D, typename E,
509 struct composite<OperationT,
511 #if PHOENIX_LIMIT > 6
513 #if PHOENIX_LIMIT > 9
515 #if PHOENIX_LIMIT > 12
523 typedef composite<OperationT, A, B, C, D, E, F> self_t;
525 template <typename TupleT>
528 typedef typename composite6_result<
529 OperationT, TupleT, A, B, C, D, E, F
533 composite(OperationT const& op_,
534 A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
536 : op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
539 template <typename TupleT>
540 typename actor_result<self_t, TupleT>::type
541 eval(TupleT const& args) const
543 typename actor_result<A, TupleT>::type ra = a.eval(args);
544 typename actor_result<B, TupleT>::type rb = b.eval(args);
545 typename actor_result<C, TupleT>::type rc = c.eval(args);
546 typename actor_result<D, TupleT>::type rd = d.eval(args);
547 typename actor_result<E, TupleT>::type re = e.eval(args);
548 typename actor_result<F, TupleT>::type rf = f.eval(args);
549 return op(ra, rb, rc, rd, re, rf);
552 mutable OperationT op; // operation
553 A a; B b; C c; D d; E e; F f; // actors
556 #if PHOENIX_LIMIT > 6
557 ///////////////////////////////////////////////////////////////////////////////
559 // composite <7 actors> class
561 ///////////////////////////////////////////////////////////////////////////////
562 template <typename OperationT, typename TupleT,
563 typename A, typename B, typename C, typename D, typename E,
564 typename F, typename G>
565 struct composite7_result {
567 typedef typename OperationT::template result<
568 typename actor_result<A, TupleT>::plain_type,
569 typename actor_result<B, TupleT>::plain_type,
570 typename actor_result<C, TupleT>::plain_type,
571 typename actor_result<D, TupleT>::plain_type,
572 typename actor_result<E, TupleT>::plain_type,
573 typename actor_result<F, TupleT>::plain_type,
574 typename actor_result<G, TupleT>::plain_type
578 //////////////////////////////////
579 template <typename OperationT,
580 typename A, typename B, typename C, typename D, typename E,
581 typename F, typename G>
582 struct composite<OperationT,
583 A, B, C, D, E, F, G, nil_t, nil_t,
584 #if PHOENIX_LIMIT > 9
586 #if PHOENIX_LIMIT > 12
593 typedef composite<OperationT, A, B, C, D, E, F, G> self_t;
595 template <typename TupleT>
598 typedef typename composite7_result<
599 OperationT, TupleT, A, B, C, D, E, F, G
603 composite(OperationT const& op_,
604 A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
605 F const& f_, G const& g_)
606 : op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
609 template <typename TupleT>
610 typename actor_result<self_t, TupleT>::type
611 eval(TupleT const& args) const
613 typename actor_result<A, TupleT>::type ra = a.eval(args);
614 typename actor_result<B, TupleT>::type rb = b.eval(args);
615 typename actor_result<C, TupleT>::type rc = c.eval(args);
616 typename actor_result<D, TupleT>::type rd = d.eval(args);
617 typename actor_result<E, TupleT>::type re = e.eval(args);
618 typename actor_result<F, TupleT>::type rf = f.eval(args);
619 typename actor_result<G, TupleT>::type rg = g.eval(args);
620 return op(ra, rb, rc, rd, re, rf, rg);
623 mutable OperationT op; // operation
624 A a; B b; C c; D d; E e; F f; G g; // actors
627 ///////////////////////////////////////////////////////////////////////////////
629 // composite <8 actors> class
631 ///////////////////////////////////////////////////////////////////////////////
632 template <typename OperationT, typename TupleT,
633 typename A, typename B, typename C, typename D, typename E,
634 typename F, typename G, typename H>
635 struct composite8_result {
637 typedef typename OperationT::template result<
638 typename actor_result<A, TupleT>::plain_type,
639 typename actor_result<B, TupleT>::plain_type,
640 typename actor_result<C, TupleT>::plain_type,
641 typename actor_result<D, TupleT>::plain_type,
642 typename actor_result<E, TupleT>::plain_type,
643 typename actor_result<F, TupleT>::plain_type,
644 typename actor_result<G, TupleT>::plain_type,
645 typename actor_result<H, TupleT>::plain_type
649 //////////////////////////////////
650 template <typename OperationT,
651 typename A, typename B, typename C, typename D, typename E,
652 typename F, typename G, typename H>
653 struct composite<OperationT,
654 A, B, C, D, E, F, G, H, nil_t,
655 #if PHOENIX_LIMIT > 9
657 #if PHOENIX_LIMIT > 12
664 typedef composite<OperationT, A, B, C, D, E, F, G, H> self_t;
666 template <typename TupleT>
669 typedef typename composite8_result<
670 OperationT, TupleT, A, B, C, D, E, F, G, H
674 composite(OperationT const& op_,
675 A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
676 F const& f_, G const& g_, H const& h_)
677 : op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
678 f(f_), g(g_), h(h_) {}
680 template <typename TupleT>
681 typename actor_result<self_t, TupleT>::type
682 eval(TupleT const& args) const
684 typename actor_result<A, TupleT>::type ra = a.eval(args);
685 typename actor_result<B, TupleT>::type rb = b.eval(args);
686 typename actor_result<C, TupleT>::type rc = c.eval(args);
687 typename actor_result<D, TupleT>::type rd = d.eval(args);
688 typename actor_result<E, TupleT>::type re = e.eval(args);
689 typename actor_result<F, TupleT>::type rf = f.eval(args);
690 typename actor_result<G, TupleT>::type rg = g.eval(args);
691 typename actor_result<H, TupleT>::type rh = h.eval(args);
692 return op(ra, rb, rc, rd, re, rf, rg, rh);
695 mutable OperationT op; // operation
696 A a; B b; C c; D d; E e; F f; G g; H h; // actors
699 ///////////////////////////////////////////////////////////////////////////////
701 // composite <9 actors> class
703 ///////////////////////////////////////////////////////////////////////////////
704 template <typename OperationT, typename TupleT,
705 typename A, typename B, typename C, typename D, typename E,
706 typename F, typename G, typename H, typename I>
707 struct composite9_result {
709 typedef typename OperationT::template result<
710 typename actor_result<A, TupleT>::plain_type,
711 typename actor_result<B, TupleT>::plain_type,
712 typename actor_result<C, TupleT>::plain_type,
713 typename actor_result<D, TupleT>::plain_type,
714 typename actor_result<E, TupleT>::plain_type,
715 typename actor_result<F, TupleT>::plain_type,
716 typename actor_result<G, TupleT>::plain_type,
717 typename actor_result<H, TupleT>::plain_type,
718 typename actor_result<I, TupleT>::plain_type
722 //////////////////////////////////
723 template <typename OperationT,
724 typename A, typename B, typename C, typename D, typename E,
725 typename F, typename G, typename H, typename I>
726 struct composite<OperationT,
727 A, B, C, D, E, F, G, H, I,
728 #if PHOENIX_LIMIT > 9
730 #if PHOENIX_LIMIT > 12
737 typedef composite<OperationT, A, B, C, D, E, F, G, H, I> self_t;
739 template <typename TupleT>
742 typedef typename composite9_result<
743 OperationT, TupleT, A, B, C, D, E, F, G, H, I
747 composite(OperationT const& op_,
748 A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
749 F const& f_, G const& g_, H const& h_, I const& i_)
750 : op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
751 f(f_), g(g_), h(h_), i(i_) {}
753 template <typename TupleT>
754 typename actor_result<self_t, TupleT>::type
755 eval(TupleT const& args) const
757 typename actor_result<A, TupleT>::type ra = a.eval(args);
758 typename actor_result<B, TupleT>::type rb = b.eval(args);
759 typename actor_result<C, TupleT>::type rc = c.eval(args);
760 typename actor_result<D, TupleT>::type rd = d.eval(args);
761 typename actor_result<E, TupleT>::type re = e.eval(args);
762 typename actor_result<F, TupleT>::type rf = f.eval(args);
763 typename actor_result<G, TupleT>::type rg = g.eval(args);
764 typename actor_result<H, TupleT>::type rh = h.eval(args);
765 typename actor_result<I, TupleT>::type ri = i.eval(args);
766 return op(ra, rb, rc, rd, re, rf, rg, rh, ri);
769 mutable OperationT op; // operation
770 A a; B b; C c; D d; E e; F f; G g; H h; I i; // actors
773 #if PHOENIX_LIMIT > 9
774 ///////////////////////////////////////////////////////////////////////////////
776 // composite <10 actors> class
778 ///////////////////////////////////////////////////////////////////////////////
779 template <typename OperationT, typename TupleT,
780 typename A, typename B, typename C, typename D, typename E,
781 typename F, typename G, typename H, typename I, typename J>
782 struct composite10_result {
784 typedef typename OperationT::template result<
785 typename actor_result<A, TupleT>::plain_type,
786 typename actor_result<B, TupleT>::plain_type,
787 typename actor_result<C, TupleT>::plain_type,
788 typename actor_result<D, TupleT>::plain_type,
789 typename actor_result<E, TupleT>::plain_type,
790 typename actor_result<F, TupleT>::plain_type,
791 typename actor_result<G, TupleT>::plain_type,
792 typename actor_result<H, TupleT>::plain_type,
793 typename actor_result<I, TupleT>::plain_type,
794 typename actor_result<J, TupleT>::plain_type
798 //////////////////////////////////
799 template <typename OperationT,
800 typename A, typename B, typename C, typename D, typename E,
801 typename F, typename G, typename H, typename I, typename J>
802 struct composite<OperationT,
803 A, B, C, D, E, F, G, H, I, J, nil_t, nil_t,
804 #if PHOENIX_LIMIT > 12
810 typedef composite<OperationT, A, B, C, D, E, F, G, H, I, J> self_t;
812 template <typename TupleT>
815 typedef typename composite10_result<
816 OperationT, TupleT, A, B, C, D, E, F, G, H, I, J
820 composite(OperationT const& op_,
821 A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
822 F const& f_, G const& g_, H const& h_, I const& i_, J const& j_)
823 : op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
824 f(f_), g(g_), h(h_), i(i_), j(j_) {}
826 template <typename TupleT>
827 typename actor_result<self_t, TupleT>::type
828 eval(TupleT const& args) const
830 typename actor_result<A, TupleT>::type ra = a.eval(args);
831 typename actor_result<B, TupleT>::type rb = b.eval(args);
832 typename actor_result<C, TupleT>::type rc = c.eval(args);
833 typename actor_result<D, TupleT>::type rd = d.eval(args);
834 typename actor_result<E, TupleT>::type re = e.eval(args);
835 typename actor_result<F, TupleT>::type rf = f.eval(args);
836 typename actor_result<G, TupleT>::type rg = g.eval(args);
837 typename actor_result<H, TupleT>::type rh = h.eval(args);
838 typename actor_result<I, TupleT>::type ri = i.eval(args);
839 typename actor_result<J, TupleT>::type rj = j.eval(args);
840 return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj);
843 mutable OperationT op; // operation
844 A a; B b; C c; D d; E e; F f; G g; H h; I i; J j; // actors
847 ///////////////////////////////////////////////////////////////////////////////
849 // composite <11 actors> class
851 ///////////////////////////////////////////////////////////////////////////////
852 template <typename OperationT, typename TupleT,
853 typename A, typename B, typename C, typename D, typename E,
854 typename F, typename G, typename H, typename I, typename J,
856 struct composite11_result {
858 typedef typename OperationT::template result<
859 typename actor_result<A, TupleT>::plain_type,
860 typename actor_result<B, TupleT>::plain_type,
861 typename actor_result<C, TupleT>::plain_type,
862 typename actor_result<D, TupleT>::plain_type,
863 typename actor_result<E, TupleT>::plain_type,
864 typename actor_result<F, TupleT>::plain_type,
865 typename actor_result<G, TupleT>::plain_type,
866 typename actor_result<H, TupleT>::plain_type,
867 typename actor_result<I, TupleT>::plain_type,
868 typename actor_result<J, TupleT>::plain_type,
869 typename actor_result<K, TupleT>::plain_type
873 //////////////////////////////////
874 template <typename OperationT,
875 typename A, typename B, typename C, typename D, typename E,
876 typename F, typename G, typename H, typename I, typename J,
878 struct composite<OperationT,
879 A, B, C, D, E, F, G, H, I, J, K, nil_t,
880 #if PHOENIX_LIMIT > 12
886 typedef composite<OperationT,
887 A, B, C, D, E, F, G, H, I, J, K> self_t;
889 template <typename TupleT>
892 typedef typename composite11_result<
893 OperationT, TupleT, A, B, C, D, E, F, G, H, I, J, K
897 composite(OperationT const& op_,
898 A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
899 F const& f_, G const& g_, H const& h_, I const& i_, J const& j_,
901 : op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
902 f(f_), g(g_), h(h_), i(i_), j(j_),
905 template <typename TupleT>
906 typename actor_result<self_t, TupleT>::type
907 eval(TupleT const& args) const
909 typename actor_result<A, TupleT>::type ra = a.eval(args);
910 typename actor_result<B, TupleT>::type rb = b.eval(args);
911 typename actor_result<C, TupleT>::type rc = c.eval(args);
912 typename actor_result<D, TupleT>::type rd = d.eval(args);
913 typename actor_result<E, TupleT>::type re = e.eval(args);
914 typename actor_result<F, TupleT>::type rf = f.eval(args);
915 typename actor_result<G, TupleT>::type rg = g.eval(args);
916 typename actor_result<H, TupleT>::type rh = h.eval(args);
917 typename actor_result<I, TupleT>::type ri = i.eval(args);
918 typename actor_result<J, TupleT>::type rj = j.eval(args);
919 typename actor_result<K, TupleT>::type rk = k.eval(args);
920 return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj, rk);
923 mutable OperationT op; // operation
924 A a; B b; C c; D d; E e; F f; G g; H h; I i; J j;
928 ///////////////////////////////////////////////////////////////////////////////
930 // composite <12 actors> class
932 ///////////////////////////////////////////////////////////////////////////////
933 template <typename OperationT, typename TupleT,
934 typename A, typename B, typename C, typename D, typename E,
935 typename F, typename G, typename H, typename I, typename J,
936 typename K, typename L>
937 struct composite12_result {
939 typedef typename OperationT::template result<
940 typename actor_result<A, TupleT>::plain_type,
941 typename actor_result<B, TupleT>::plain_type,
942 typename actor_result<C, TupleT>::plain_type,
943 typename actor_result<D, TupleT>::plain_type,
944 typename actor_result<E, TupleT>::plain_type,
945 typename actor_result<F, TupleT>::plain_type,
946 typename actor_result<G, TupleT>::plain_type,
947 typename actor_result<H, TupleT>::plain_type,
948 typename actor_result<I, TupleT>::plain_type,
949 typename actor_result<J, TupleT>::plain_type,
950 typename actor_result<K, TupleT>::plain_type,
951 typename actor_result<L, TupleT>::plain_type
955 //////////////////////////////////
956 template <typename OperationT,
957 typename A, typename B, typename C, typename D, typename E,
958 typename F, typename G, typename H, typename I, typename J,
959 typename K, typename L>
960 struct composite<OperationT,
961 A, B, C, D, E, F, G, H, I, J, K, L,
962 #if PHOENIX_LIMIT > 12
968 typedef composite<OperationT,
969 A, B, C, D, E, F, G, H, I, J, K, L> self_t;
971 template <typename TupleT>
974 typedef typename composite12_result<
975 OperationT, TupleT, A, B, C, D, E, F, G, H, I, J, K, L
979 composite(OperationT const& op_,
980 A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
981 F const& f_, G const& g_, H const& h_, I const& i_, J const& j_,
982 K const& k_, L const& l_)
983 : op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
984 f(f_), g(g_), h(h_), i(i_), j(j_),
987 template <typename TupleT>
988 typename actor_result<self_t, TupleT>::type
989 eval(TupleT const& args) const
991 typename actor_result<A, TupleT>::type ra = a.eval(args);
992 typename actor_result<B, TupleT>::type rb = b.eval(args);
993 typename actor_result<C, TupleT>::type rc = c.eval(args);
994 typename actor_result<D, TupleT>::type rd = d.eval(args);
995 typename actor_result<E, TupleT>::type re = e.eval(args);
996 typename actor_result<F, TupleT>::type rf = f.eval(args);
997 typename actor_result<G, TupleT>::type rg = g.eval(args);
998 typename actor_result<H, TupleT>::type rh = h.eval(args);
999 typename actor_result<I, TupleT>::type ri = i.eval(args);
1000 typename actor_result<J, TupleT>::type rj = j.eval(args);
1001 typename actor_result<K, TupleT>::type rk = k.eval(args);
1002 typename actor_result<L, TupleT>::type rl = l.eval(args);
1003 return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj, rk, rl);
1006 mutable OperationT op; // operation
1007 A a; B b; C c; D d; E e; F f; G g; H h; I i; J j;
1011 #if PHOENIX_LIMIT > 12
1012 ///////////////////////////////////////////////////////////////////////////////
1014 // composite <13 actors> class
1016 ///////////////////////////////////////////////////////////////////////////////
1017 template <typename OperationT, typename TupleT,
1018 typename A, typename B, typename C, typename D, typename E,
1019 typename F, typename G, typename H, typename I, typename J,
1020 typename K, typename L, typename M>
1021 struct composite13_result {
1023 typedef typename OperationT::template result<
1024 typename actor_result<A, TupleT>::plain_type,
1025 typename actor_result<B, TupleT>::plain_type,
1026 typename actor_result<C, TupleT>::plain_type,
1027 typename actor_result<D, TupleT>::plain_type,
1028 typename actor_result<E, TupleT>::plain_type,
1029 typename actor_result<F, TupleT>::plain_type,
1030 typename actor_result<G, TupleT>::plain_type,
1031 typename actor_result<H, TupleT>::plain_type,
1032 typename actor_result<I, TupleT>::plain_type,
1033 typename actor_result<J, TupleT>::plain_type,
1034 typename actor_result<K, TupleT>::plain_type,
1035 typename actor_result<L, TupleT>::plain_type,
1036 typename actor_result<M, TupleT>::plain_type
1040 //////////////////////////////////
1041 template <typename OperationT,
1042 typename A, typename B, typename C, typename D, typename E,
1043 typename F, typename G, typename H, typename I, typename J,
1044 typename K, typename L, typename M>
1045 struct composite<OperationT,
1046 A, B, C, D, E, F, G, H, I, J, K, L, M, nil_t, nil_t, nil_t
1049 typedef composite<OperationT,
1050 A, B, C, D, E, F, G, H, I, J, K, L, M> self_t;
1052 template <typename TupleT>
1055 typedef typename composite13_result<
1056 OperationT, TupleT, A, B, C, D, E, F, G, H, I, J, K, L, M
1060 composite(OperationT const& op_,
1061 A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
1062 F const& f_, G const& g_, H const& h_, I const& i_, J const& j_,
1063 K const& k_, L const& l_, M const& m_)
1064 : op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
1065 f(f_), g(g_), h(h_), i(i_), j(j_),
1066 k(k_), l(l_), m(m_) {}
1068 template <typename TupleT>
1069 typename actor_result<self_t, TupleT>::type
1070 eval(TupleT const& args) const
1072 typename actor_result<A, TupleT>::type ra = a.eval(args);
1073 typename actor_result<B, TupleT>::type rb = b.eval(args);
1074 typename actor_result<C, TupleT>::type rc = c.eval(args);
1075 typename actor_result<D, TupleT>::type rd = d.eval(args);
1076 typename actor_result<E, TupleT>::type re = e.eval(args);
1077 typename actor_result<F, TupleT>::type rf = f.eval(args);
1078 typename actor_result<G, TupleT>::type rg = g.eval(args);
1079 typename actor_result<H, TupleT>::type rh = h.eval(args);
1080 typename actor_result<I, TupleT>::type ri = i.eval(args);
1081 typename actor_result<J, TupleT>::type rj = j.eval(args);
1082 typename actor_result<K, TupleT>::type rk = k.eval(args);
1083 typename actor_result<L, TupleT>::type rl = l.eval(args);
1084 typename actor_result<M, TupleT>::type rm = m.eval(args);
1085 return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj, rk, rl, rm);
1088 mutable OperationT op; // operation
1089 A a; B b; C c; D d; E e; F f; G g; H h; I i; J j;
1090 K k; L l; M m; // actors
1093 ///////////////////////////////////////////////////////////////////////////////
1095 // composite <14 actors> class
1097 ///////////////////////////////////////////////////////////////////////////////
1098 template <typename OperationT, typename TupleT,
1099 typename A, typename B, typename C, typename D, typename E,
1100 typename F, typename G, typename H, typename I, typename J,
1101 typename K, typename L, typename M, typename N>
1102 struct composite14_result {
1104 typedef typename OperationT::template result<
1105 typename actor_result<A, TupleT>::plain_type,
1106 typename actor_result<B, TupleT>::plain_type,
1107 typename actor_result<C, TupleT>::plain_type,
1108 typename actor_result<D, TupleT>::plain_type,
1109 typename actor_result<E, TupleT>::plain_type,
1110 typename actor_result<F, TupleT>::plain_type,
1111 typename actor_result<G, TupleT>::plain_type,
1112 typename actor_result<H, TupleT>::plain_type,
1113 typename actor_result<I, TupleT>::plain_type,
1114 typename actor_result<J, TupleT>::plain_type,
1115 typename actor_result<K, TupleT>::plain_type,
1116 typename actor_result<L, TupleT>::plain_type,
1117 typename actor_result<M, TupleT>::plain_type,
1118 typename actor_result<N, TupleT>::plain_type
1122 //////////////////////////////////
1123 template <typename OperationT,
1124 typename A, typename B, typename C, typename D, typename E,
1125 typename F, typename G, typename H, typename I, typename J,
1126 typename K, typename L, typename M, typename N>
1127 struct composite<OperationT,
1128 A, B, C, D, E, F, G, H, I, J, K, L, M, N, nil_t, nil_t
1131 typedef composite<OperationT,
1132 A, B, C, D, E, F, G, H, I, J, K, L, M, N> self_t;
1134 template <typename TupleT>
1137 typedef typename composite14_result<
1138 OperationT, TupleT, A, B, C, D, E, F, G, H, I, J, K, L, M, N
1142 composite(OperationT const& op_,
1143 A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
1144 F const& f_, G const& g_, H const& h_, I const& i_, J const& j_,
1145 K const& k_, L const& l_, M const& m_, N const& n_)
1146 : op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
1147 f(f_), g(g_), h(h_), i(i_), j(j_),
1148 k(k_), l(l_), m(m_), n(n_) {}
1150 template <typename TupleT>
1151 typename actor_result<self_t, TupleT>::type
1152 eval(TupleT const& args) const
1154 typename actor_result<A, TupleT>::type ra = a.eval(args);
1155 typename actor_result<B, TupleT>::type rb = b.eval(args);
1156 typename actor_result<C, TupleT>::type rc = c.eval(args);
1157 typename actor_result<D, TupleT>::type rd = d.eval(args);
1158 typename actor_result<E, TupleT>::type re = e.eval(args);
1159 typename actor_result<F, TupleT>::type rf = f.eval(args);
1160 typename actor_result<G, TupleT>::type rg = g.eval(args);
1161 typename actor_result<H, TupleT>::type rh = h.eval(args);
1162 typename actor_result<I, TupleT>::type ri = i.eval(args);
1163 typename actor_result<J, TupleT>::type rj = j.eval(args);
1164 typename actor_result<K, TupleT>::type rk = k.eval(args);
1165 typename actor_result<L, TupleT>::type rl = l.eval(args);
1166 typename actor_result<M, TupleT>::type rm = m.eval(args);
1167 typename actor_result<N, TupleT>::type rn = n.eval(args);
1168 return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj, rk, rl, rm, rn);
1171 mutable OperationT op; // operation
1172 A a; B b; C c; D d; E e; F f; G g; H h; I i; J j;
1173 K k; L l; M m; N n; // actors
1176 ///////////////////////////////////////////////////////////////////////////////
1178 // composite <15 actors> class
1180 ///////////////////////////////////////////////////////////////////////////////
1181 template <typename OperationT, typename TupleT,
1182 typename A, typename B, typename C, typename D, typename E,
1183 typename F, typename G, typename H, typename I, typename J,
1184 typename K, typename L, typename M, typename N, typename O>
1185 struct composite15_result {
1187 typedef typename OperationT::template result<
1188 typename actor_result<A, TupleT>::plain_type,
1189 typename actor_result<B, TupleT>::plain_type,
1190 typename actor_result<C, TupleT>::plain_type,
1191 typename actor_result<D, TupleT>::plain_type,
1192 typename actor_result<E, TupleT>::plain_type,
1193 typename actor_result<F, TupleT>::plain_type,
1194 typename actor_result<G, TupleT>::plain_type,
1195 typename actor_result<H, TupleT>::plain_type,
1196 typename actor_result<I, TupleT>::plain_type,
1197 typename actor_result<J, TupleT>::plain_type,
1198 typename actor_result<K, TupleT>::plain_type,
1199 typename actor_result<L, TupleT>::plain_type,
1200 typename actor_result<M, TupleT>::plain_type,
1201 typename actor_result<N, TupleT>::plain_type,
1202 typename actor_result<O, TupleT>::plain_type
1206 //////////////////////////////////
1207 template <typename OperationT,
1208 typename A, typename B, typename C, typename D, typename E,
1209 typename F, typename G, typename H, typename I, typename J,
1210 typename K, typename L, typename M, typename N, typename O>
1211 struct composite<OperationT,
1212 A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, nil_t
1215 typedef composite<OperationT,
1216 A, B, C, D, E, F, G, H, I, J, K, L, M, N, O> self_t;
1218 template <typename TupleT>
1221 typedef typename composite15_result<
1222 OperationT, TupleT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O
1226 composite(OperationT const& op_,
1227 A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
1228 F const& f_, G const& g_, H const& h_, I const& i_, J const& j_,
1229 K const& k_, L const& l_, M const& m_, N const& n_, O const& o_)
1230 : op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
1231 f(f_), g(g_), h(h_), i(i_), j(j_),
1232 k(k_), l(l_), m(m_), n(n_), o(o_) {}
1234 template <typename TupleT>
1235 typename actor_result<self_t, TupleT>::type
1236 eval(TupleT const& args) const
1238 typename actor_result<A, TupleT>::type ra = a.eval(args);
1239 typename actor_result<B, TupleT>::type rb = b.eval(args);
1240 typename actor_result<C, TupleT>::type rc = c.eval(args);
1241 typename actor_result<D, TupleT>::type rd = d.eval(args);
1242 typename actor_result<E, TupleT>::type re = e.eval(args);
1243 typename actor_result<F, TupleT>::type rf = f.eval(args);
1244 typename actor_result<G, TupleT>::type rg = g.eval(args);
1245 typename actor_result<H, TupleT>::type rh = h.eval(args);
1246 typename actor_result<I, TupleT>::type ri = i.eval(args);
1247 typename actor_result<J, TupleT>::type rj = j.eval(args);
1248 typename actor_result<K, TupleT>::type rk = k.eval(args);
1249 typename actor_result<L, TupleT>::type rl = l.eval(args);
1250 typename actor_result<M, TupleT>::type rm = m.eval(args);
1251 typename actor_result<N, TupleT>::type rn = n.eval(args);
1252 typename actor_result<O, TupleT>::type ro = o.eval(args);
1253 return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj, rk, rl, rm, rn, ro);
1256 mutable OperationT op; // operation
1257 A a; B b; C c; D d; E e; F f; G g; H h; I i; J j;
1258 K k; L l; M m; N n; O o; // actors
1268 ///////////////////////////////////////////////////////////////////////////
1270 // make_composite is basically a type computer that answers the
1271 // question "Given types T0..TN, what composite type should I
1272 // create <composite_type> and if I were to generate an actual
1273 // composite, what type <type> should I return?"
1275 ///////////////////////////////////////////////////////////////////////////
1278 , typename A = nil_t
1279 , typename B = nil_t
1280 , typename C = nil_t
1282 #if PHOENIX_LIMIT > 3
1283 , typename D = nil_t
1284 , typename E = nil_t
1285 , typename F = nil_t
1287 #if PHOENIX_LIMIT > 6
1288 , typename G = nil_t
1289 , typename H = nil_t
1290 , typename I = nil_t
1292 #if PHOENIX_LIMIT > 9
1293 , typename J = nil_t
1294 , typename K = nil_t
1295 , typename L = nil_t
1297 #if PHOENIX_LIMIT > 12
1298 , typename M = nil_t
1299 , typename N = nil_t
1300 , typename O = nil_t
1307 struct make_composite {
1309 typedef composite<OperationT
1310 , typename as_actor<A>::type
1311 , typename as_actor<B>::type
1312 , typename as_actor<C>::type
1314 #if PHOENIX_LIMIT > 3
1315 , typename as_actor<D>::type
1316 , typename as_actor<E>::type
1317 , typename as_actor<F>::type
1319 #if PHOENIX_LIMIT > 6
1320 , typename as_actor<G>::type
1321 , typename as_actor<H>::type
1322 , typename as_actor<I>::type
1324 #if PHOENIX_LIMIT > 9
1325 , typename as_actor<J>::type
1326 , typename as_actor<K>::type
1327 , typename as_actor<L>::type
1329 #if PHOENIX_LIMIT > 12
1330 , typename as_actor<M>::type
1331 , typename as_actor<N>::type
1332 , typename as_actor<O>::type
1340 typedef actor<composite_type> type;
1343 ///////////////////////////////////////////////////////////////////////////
1345 // make_unary, make_binary, make_binary1, make_binary2 and
1346 // make_binary3 utilities are provided here for easy creation of
1347 // unary and binary composites.
1349 ///////////////////////////////////////////////////////////////////////////
1351 ////////////////////////////////// input is an actor
1352 template <typename OperationT, typename BaseT>
1355 typedef typename make_composite
1356 <OperationT, actor<BaseT> >::type type;
1359 construct(actor<BaseT> const& _0)
1361 typedef typename make_composite
1362 <OperationT, actor<BaseT> >::composite_type
1365 return ret_t(OperationT(), _0);
1369 ////////////////////////////////// LHS is an actor, RHS is unknown
1370 template <typename OperationT, typename BaseT, typename B>
1371 struct make_binary1 {
1373 typedef typename make_composite
1374 <OperationT, actor<BaseT>, B>::type type;
1377 construct(actor<BaseT> const& _0, B const& _1)
1379 typedef typename make_composite
1380 <OperationT, actor<BaseT>, B>::composite_type
1383 return ret_t(OperationT(), _0, as_actor<B>::convert(_1));
1387 ////////////////////////////////// LHS is unknown, RHS is an actor
1388 template <typename OperationT, typename A, typename BaseT>
1389 struct make_binary2 {
1391 typedef typename make_composite
1392 <OperationT, A, actor<BaseT> >::type type;
1395 construct(A const& _0, actor<BaseT> const& _1)
1397 typedef typename make_composite
1398 <OperationT, A, actor<BaseT> >::composite_type
1401 return ret_t(OperationT(), as_actor<A>::convert(_0), _1);
1405 ////////////////////////////////// Both LHS and RHS are actors
1406 template <typename OperationT, typename BaseA, typename BaseB>
1407 struct make_binary3 {
1409 typedef typename make_composite
1410 <OperationT, actor<BaseA>, actor<BaseB> >::type type;
1413 construct(actor<BaseA> const& _0, actor<BaseB> const& _1)
1415 typedef typename make_composite
1416 <OperationT, actor<BaseA>, actor<BaseB> >::composite_type
1419 return ret_t(OperationT(), _0, _1);
1425 #if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
1426 #pragma warning(pop)
1429 } // namespace phoenix