1
/*=============================================================================
3
Copyright (c) 2001-2002 Joel de Guzman
5
Permission to copy, use, modify, sell and distribute this software
6
is granted provided this copyright notice appears in all copies.
7
This software is provided "as is" without express or implied
8
warranty, and with no claim as to its suitability for any purpose.
9
==============================================================================*/
10
#ifndef PHOENIX_COMPOSITE_HPP
11
#define PHOENIX_COMPOSITE_HPP
13
///////////////////////////////////////////////////////////////////////////////
14
#include "boost/spirit/phoenix/actor.hpp"
16
///////////////////////////////////////////////////////////////////////////////
19
///////////////////////////////////////////////////////////////////////////////
23
// A composite is an actor base class composed of zero or more
24
// actors (see actor.hpp) and an operation. A composite is itself
25
// an actor superclass and conforms to its conceptual interface.
26
// Its eval member function un-funnels the tupled actual arguments
27
// from the tuple by invoking each of the actors' eval member
28
// function. The results of each are then passed on as arguments to
29
// the operation. Specializations are provided to handle different
34
// actor0.eval(tupled_args) --> arg0 --> |
35
// actor1.eval(tupled_args) --> arg1 --> |
36
// actor2.eval(tupled_args) --> arg3 --> | --> operation(arg0...argN)
38
// actorN.eval(tupled_args) --> argN --> |
40
// The operation can be any suitable functor that can accept the
41
// arguments passed in by the composite. The operation is expected
42
// to have a member operator() that carries out the actual
43
// operation. There should be a one to one correspondence between
44
// actors of the composite and the arguments of the operation's
47
// The operation is also expected to have a nested template class
48
// result<T0...TN>. The nested template class result should have a
49
// typedef 'type' that reflects the return type of its member
50
// operator(). This is essentially a type computer that answers the
51
// metaprogramming question "Given arguments of type T0...TN, what
52
// will be its operator()'s return type?".
54
// There is a special case for operations that accept no arguments.
55
// Such nullary operations are only required to define a typedef
56
// result_type that reflects the return type of its operator().
58
// Here's an example of a simple operation that squares a number:
62
// template <typename ArgT>
63
// struct result { typedef ArgT type; };
65
// template <typename ArgT>
66
// ArgT operator()(ArgT n) const { return n * n; }
69
// As can be seen, operations can be polymorphic. Its arguments and
70
// return type are not fixed to a particular type. The example
71
// above for example, can handle any ArgT type as long as it has a
72
// multiplication operator.
74
// Composites are not created directly. Instead, there are meta-
75
// programs provided that indirectly create composites. See
76
// operators.hpp, binders.hpp and functions.hpp for examples.
78
///////////////////////////////////////////////////////////////////////////////
100
#if PHOENIX_LIMIT > 12
110
, typename NU = nil_t // Not used
114
///////////////////////////////////////////////////////////////////////////////
116
// composite <0 actor> class
118
///////////////////////////////////////////////////////////////////////////////
119
template <typename OperationT, typename TupleT>
120
struct composite0_result {
122
typedef typename OperationT::result_type type;
125
//////////////////////////////////
126
template <typename OperationT>
127
struct composite<OperationT,
129
#if PHOENIX_LIMIT > 3
131
#if PHOENIX_LIMIT > 6
133
#if PHOENIX_LIMIT > 9
135
#if PHOENIX_LIMIT > 12
144
typedef composite<OperationT> self_t;
146
template <typename TupleT>
149
typedef typename composite0_result<
154
composite(OperationT const& op_)
157
template <typename TupleT>
158
typename OperationT::result_type
159
eval(TupleT const& /*args*/) const
164
mutable OperationT op; // operation
167
///////////////////////////////////////////////////////////////////////////////
169
// composite <1 actor> class
171
///////////////////////////////////////////////////////////////////////////////
172
template <typename OperationT, typename TupleT,
174
struct composite1_result {
176
typedef typename OperationT::template result<
177
typename actor_result<A, TupleT>::plain_type
181
//////////////////////////////////
182
template <typename OperationT,
184
struct composite<OperationT,
186
#if PHOENIX_LIMIT > 3
188
#if PHOENIX_LIMIT > 6
190
#if PHOENIX_LIMIT > 9
192
#if PHOENIX_LIMIT > 12
201
typedef composite<OperationT, A> self_t;
203
template <typename TupleT>
206
typedef typename composite1_result<
207
OperationT, TupleT, A
211
composite(OperationT const& op_,
215
template <typename TupleT>
216
typename actor_result<self_t, TupleT>::type
217
eval(TupleT const& args) const
219
typename actor_result<A, TupleT>::type ra = a.eval(args);
223
mutable OperationT op; // operation
227
///////////////////////////////////////////////////////////////////////////////
229
// composite <2 actors> class
231
///////////////////////////////////////////////////////////////////////////////
232
template <typename OperationT, typename TupleT,
233
typename A, typename B>
234
struct composite2_result {
236
typedef typename OperationT::template result<
237
typename actor_result<A, TupleT>::plain_type,
238
typename actor_result<B, TupleT>::plain_type
242
//////////////////////////////////
243
template <typename OperationT,
244
typename A, typename B>
245
struct composite<OperationT,
247
#if PHOENIX_LIMIT > 3
249
#if PHOENIX_LIMIT > 6
251
#if PHOENIX_LIMIT > 9
253
#if PHOENIX_LIMIT > 12
262
typedef composite<OperationT, A, B> self_t;
264
template <typename TupleT>
267
typedef typename composite2_result<
268
OperationT, TupleT, A, B
272
composite(OperationT const& op_,
273
A const& a_, B const& b_)
274
: op(op_), a(a_), b(b_) {}
276
template <typename TupleT>
277
typename actor_result<self_t, TupleT>::type
278
eval(TupleT const& args) const
280
typename actor_result<A, TupleT>::type ra = a.eval(args);
281
typename actor_result<B, TupleT>::type rb = b.eval(args);
285
mutable OperationT op; // operation
289
///////////////////////////////////////////////////////////////////////////////
291
// composite <3 actors> class
293
///////////////////////////////////////////////////////////////////////////////
294
template <typename OperationT, typename TupleT,
295
typename A, typename B, typename C>
296
struct composite3_result {
298
typedef typename OperationT::template result<
299
typename actor_result<A, TupleT>::plain_type,
300
typename actor_result<B, TupleT>::plain_type,
301
typename actor_result<C, TupleT>::plain_type
305
//////////////////////////////////
306
template <typename OperationT,
307
typename A, typename B, typename C>
308
struct composite<OperationT,
310
#if PHOENIX_LIMIT > 3
312
#if PHOENIX_LIMIT > 6
314
#if PHOENIX_LIMIT > 9
316
#if PHOENIX_LIMIT > 12
325
typedef composite<OperationT, A, B, C> self_t;
327
template <typename TupleT>
330
typedef typename composite3_result<
331
OperationT, TupleT, A, B, C
335
composite(OperationT const& op_,
336
A const& a_, B const& b_, C const& c_)
337
: op(op_), a(a_), b(b_), c(c_) {}
339
template <typename TupleT>
340
typename actor_result<self_t, TupleT>::type
341
eval(TupleT const& args) const
343
typename actor_result<A, TupleT>::type ra = a.eval(args);
344
typename actor_result<B, TupleT>::type rb = b.eval(args);
345
typename actor_result<C, TupleT>::type rc = c.eval(args);
346
return op(ra, rb, rc);
349
mutable OperationT op; // operation
350
A a; B b; C c; // actors
353
#if PHOENIX_LIMIT > 3
354
///////////////////////////////////////////////////////////////////////////////
356
// composite <4 actors> class
358
///////////////////////////////////////////////////////////////////////////////
359
template <typename OperationT, typename TupleT,
360
typename A, typename B, typename C, typename D>
361
struct composite4_result {
363
typedef typename OperationT::template result<
364
typename actor_result<A, TupleT>::plain_type,
365
typename actor_result<B, TupleT>::plain_type,
366
typename actor_result<C, TupleT>::plain_type,
367
typename actor_result<D, TupleT>::plain_type
371
//////////////////////////////////
372
template <typename OperationT,
373
typename A, typename B, typename C, typename D>
374
struct composite<OperationT,
375
A, B, C, D, nil_t, nil_t,
376
#if PHOENIX_LIMIT > 6
378
#if PHOENIX_LIMIT > 9
380
#if PHOENIX_LIMIT > 12
388
typedef composite<OperationT, A, B, C, D> self_t;
390
template <typename TupleT>
393
typedef typename composite4_result<
394
OperationT, TupleT, A, B, C, D
398
composite(OperationT const& op_,
399
A const& a_, B const& b_, C const& c_, D const& d_)
400
: op(op_), a(a_), b(b_), c(c_), d(d_) {}
402
template <typename TupleT>
403
typename actor_result<self_t, TupleT>::type
404
eval(TupleT const& args) const
406
typename actor_result<A, TupleT>::type ra = a.eval(args);
407
typename actor_result<B, TupleT>::type rb = b.eval(args);
408
typename actor_result<C, TupleT>::type rc = c.eval(args);
409
typename actor_result<D, TupleT>::type rd = d.eval(args);
410
return op(ra, rb, rc, rd);
413
mutable OperationT op; // operation
414
A a; B b; C c; D d; // actors
417
///////////////////////////////////////////////////////////////////////////////
419
// composite <5 actors> class
421
///////////////////////////////////////////////////////////////////////////////
422
template <typename OperationT, typename TupleT,
423
typename A, typename B, typename C, typename D, typename E>
424
struct composite5_result {
426
typedef typename OperationT::template result<
427
typename actor_result<A, TupleT>::plain_type,
428
typename actor_result<B, TupleT>::plain_type,
429
typename actor_result<C, TupleT>::plain_type,
430
typename actor_result<D, TupleT>::plain_type,
431
typename actor_result<E, TupleT>::plain_type
435
//////////////////////////////////
436
template <typename OperationT,
437
typename A, typename B, typename C, typename D, typename E>
438
struct composite<OperationT,
439
A, B, C, D, E, nil_t,
440
#if PHOENIX_LIMIT > 6
442
#if PHOENIX_LIMIT > 9
444
#if PHOENIX_LIMIT > 12
452
typedef composite<OperationT, A, B, C, D, E> self_t;
454
template <typename TupleT>
457
typedef typename composite5_result<
458
OperationT, TupleT, A, B, C, D, E
462
composite(OperationT const& op_,
463
A const& a_, B const& b_, C const& c_, D const& d_, E const& e_)
464
: op(op_), a(a_), b(b_), c(c_), d(d_), e(e_) {}
466
template <typename TupleT>
467
typename actor_result<self_t, TupleT>::type
468
eval(TupleT const& args) const
470
typename actor_result<A, TupleT>::type ra = a.eval(args);
471
typename actor_result<B, TupleT>::type rb = b.eval(args);
472
typename actor_result<C, TupleT>::type rc = c.eval(args);
473
typename actor_result<D, TupleT>::type rd = d.eval(args);
474
typename actor_result<E, TupleT>::type re = e.eval(args);
475
return op(ra, rb, rc, rd, re);
478
mutable OperationT op; // operation
479
A a; B b; C c; D d; E e; // actors
482
///////////////////////////////////////////////////////////////////////////////
484
// composite <6 actors> class
486
///////////////////////////////////////////////////////////////////////////////
487
template <typename OperationT, typename TupleT,
488
typename A, typename B, typename C, typename D, typename E,
490
struct composite6_result {
492
typedef typename OperationT::template result<
493
typename actor_result<A, TupleT>::plain_type,
494
typename actor_result<B, TupleT>::plain_type,
495
typename actor_result<C, TupleT>::plain_type,
496
typename actor_result<D, TupleT>::plain_type,
497
typename actor_result<E, TupleT>::plain_type,
498
typename actor_result<F, TupleT>::plain_type
502
//////////////////////////////////
503
template <typename OperationT,
504
typename A, typename B, typename C, typename D, typename E,
506
struct composite<OperationT,
508
#if PHOENIX_LIMIT > 6
510
#if PHOENIX_LIMIT > 9
512
#if PHOENIX_LIMIT > 12
520
typedef composite<OperationT, A, B, C, D, E, F> self_t;
522
template <typename TupleT>
525
typedef typename composite6_result<
526
OperationT, TupleT, A, B, C, D, E, F
530
composite(OperationT const& op_,
531
A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
533
: op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
536
template <typename TupleT>
537
typename actor_result<self_t, TupleT>::type
538
eval(TupleT const& args) const
540
typename actor_result<A, TupleT>::type ra = a.eval(args);
541
typename actor_result<B, TupleT>::type rb = b.eval(args);
542
typename actor_result<C, TupleT>::type rc = c.eval(args);
543
typename actor_result<D, TupleT>::type rd = d.eval(args);
544
typename actor_result<E, TupleT>::type re = e.eval(args);
545
typename actor_result<F, TupleT>::type rf = f.eval(args);
546
return op(ra, rb, rc, rd, re, rf);
549
mutable OperationT op; // operation
550
A a; B b; C c; D d; E e; F f; // actors
553
#if PHOENIX_LIMIT > 6
554
///////////////////////////////////////////////////////////////////////////////
556
// composite <7 actors> class
558
///////////////////////////////////////////////////////////////////////////////
559
template <typename OperationT, typename TupleT,
560
typename A, typename B, typename C, typename D, typename E,
561
typename F, typename G>
562
struct composite7_result {
564
typedef typename OperationT::template result<
565
typename actor_result<A, TupleT>::plain_type,
566
typename actor_result<B, TupleT>::plain_type,
567
typename actor_result<C, TupleT>::plain_type,
568
typename actor_result<D, TupleT>::plain_type,
569
typename actor_result<E, TupleT>::plain_type,
570
typename actor_result<F, TupleT>::plain_type,
571
typename actor_result<G, TupleT>::plain_type
575
//////////////////////////////////
576
template <typename OperationT,
577
typename A, typename B, typename C, typename D, typename E,
578
typename F, typename G>
579
struct composite<OperationT,
580
A, B, C, D, E, F, G, nil_t, nil_t,
581
#if PHOENIX_LIMIT > 9
583
#if PHOENIX_LIMIT > 12
590
typedef composite<OperationT, A, B, C, D, E, F, G> self_t;
592
template <typename TupleT>
595
typedef typename composite7_result<
596
OperationT, TupleT, A, B, C, D, E, F, G
600
composite(OperationT const& op_,
601
A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
602
F const& f_, G const& g_)
603
: op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
606
template <typename TupleT>
607
typename actor_result<self_t, TupleT>::type
608
eval(TupleT const& args) const
610
typename actor_result<A, TupleT>::type ra = a.eval(args);
611
typename actor_result<B, TupleT>::type rb = b.eval(args);
612
typename actor_result<C, TupleT>::type rc = c.eval(args);
613
typename actor_result<D, TupleT>::type rd = d.eval(args);
614
typename actor_result<E, TupleT>::type re = e.eval(args);
615
typename actor_result<F, TupleT>::type rf = f.eval(args);
616
typename actor_result<G, TupleT>::type rg = g.eval(args);
617
return op(ra, rb, rc, rd, re, rf, rg);
620
mutable OperationT op; // operation
621
A a; B b; C c; D d; E e; F f; G g; // actors
624
///////////////////////////////////////////////////////////////////////////////
626
// composite <8 actors> class
628
///////////////////////////////////////////////////////////////////////////////
629
template <typename OperationT, typename TupleT,
630
typename A, typename B, typename C, typename D, typename E,
631
typename F, typename G, typename H>
632
struct composite8_result {
634
typedef typename OperationT::template result<
635
typename actor_result<A, TupleT>::plain_type,
636
typename actor_result<B, TupleT>::plain_type,
637
typename actor_result<C, TupleT>::plain_type,
638
typename actor_result<D, TupleT>::plain_type,
639
typename actor_result<E, TupleT>::plain_type,
640
typename actor_result<F, TupleT>::plain_type,
641
typename actor_result<G, TupleT>::plain_type,
642
typename actor_result<H, TupleT>::plain_type
646
//////////////////////////////////
647
template <typename OperationT,
648
typename A, typename B, typename C, typename D, typename E,
649
typename F, typename G, typename H>
650
struct composite<OperationT,
651
A, B, C, D, E, F, G, H, nil_t,
652
#if PHOENIX_LIMIT > 9
654
#if PHOENIX_LIMIT > 12
661
typedef composite<OperationT, A, B, C, D, E, F, G, H> self_t;
663
template <typename TupleT>
666
typedef typename composite8_result<
667
OperationT, TupleT, A, B, C, D, E, F, G, H
671
composite(OperationT const& op_,
672
A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
673
F const& f_, G const& g_, H const& h_)
674
: op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
675
f(f_), g(g_), h(h_) {}
677
template <typename TupleT>
678
typename actor_result<self_t, TupleT>::type
679
eval(TupleT const& args) const
681
typename actor_result<A, TupleT>::type ra = a.eval(args);
682
typename actor_result<B, TupleT>::type rb = b.eval(args);
683
typename actor_result<C, TupleT>::type rc = c.eval(args);
684
typename actor_result<D, TupleT>::type rd = d.eval(args);
685
typename actor_result<E, TupleT>::type re = e.eval(args);
686
typename actor_result<F, TupleT>::type rf = f.eval(args);
687
typename actor_result<G, TupleT>::type rg = g.eval(args);
688
typename actor_result<H, TupleT>::type rh = h.eval(args);
689
return op(ra, rb, rc, rd, re, rf, rg, rh);
692
mutable OperationT op; // operation
693
A a; B b; C c; D d; E e; F f; G g; H h; // actors
696
///////////////////////////////////////////////////////////////////////////////
698
// composite <9 actors> class
700
///////////////////////////////////////////////////////////////////////////////
701
template <typename OperationT, typename TupleT,
702
typename A, typename B, typename C, typename D, typename E,
703
typename F, typename G, typename H, typename I>
704
struct composite9_result {
706
typedef typename OperationT::template result<
707
typename actor_result<A, TupleT>::plain_type,
708
typename actor_result<B, TupleT>::plain_type,
709
typename actor_result<C, TupleT>::plain_type,
710
typename actor_result<D, TupleT>::plain_type,
711
typename actor_result<E, TupleT>::plain_type,
712
typename actor_result<F, TupleT>::plain_type,
713
typename actor_result<G, TupleT>::plain_type,
714
typename actor_result<H, TupleT>::plain_type,
715
typename actor_result<I, TupleT>::plain_type
719
//////////////////////////////////
720
template <typename OperationT,
721
typename A, typename B, typename C, typename D, typename E,
722
typename F, typename G, typename H, typename I>
723
struct composite<OperationT,
724
A, B, C, D, E, F, G, H, I,
725
#if PHOENIX_LIMIT > 9
727
#if PHOENIX_LIMIT > 12
734
typedef composite<OperationT, A, B, C, D, E, F, G, H, I> self_t;
736
template <typename TupleT>
739
typedef typename composite9_result<
740
OperationT, TupleT, A, B, C, D, E, F, G, H, I
744
composite(OperationT const& op_,
745
A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
746
F const& f_, G const& g_, H const& h_, I const& i_)
747
: op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
748
f(f_), g(g_), h(h_), i(i_) {}
750
template <typename TupleT>
751
typename actor_result<self_t, TupleT>::type
752
eval(TupleT const& args) const
754
typename actor_result<A, TupleT>::type ra = a.eval(args);
755
typename actor_result<B, TupleT>::type rb = b.eval(args);
756
typename actor_result<C, TupleT>::type rc = c.eval(args);
757
typename actor_result<D, TupleT>::type rd = d.eval(args);
758
typename actor_result<E, TupleT>::type re = e.eval(args);
759
typename actor_result<F, TupleT>::type rf = f.eval(args);
760
typename actor_result<G, TupleT>::type rg = g.eval(args);
761
typename actor_result<H, TupleT>::type rh = h.eval(args);
762
typename actor_result<I, TupleT>::type ri = i.eval(args);
763
return op(ra, rb, rc, rd, re, rf, rg, rh, ri);
766
mutable OperationT op; // operation
767
A a; B b; C c; D d; E e; F f; G g; H h; I i; // actors
770
#if PHOENIX_LIMIT > 9
771
///////////////////////////////////////////////////////////////////////////////
773
// composite <10 actors> class
775
///////////////////////////////////////////////////////////////////////////////
776
template <typename OperationT, typename TupleT,
777
typename A, typename B, typename C, typename D, typename E,
778
typename F, typename G, typename H, typename I, typename J>
779
struct composite10_result {
781
typedef typename OperationT::template result<
782
typename actor_result<A, TupleT>::plain_type,
783
typename actor_result<B, TupleT>::plain_type,
784
typename actor_result<C, TupleT>::plain_type,
785
typename actor_result<D, TupleT>::plain_type,
786
typename actor_result<E, TupleT>::plain_type,
787
typename actor_result<F, TupleT>::plain_type,
788
typename actor_result<G, TupleT>::plain_type,
789
typename actor_result<H, TupleT>::plain_type,
790
typename actor_result<I, TupleT>::plain_type,
791
typename actor_result<J, TupleT>::plain_type
795
//////////////////////////////////
796
template <typename OperationT,
797
typename A, typename B, typename C, typename D, typename E,
798
typename F, typename G, typename H, typename I, typename J>
799
struct composite<OperationT,
800
A, B, C, D, E, F, G, H, I, J, nil_t, nil_t,
801
#if PHOENIX_LIMIT > 12
807
typedef composite<OperationT, A, B, C, D, E, F, G, H, I, J> self_t;
809
template <typename TupleT>
812
typedef typename composite10_result<
813
OperationT, TupleT, A, B, C, D, E, F, G, H, I, J
817
composite(OperationT const& op_,
818
A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
819
F const& f_, G const& g_, H const& h_, I const& i_, J const& j_)
820
: op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
821
f(f_), g(g_), h(h_), i(i_), j(j_) {}
823
template <typename TupleT>
824
typename actor_result<self_t, TupleT>::type
825
eval(TupleT const& args) const
827
typename actor_result<A, TupleT>::type ra = a.eval(args);
828
typename actor_result<B, TupleT>::type rb = b.eval(args);
829
typename actor_result<C, TupleT>::type rc = c.eval(args);
830
typename actor_result<D, TupleT>::type rd = d.eval(args);
831
typename actor_result<E, TupleT>::type re = e.eval(args);
832
typename actor_result<F, TupleT>::type rf = f.eval(args);
833
typename actor_result<G, TupleT>::type rg = g.eval(args);
834
typename actor_result<H, TupleT>::type rh = h.eval(args);
835
typename actor_result<I, TupleT>::type ri = i.eval(args);
836
typename actor_result<J, TupleT>::type rj = j.eval(args);
837
return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj);
840
mutable OperationT op; // operation
841
A a; B b; C c; D d; E e; F f; G g; H h; I i; J j; // actors
844
///////////////////////////////////////////////////////////////////////////////
846
// composite <11 actors> class
848
///////////////////////////////////////////////////////////////////////////////
849
template <typename OperationT, typename TupleT,
850
typename A, typename B, typename C, typename D, typename E,
851
typename F, typename G, typename H, typename I, typename J,
853
struct composite11_result {
855
typedef typename OperationT::template result<
856
typename actor_result<A, TupleT>::plain_type,
857
typename actor_result<B, TupleT>::plain_type,
858
typename actor_result<C, TupleT>::plain_type,
859
typename actor_result<D, TupleT>::plain_type,
860
typename actor_result<E, TupleT>::plain_type,
861
typename actor_result<F, TupleT>::plain_type,
862
typename actor_result<G, TupleT>::plain_type,
863
typename actor_result<H, TupleT>::plain_type,
864
typename actor_result<I, TupleT>::plain_type,
865
typename actor_result<J, TupleT>::plain_type,
866
typename actor_result<K, TupleT>::plain_type
870
//////////////////////////////////
871
template <typename OperationT,
872
typename A, typename B, typename C, typename D, typename E,
873
typename F, typename G, typename H, typename I, typename J,
875
struct composite<OperationT,
876
A, B, C, D, E, F, G, H, I, J, K, nil_t,
877
#if PHOENIX_LIMIT > 12
883
typedef composite<OperationT,
884
A, B, C, D, E, F, G, H, I, J, K> self_t;
886
template <typename TupleT>
889
typedef typename composite11_result<
890
OperationT, TupleT, A, B, C, D, E, F, G, H, I, J, K
894
composite(OperationT const& op_,
895
A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
896
F const& f_, G const& g_, H const& h_, I const& i_, J const& j_,
898
: op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
899
f(f_), g(g_), h(h_), i(i_), j(j_),
902
template <typename TupleT>
903
typename actor_result<self_t, TupleT>::type
904
eval(TupleT const& args) const
906
typename actor_result<A, TupleT>::type ra = a.eval(args);
907
typename actor_result<B, TupleT>::type rb = b.eval(args);
908
typename actor_result<C, TupleT>::type rc = c.eval(args);
909
typename actor_result<D, TupleT>::type rd = d.eval(args);
910
typename actor_result<E, TupleT>::type re = e.eval(args);
911
typename actor_result<F, TupleT>::type rf = f.eval(args);
912
typename actor_result<G, TupleT>::type rg = g.eval(args);
913
typename actor_result<H, TupleT>::type rh = h.eval(args);
914
typename actor_result<I, TupleT>::type ri = i.eval(args);
915
typename actor_result<J, TupleT>::type rj = j.eval(args);
916
typename actor_result<K, TupleT>::type rk = k.eval(args);
917
return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj, rk);
920
mutable OperationT op; // operation
921
A a; B b; C c; D d; E e; F f; G g; H h; I i; J j;
925
///////////////////////////////////////////////////////////////////////////////
927
// composite <12 actors> class
929
///////////////////////////////////////////////////////////////////////////////
930
template <typename OperationT, typename TupleT,
931
typename A, typename B, typename C, typename D, typename E,
932
typename F, typename G, typename H, typename I, typename J,
933
typename K, typename L>
934
struct composite12_result {
936
typedef typename OperationT::template result<
937
typename actor_result<A, TupleT>::plain_type,
938
typename actor_result<B, TupleT>::plain_type,
939
typename actor_result<C, TupleT>::plain_type,
940
typename actor_result<D, TupleT>::plain_type,
941
typename actor_result<E, TupleT>::plain_type,
942
typename actor_result<F, TupleT>::plain_type,
943
typename actor_result<G, TupleT>::plain_type,
944
typename actor_result<H, TupleT>::plain_type,
945
typename actor_result<I, TupleT>::plain_type,
946
typename actor_result<J, TupleT>::plain_type,
947
typename actor_result<K, TupleT>::plain_type,
948
typename actor_result<L, TupleT>::plain_type
952
//////////////////////////////////
953
template <typename OperationT,
954
typename A, typename B, typename C, typename D, typename E,
955
typename F, typename G, typename H, typename I, typename J,
956
typename K, typename L>
957
struct composite<OperationT,
958
A, B, C, D, E, F, G, H, I, J, K, L,
959
#if PHOENIX_LIMIT > 12
965
typedef composite<OperationT,
966
A, B, C, D, E, F, G, H, I, J, K, L> self_t;
968
template <typename TupleT>
971
typedef typename composite12_result<
972
OperationT, TupleT, A, B, C, D, E, F, G, H, I, J, K, L
976
composite(OperationT const& op_,
977
A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
978
F const& f_, G const& g_, H const& h_, I const& i_, J const& j_,
979
K const& k_, L const& l_)
980
: op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
981
f(f_), g(g_), h(h_), i(i_), j(j_),
984
template <typename TupleT>
985
typename actor_result<self_t, TupleT>::type
986
eval(TupleT const& args) const
988
typename actor_result<A, TupleT>::type ra = a.eval(args);
989
typename actor_result<B, TupleT>::type rb = b.eval(args);
990
typename actor_result<C, TupleT>::type rc = c.eval(args);
991
typename actor_result<D, TupleT>::type rd = d.eval(args);
992
typename actor_result<E, TupleT>::type re = e.eval(args);
993
typename actor_result<F, TupleT>::type rf = f.eval(args);
994
typename actor_result<G, TupleT>::type rg = g.eval(args);
995
typename actor_result<H, TupleT>::type rh = h.eval(args);
996
typename actor_result<I, TupleT>::type ri = i.eval(args);
997
typename actor_result<J, TupleT>::type rj = j.eval(args);
998
typename actor_result<K, TupleT>::type rk = k.eval(args);
999
typename actor_result<L, TupleT>::type rl = l.eval(args);
1000
return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj, rk, rl);
1003
mutable OperationT op; // operation
1004
A a; B b; C c; D d; E e; F f; G g; H h; I i; J j;
1008
#if PHOENIX_LIMIT > 12
1009
///////////////////////////////////////////////////////////////////////////////
1011
// composite <13 actors> class
1013
///////////////////////////////////////////////////////////////////////////////
1014
template <typename OperationT, typename TupleT,
1015
typename A, typename B, typename C, typename D, typename E,
1016
typename F, typename G, typename H, typename I, typename J,
1017
typename K, typename L, typename M>
1018
struct composite13_result {
1020
typedef typename OperationT::template result<
1021
typename actor_result<A, TupleT>::plain_type,
1022
typename actor_result<B, TupleT>::plain_type,
1023
typename actor_result<C, TupleT>::plain_type,
1024
typename actor_result<D, TupleT>::plain_type,
1025
typename actor_result<E, TupleT>::plain_type,
1026
typename actor_result<F, TupleT>::plain_type,
1027
typename actor_result<G, TupleT>::plain_type,
1028
typename actor_result<H, TupleT>::plain_type,
1029
typename actor_result<I, TupleT>::plain_type,
1030
typename actor_result<J, TupleT>::plain_type,
1031
typename actor_result<K, TupleT>::plain_type,
1032
typename actor_result<L, TupleT>::plain_type,
1033
typename actor_result<M, TupleT>::plain_type
1037
//////////////////////////////////
1038
template <typename OperationT,
1039
typename A, typename B, typename C, typename D, typename E,
1040
typename F, typename G, typename H, typename I, typename J,
1041
typename K, typename L, typename M>
1042
struct composite<OperationT,
1043
A, B, C, D, E, F, G, H, I, J, K, L, M, nil_t, nil_t, nil_t
1046
typedef composite<OperationT,
1047
A, B, C, D, E, F, G, H, I, J, K, L, M> self_t;
1049
template <typename TupleT>
1052
typedef typename composite13_result<
1053
OperationT, TupleT, A, B, C, D, E, F, G, H, I, J, K, L, M
1057
composite(OperationT const& op_,
1058
A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
1059
F const& f_, G const& g_, H const& h_, I const& i_, J const& j_,
1060
K const& k_, L const& l_, M const& m_)
1061
: op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
1062
f(f_), g(g_), h(h_), i(i_), j(j_),
1063
k(k_), l(l_), m(m_) {}
1065
template <typename TupleT>
1066
typename actor_result<self_t, TupleT>::type
1067
eval(TupleT const& args) const
1069
typename actor_result<A, TupleT>::type ra = a.eval(args);
1070
typename actor_result<B, TupleT>::type rb = b.eval(args);
1071
typename actor_result<C, TupleT>::type rc = c.eval(args);
1072
typename actor_result<D, TupleT>::type rd = d.eval(args);
1073
typename actor_result<E, TupleT>::type re = e.eval(args);
1074
typename actor_result<F, TupleT>::type rf = f.eval(args);
1075
typename actor_result<G, TupleT>::type rg = g.eval(args);
1076
typename actor_result<H, TupleT>::type rh = h.eval(args);
1077
typename actor_result<I, TupleT>::type ri = i.eval(args);
1078
typename actor_result<J, TupleT>::type rj = j.eval(args);
1079
typename actor_result<K, TupleT>::type rk = k.eval(args);
1080
typename actor_result<L, TupleT>::type rl = l.eval(args);
1081
typename actor_result<M, TupleT>::type rm = m.eval(args);
1082
return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj, rk, rl, rm);
1085
mutable OperationT op; // operation
1086
A a; B b; C c; D d; E e; F f; G g; H h; I i; J j;
1087
K k; L l; M m; // actors
1090
///////////////////////////////////////////////////////////////////////////////
1092
// composite <14 actors> class
1094
///////////////////////////////////////////////////////////////////////////////
1095
template <typename OperationT, typename TupleT,
1096
typename A, typename B, typename C, typename D, typename E,
1097
typename F, typename G, typename H, typename I, typename J,
1098
typename K, typename L, typename M, typename N>
1099
struct composite14_result {
1101
typedef typename OperationT::template result<
1102
typename actor_result<A, TupleT>::plain_type,
1103
typename actor_result<B, TupleT>::plain_type,
1104
typename actor_result<C, TupleT>::plain_type,
1105
typename actor_result<D, TupleT>::plain_type,
1106
typename actor_result<E, TupleT>::plain_type,
1107
typename actor_result<F, TupleT>::plain_type,
1108
typename actor_result<G, TupleT>::plain_type,
1109
typename actor_result<H, TupleT>::plain_type,
1110
typename actor_result<I, TupleT>::plain_type,
1111
typename actor_result<J, TupleT>::plain_type,
1112
typename actor_result<K, TupleT>::plain_type,
1113
typename actor_result<L, TupleT>::plain_type,
1114
typename actor_result<M, TupleT>::plain_type,
1115
typename actor_result<N, TupleT>::plain_type
1119
//////////////////////////////////
1120
template <typename OperationT,
1121
typename A, typename B, typename C, typename D, typename E,
1122
typename F, typename G, typename H, typename I, typename J,
1123
typename K, typename L, typename M, typename N>
1124
struct composite<OperationT,
1125
A, B, C, D, E, F, G, H, I, J, K, L, M, N, nil_t, nil_t
1128
typedef composite<OperationT,
1129
A, B, C, D, E, F, G, H, I, J, K, L, M, N> self_t;
1131
template <typename TupleT>
1134
typedef typename composite14_result<
1135
OperationT, TupleT, A, B, C, D, E, F, G, H, I, J, K, L, M, N
1139
composite(OperationT const& op_,
1140
A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
1141
F const& f_, G const& g_, H const& h_, I const& i_, J const& j_,
1142
K const& k_, L const& l_, M const& m_, N const& n_)
1143
: op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
1144
f(f_), g(g_), h(h_), i(i_), j(j_),
1145
k(k_), l(l_), m(m_), n(n_) {}
1147
template <typename TupleT>
1148
typename actor_result<self_t, TupleT>::type
1149
eval(TupleT const& args) const
1151
typename actor_result<A, TupleT>::type ra = a.eval(args);
1152
typename actor_result<B, TupleT>::type rb = b.eval(args);
1153
typename actor_result<C, TupleT>::type rc = c.eval(args);
1154
typename actor_result<D, TupleT>::type rd = d.eval(args);
1155
typename actor_result<E, TupleT>::type re = e.eval(args);
1156
typename actor_result<F, TupleT>::type rf = f.eval(args);
1157
typename actor_result<G, TupleT>::type rg = g.eval(args);
1158
typename actor_result<H, TupleT>::type rh = h.eval(args);
1159
typename actor_result<I, TupleT>::type ri = i.eval(args);
1160
typename actor_result<J, TupleT>::type rj = j.eval(args);
1161
typename actor_result<K, TupleT>::type rk = k.eval(args);
1162
typename actor_result<L, TupleT>::type rl = l.eval(args);
1163
typename actor_result<M, TupleT>::type rm = m.eval(args);
1164
typename actor_result<N, TupleT>::type rn = n.eval(args);
1165
return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj, rk, rl, rm, rn);
1168
mutable OperationT op; // operation
1169
A a; B b; C c; D d; E e; F f; G g; H h; I i; J j;
1170
K k; L l; M m; N n; // actors
1173
///////////////////////////////////////////////////////////////////////////////
1175
// composite <15 actors> class
1177
///////////////////////////////////////////////////////////////////////////////
1178
template <typename OperationT, typename TupleT,
1179
typename A, typename B, typename C, typename D, typename E,
1180
typename F, typename G, typename H, typename I, typename J,
1181
typename K, typename L, typename M, typename N, typename O>
1182
struct composite15_result {
1184
typedef typename OperationT::template result<
1185
typename actor_result<A, TupleT>::plain_type,
1186
typename actor_result<B, TupleT>::plain_type,
1187
typename actor_result<C, TupleT>::plain_type,
1188
typename actor_result<D, TupleT>::plain_type,
1189
typename actor_result<E, TupleT>::plain_type,
1190
typename actor_result<F, TupleT>::plain_type,
1191
typename actor_result<G, TupleT>::plain_type,
1192
typename actor_result<H, TupleT>::plain_type,
1193
typename actor_result<I, TupleT>::plain_type,
1194
typename actor_result<J, TupleT>::plain_type,
1195
typename actor_result<K, TupleT>::plain_type,
1196
typename actor_result<L, TupleT>::plain_type,
1197
typename actor_result<M, TupleT>::plain_type,
1198
typename actor_result<N, TupleT>::plain_type,
1199
typename actor_result<O, TupleT>::plain_type
1203
//////////////////////////////////
1204
template <typename OperationT,
1205
typename A, typename B, typename C, typename D, typename E,
1206
typename F, typename G, typename H, typename I, typename J,
1207
typename K, typename L, typename M, typename N, typename O>
1208
struct composite<OperationT,
1209
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, nil_t
1212
typedef composite<OperationT,
1213
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O> self_t;
1215
template <typename TupleT>
1218
typedef typename composite15_result<
1219
OperationT, TupleT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O
1223
composite(OperationT const& op_,
1224
A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
1225
F const& f_, G const& g_, H const& h_, I const& i_, J const& j_,
1226
K const& k_, L const& l_, M const& m_, N const& n_, O const& o_)
1227
: op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
1228
f(f_), g(g_), h(h_), i(i_), j(j_),
1229
k(k_), l(l_), m(m_), n(n_), o(o_) {}
1231
template <typename TupleT>
1232
typename actor_result<self_t, TupleT>::type
1233
eval(TupleT const& args) const
1235
typename actor_result<A, TupleT>::type ra = a.eval(args);
1236
typename actor_result<B, TupleT>::type rb = b.eval(args);
1237
typename actor_result<C, TupleT>::type rc = c.eval(args);
1238
typename actor_result<D, TupleT>::type rd = d.eval(args);
1239
typename actor_result<E, TupleT>::type re = e.eval(args);
1240
typename actor_result<F, TupleT>::type rf = f.eval(args);
1241
typename actor_result<G, TupleT>::type rg = g.eval(args);
1242
typename actor_result<H, TupleT>::type rh = h.eval(args);
1243
typename actor_result<I, TupleT>::type ri = i.eval(args);
1244
typename actor_result<J, TupleT>::type rj = j.eval(args);
1245
typename actor_result<K, TupleT>::type rk = k.eval(args);
1246
typename actor_result<L, TupleT>::type rl = l.eval(args);
1247
typename actor_result<M, TupleT>::type rm = m.eval(args);
1248
typename actor_result<N, TupleT>::type rn = n.eval(args);
1249
typename actor_result<O, TupleT>::type ro = o.eval(args);
1250
return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj, rk, rl, rm, rn, ro);
1253
mutable OperationT op; // operation
1254
A a; B b; C c; D d; E e; F f; G g; H h; I i; J j;
1255
K k; L l; M m; N n; O o; // actors
1265
///////////////////////////////////////////////////////////////////////////
1267
// make_composite is basically a type computer that answers the
1268
// question "Given types T0..TN, what composite type should I
1269
// create <composite_type> and if I were to generate an actual
1270
// composite, what type <type> should I return?"
1272
///////////////////////////////////////////////////////////////////////////
1275
, typename A = nil_t
1276
, typename B = nil_t
1277
, typename C = nil_t
1279
#if PHOENIX_LIMIT > 3
1280
, typename D = nil_t
1281
, typename E = nil_t
1282
, typename F = nil_t
1284
#if PHOENIX_LIMIT > 6
1285
, typename G = nil_t
1286
, typename H = nil_t
1287
, typename I = nil_t
1289
#if PHOENIX_LIMIT > 9
1290
, typename J = nil_t
1291
, typename K = nil_t
1292
, typename L = nil_t
1294
#if PHOENIX_LIMIT > 12
1295
, typename M = nil_t
1296
, typename N = nil_t
1297
, typename O = nil_t
1304
struct make_composite {
1306
typedef composite<OperationT
1307
, typename as_actor<A>::type
1308
, typename as_actor<B>::type
1309
, typename as_actor<C>::type
1311
#if PHOENIX_LIMIT > 3
1312
, typename as_actor<D>::type
1313
, typename as_actor<E>::type
1314
, typename as_actor<F>::type
1316
#if PHOENIX_LIMIT > 6
1317
, typename as_actor<G>::type
1318
, typename as_actor<H>::type
1319
, typename as_actor<I>::type
1321
#if PHOENIX_LIMIT > 9
1322
, typename as_actor<J>::type
1323
, typename as_actor<K>::type
1324
, typename as_actor<L>::type
1326
#if PHOENIX_LIMIT > 12
1327
, typename as_actor<M>::type
1328
, typename as_actor<N>::type
1329
, typename as_actor<O>::type
1337
typedef actor<composite_type> type;
1340
///////////////////////////////////////////////////////////////////////////
1342
// make_unary, make_binary, make_binary1, make_binary2 and
1343
// make_binary3 utilities are provided here for easy creation of
1344
// unary and binary composites.
1346
///////////////////////////////////////////////////////////////////////////
1348
////////////////////////////////// input is an actor
1349
template <typename OperationT, typename BaseT>
1352
typedef typename make_composite
1353
<OperationT, actor<BaseT> >::type type;
1356
construct(actor<BaseT> const& _0)
1358
typedef typename make_composite
1359
<OperationT, actor<BaseT> >::composite_type
1362
return ret_t(OperationT(), _0);
1366
////////////////////////////////// LHS is an actor, RHS is unknown
1367
template <typename OperationT, typename BaseT, typename B>
1368
struct make_binary1 {
1370
typedef typename make_composite
1371
<OperationT, actor<BaseT>, B>::type type;
1374
construct(actor<BaseT> const& _0, B const& _1)
1376
typedef typename make_composite
1377
<OperationT, actor<BaseT>, B>::composite_type
1380
return ret_t(OperationT(), _0, as_actor<B>::convert(_1));
1384
////////////////////////////////// LHS is unknown, RHS is an actor
1385
template <typename OperationT, typename A, typename BaseT>
1386
struct make_binary2 {
1388
typedef typename make_composite
1389
<OperationT, A, actor<BaseT> >::type type;
1392
construct(A const& _0, actor<BaseT> const& _1)
1394
typedef typename make_composite
1395
<OperationT, A, actor<BaseT> >::composite_type
1398
return ret_t(OperationT(), as_actor<A>::convert(_0), _1);
1402
////////////////////////////////// Both LHS and RHS are actors
1403
template <typename OperationT, typename BaseA, typename BaseB>
1404
struct make_binary3 {
1406
typedef typename make_composite
1407
<OperationT, actor<BaseA>, actor<BaseB> >::type type;
1410
construct(actor<BaseA> const& _0, actor<BaseB> const& _1)
1412
typedef typename make_composite
1413
<OperationT, actor<BaseA>, actor<BaseB> >::composite_type
1416
return ret_t(OperationT(), _0, _1);
1422
} // namespace phoenix