os/ossrv/ossrv_pub/boost_apis/boost/spirit/phoenix/composite.hpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
/*=============================================================================
sl@0
     2
    Phoenix V1.2.1
sl@0
     3
    Copyright (c) 2001-2002 Joel de Guzman
sl@0
     4
sl@0
     5
    Use, modification and distribution is subject to the Boost Software
sl@0
     6
    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
sl@0
     7
    http://www.boost.org/LICENSE_1_0.txt)
sl@0
     8
==============================================================================*/
sl@0
     9
#ifndef PHOENIX_COMPOSITE_HPP
sl@0
    10
#define PHOENIX_COMPOSITE_HPP
sl@0
    11
sl@0
    12
///////////////////////////////////////////////////////////////////////////////
sl@0
    13
#include <boost/spirit/phoenix/actor.hpp>
sl@0
    14
sl@0
    15
///////////////////////////////////////////////////////////////////////////////
sl@0
    16
namespace phoenix {
sl@0
    17
sl@0
    18
///////////////////////////////////////////////////////////////////////////////
sl@0
    19
//
sl@0
    20
//  composite class
sl@0
    21
//
sl@0
    22
//      A composite is an actor base class composed of zero or more
sl@0
    23
//      actors (see actor.hpp) and an operation. A composite is itself
sl@0
    24
//      an actor superclass and conforms to its conceptual interface.
sl@0
    25
//      Its eval member function un-funnels the tupled actual arguments
sl@0
    26
//      from the tuple by invoking each of the actors' eval member
sl@0
    27
//      function. The results of each are then passed on as arguments to
sl@0
    28
//      the operation. Specializations are provided to handle different
sl@0
    29
//      numbers of actors.
sl@0
    30
//
sl@0
    31
//      Schematically:
sl@0
    32
//
sl@0
    33
//          actor0.eval(tupled_args) --> arg0 --> |
sl@0
    34
//          actor1.eval(tupled_args) --> arg1 --> |
sl@0
    35
//          actor2.eval(tupled_args) --> arg3 --> | --> operation(arg0...argN)
sl@0
    36
//            ...                                 |
sl@0
    37
//          actorN.eval(tupled_args) --> argN --> |
sl@0
    38
//
sl@0
    39
//      The operation can be any suitable functor that can accept the
sl@0
    40
//      arguments passed in by the composite. The operation is expected
sl@0
    41
//      to have a member operator() that carries out the actual
sl@0
    42
//      operation. There should be a one to one correspondence between
sl@0
    43
//      actors of the composite and the arguments of the operation's
sl@0
    44
//      member operator().
sl@0
    45
//
sl@0
    46
//      The operation is also expected to have a nested template class
sl@0
    47
//      result<T0...TN>. The nested template class result should have a
sl@0
    48
//      typedef 'type' that reflects the return type of its member
sl@0
    49
//      operator(). This is essentially a type computer that answers the
sl@0
    50
//      metaprogramming question "Given arguments of type T0...TN, what
sl@0
    51
//      will be its operator()'s return type?".
sl@0
    52
//
sl@0
    53
//      There is a special case for operations that accept no arguments.
sl@0
    54
//      Such nullary operations are only required to define a typedef
sl@0
    55
//      result_type that reflects the return type of its operator().
sl@0
    56
//
sl@0
    57
//      Here's an example of a simple operation that squares a number:
sl@0
    58
//
sl@0
    59
//          struct square {
sl@0
    60
//
sl@0
    61
//              template <typename ArgT>
sl@0
    62
//              struct result { typedef ArgT type; };
sl@0
    63
//
sl@0
    64
//              template <typename ArgT>
sl@0
    65
//              ArgT operator()(ArgT n) const { return n * n; }
sl@0
    66
//          };
sl@0
    67
//
sl@0
    68
//      As can be seen, operations can be polymorphic. Its arguments and
sl@0
    69
//      return type are not fixed to a particular type. The example
sl@0
    70
//      above for example, can handle any ArgT type as long as it has a
sl@0
    71
//      multiplication operator.
sl@0
    72
//
sl@0
    73
//      Composites are not created directly. Instead, there are meta-
sl@0
    74
//      programs provided that indirectly create composites. See
sl@0
    75
//      operators.hpp, binders.hpp and functions.hpp for examples.
sl@0
    76
//
sl@0
    77
///////////////////////////////////////////////////////////////////////////////
sl@0
    78
template <
sl@0
    79
    typename OperationT
sl@0
    80
    ,   typename A = nil_t
sl@0
    81
    ,   typename B = nil_t
sl@0
    82
    ,   typename C = nil_t
sl@0
    83
sl@0
    84
#if PHOENIX_LIMIT > 3
sl@0
    85
    ,   typename D = nil_t
sl@0
    86
    ,   typename E = nil_t
sl@0
    87
    ,   typename F = nil_t
sl@0
    88
sl@0
    89
#if PHOENIX_LIMIT > 6
sl@0
    90
    ,   typename G = nil_t
sl@0
    91
    ,   typename H = nil_t
sl@0
    92
    ,   typename I = nil_t
sl@0
    93
sl@0
    94
#if PHOENIX_LIMIT > 9
sl@0
    95
    ,   typename J = nil_t
sl@0
    96
    ,   typename K = nil_t
sl@0
    97
    ,   typename L = nil_t
sl@0
    98
sl@0
    99
#if PHOENIX_LIMIT > 12
sl@0
   100
    ,   typename M = nil_t
sl@0
   101
    ,   typename N = nil_t
sl@0
   102
    ,   typename O = nil_t
sl@0
   103
sl@0
   104
#endif
sl@0
   105
#endif
sl@0
   106
#endif
sl@0
   107
#endif
sl@0
   108
sl@0
   109
    ,   typename NU = nil_t  // Not used
sl@0
   110
>
sl@0
   111
struct composite;
sl@0
   112
sl@0
   113
///////////////////////////////////////////////////////////////////////////////
sl@0
   114
//
sl@0
   115
//  composite <0 actor> class
sl@0
   116
//
sl@0
   117
///////////////////////////////////////////////////////////////////////////////
sl@0
   118
template <typename OperationT, typename TupleT>
sl@0
   119
struct composite0_result {
sl@0
   120
sl@0
   121
    typedef typename OperationT::result_type type;
sl@0
   122
};
sl@0
   123
sl@0
   124
//////////////////////////////////
sl@0
   125
template <typename OperationT>
sl@0
   126
struct composite<OperationT,
sl@0
   127
    nil_t, nil_t, nil_t,
sl@0
   128
#if PHOENIX_LIMIT > 3
sl@0
   129
    nil_t, nil_t, nil_t,
sl@0
   130
#if PHOENIX_LIMIT > 6
sl@0
   131
    nil_t, nil_t, nil_t,
sl@0
   132
#if PHOENIX_LIMIT > 9
sl@0
   133
    nil_t, nil_t, nil_t,
sl@0
   134
#if PHOENIX_LIMIT > 12
sl@0
   135
    nil_t, nil_t, nil_t,
sl@0
   136
#endif
sl@0
   137
#endif
sl@0
   138
#endif
sl@0
   139
#endif
sl@0
   140
    nil_t   //  Unused
sl@0
   141
> {
sl@0
   142
sl@0
   143
    typedef composite<OperationT> self_t;
sl@0
   144
sl@0
   145
    template <typename TupleT>
sl@0
   146
    struct result {
sl@0
   147
sl@0
   148
        typedef typename composite0_result<
sl@0
   149
            OperationT, TupleT
sl@0
   150
        >::type type;
sl@0
   151
    };
sl@0
   152
sl@0
   153
    composite(OperationT const& op_)
sl@0
   154
    :   op(op_) {}
sl@0
   155
sl@0
   156
    template <typename TupleT>
sl@0
   157
    typename OperationT::result_type
sl@0
   158
    eval(TupleT const& /*args*/) const
sl@0
   159
    {
sl@0
   160
        return op();
sl@0
   161
    }
sl@0
   162
sl@0
   163
    mutable OperationT op; //  operation
sl@0
   164
};
sl@0
   165
sl@0
   166
///////////////////////////////////////////////////////////////////////////////
sl@0
   167
//
sl@0
   168
//  composite <1 actor> class
sl@0
   169
//
sl@0
   170
///////////////////////////////////////////////////////////////////////////////
sl@0
   171
template <typename OperationT, typename TupleT,
sl@0
   172
    typename A>
sl@0
   173
struct composite1_result {
sl@0
   174
sl@0
   175
    typedef typename OperationT::template result<
sl@0
   176
        typename actor_result<A, TupleT>::plain_type
sl@0
   177
    >::type type;
sl@0
   178
};
sl@0
   179
sl@0
   180
//////////////////////////////////
sl@0
   181
template <typename OperationT,
sl@0
   182
    typename A>
sl@0
   183
struct composite<OperationT,
sl@0
   184
    A, nil_t, nil_t,
sl@0
   185
#if PHOENIX_LIMIT > 3
sl@0
   186
    nil_t, nil_t, nil_t,
sl@0
   187
#if PHOENIX_LIMIT > 6
sl@0
   188
    nil_t, nil_t, nil_t,
sl@0
   189
#if PHOENIX_LIMIT > 9
sl@0
   190
    nil_t, nil_t, nil_t,
sl@0
   191
#if PHOENIX_LIMIT > 12
sl@0
   192
    nil_t, nil_t, nil_t,
sl@0
   193
#endif
sl@0
   194
#endif
sl@0
   195
#endif
sl@0
   196
#endif
sl@0
   197
    nil_t   //  Unused
sl@0
   198
> {
sl@0
   199
sl@0
   200
    typedef composite<OperationT, A> self_t;
sl@0
   201
sl@0
   202
    template <typename TupleT>
sl@0
   203
    struct result {
sl@0
   204
sl@0
   205
        typedef typename composite1_result<
sl@0
   206
            OperationT, TupleT, A
sl@0
   207
        >::type type;
sl@0
   208
    };
sl@0
   209
sl@0
   210
    composite(OperationT const& op_,
sl@0
   211
        A const& a_)
sl@0
   212
    :   op(op_), a(a_) {}
sl@0
   213
sl@0
   214
    template <typename TupleT>
sl@0
   215
    typename actor_result<self_t, TupleT>::type
sl@0
   216
    eval(TupleT const& args) const
sl@0
   217
    {
sl@0
   218
        typename actor_result<A, TupleT>::type ra = a.eval(args);
sl@0
   219
        return op(ra);
sl@0
   220
    }
sl@0
   221
sl@0
   222
    mutable OperationT op; //  operation
sl@0
   223
    A a; //  actors
sl@0
   224
};
sl@0
   225
sl@0
   226
///////////////////////////////////////////////////////////////////////////////
sl@0
   227
//
sl@0
   228
//  composite <2 actors> class
sl@0
   229
//
sl@0
   230
///////////////////////////////////////////////////////////////////////////////
sl@0
   231
template <typename OperationT, typename TupleT,
sl@0
   232
    typename A, typename B>
sl@0
   233
struct composite2_result {
sl@0
   234
sl@0
   235
    typedef typename OperationT::template result<
sl@0
   236
        typename actor_result<A, TupleT>::plain_type,
sl@0
   237
        typename actor_result<B, TupleT>::plain_type
sl@0
   238
    >::type type;
sl@0
   239
};
sl@0
   240
sl@0
   241
//////////////////////////////////
sl@0
   242
template <typename OperationT,
sl@0
   243
    typename A, typename B>
sl@0
   244
struct composite<OperationT,
sl@0
   245
    A, B, nil_t,
sl@0
   246
#if PHOENIX_LIMIT > 3
sl@0
   247
    nil_t, nil_t, nil_t,
sl@0
   248
#if PHOENIX_LIMIT > 6
sl@0
   249
    nil_t, nil_t, nil_t,
sl@0
   250
#if PHOENIX_LIMIT > 9
sl@0
   251
    nil_t, nil_t, nil_t,
sl@0
   252
#if PHOENIX_LIMIT > 12
sl@0
   253
    nil_t, nil_t, nil_t,
sl@0
   254
#endif
sl@0
   255
#endif
sl@0
   256
#endif
sl@0
   257
#endif
sl@0
   258
    nil_t   //  Unused
sl@0
   259
> {
sl@0
   260
sl@0
   261
    typedef composite<OperationT, A, B> self_t;
sl@0
   262
sl@0
   263
    template <typename TupleT>
sl@0
   264
    struct result {
sl@0
   265
sl@0
   266
        typedef typename composite2_result<
sl@0
   267
            OperationT, TupleT, A, B
sl@0
   268
        >::type type;
sl@0
   269
    };
sl@0
   270
sl@0
   271
    composite(OperationT const& op_,
sl@0
   272
        A const& a_, B const& b_)
sl@0
   273
    :   op(op_), a(a_), b(b_) {}
sl@0
   274
sl@0
   275
    template <typename TupleT>
sl@0
   276
    typename actor_result<self_t, TupleT>::type
sl@0
   277
    eval(TupleT const& args) const
sl@0
   278
    {
sl@0
   279
        typename actor_result<A, TupleT>::type ra = a.eval(args);
sl@0
   280
        typename actor_result<B, TupleT>::type rb = b.eval(args);
sl@0
   281
        return op(ra, rb);
sl@0
   282
    }
sl@0
   283
sl@0
   284
    mutable OperationT op; //  operation
sl@0
   285
    A a; B b; //  actors
sl@0
   286
};
sl@0
   287
sl@0
   288
///////////////////////////////////////////////////////////////////////////////
sl@0
   289
//
sl@0
   290
//  composite <3 actors> class
sl@0
   291
//
sl@0
   292
///////////////////////////////////////////////////////////////////////////////
sl@0
   293
template <typename OperationT, typename TupleT,
sl@0
   294
    typename A, typename B, typename C>
sl@0
   295
struct composite3_result {
sl@0
   296
sl@0
   297
    typedef typename OperationT::template result<
sl@0
   298
        typename actor_result<A, TupleT>::plain_type,
sl@0
   299
        typename actor_result<B, TupleT>::plain_type,
sl@0
   300
        typename actor_result<C, TupleT>::plain_type
sl@0
   301
    >::type type;
sl@0
   302
};
sl@0
   303
sl@0
   304
//////////////////////////////////
sl@0
   305
template <typename OperationT,
sl@0
   306
    typename A, typename B, typename C>
sl@0
   307
struct composite<OperationT,
sl@0
   308
    A, B, C,
sl@0
   309
#if PHOENIX_LIMIT > 3
sl@0
   310
    nil_t, nil_t, nil_t,
sl@0
   311
#if PHOENIX_LIMIT > 6
sl@0
   312
    nil_t, nil_t, nil_t,
sl@0
   313
#if PHOENIX_LIMIT > 9
sl@0
   314
    nil_t, nil_t, nil_t,
sl@0
   315
#if PHOENIX_LIMIT > 12
sl@0
   316
    nil_t, nil_t, nil_t,
sl@0
   317
#endif
sl@0
   318
#endif
sl@0
   319
#endif
sl@0
   320
#endif
sl@0
   321
    nil_t   //  Unused
sl@0
   322
> {
sl@0
   323
sl@0
   324
    typedef composite<OperationT, A, B, C> self_t;
sl@0
   325
sl@0
   326
    template <typename TupleT>
sl@0
   327
    struct result {
sl@0
   328
sl@0
   329
        typedef typename composite3_result<
sl@0
   330
            OperationT, TupleT, A, B, C
sl@0
   331
        >::type type;
sl@0
   332
    };
sl@0
   333
sl@0
   334
    composite(OperationT const& op_,
sl@0
   335
        A const& a_, B const& b_, C const& c_)
sl@0
   336
    :   op(op_), a(a_), b(b_), c(c_) {}
sl@0
   337
sl@0
   338
    template <typename TupleT>
sl@0
   339
    typename actor_result<self_t, TupleT>::type
sl@0
   340
    eval(TupleT const& args) const
sl@0
   341
    {
sl@0
   342
        typename actor_result<A, TupleT>::type ra = a.eval(args);
sl@0
   343
        typename actor_result<B, TupleT>::type rb = b.eval(args);
sl@0
   344
        typename actor_result<C, TupleT>::type rc = c.eval(args);
sl@0
   345
        return op(ra, rb, rc);
sl@0
   346
    }
sl@0
   347
sl@0
   348
    mutable OperationT op; //  operation
sl@0
   349
    A a; B b; C c; //  actors
sl@0
   350
};
sl@0
   351
sl@0
   352
#if PHOENIX_LIMIT > 3
sl@0
   353
///////////////////////////////////////////////////////////////////////////////
sl@0
   354
//
sl@0
   355
//  composite <4 actors> class
sl@0
   356
//
sl@0
   357
///////////////////////////////////////////////////////////////////////////////
sl@0
   358
template <typename OperationT, typename TupleT,
sl@0
   359
    typename A, typename B, typename C, typename D>
sl@0
   360
struct composite4_result {
sl@0
   361
sl@0
   362
    typedef typename OperationT::template result<
sl@0
   363
        typename actor_result<A, TupleT>::plain_type,
sl@0
   364
        typename actor_result<B, TupleT>::plain_type,
sl@0
   365
        typename actor_result<C, TupleT>::plain_type,
sl@0
   366
        typename actor_result<D, TupleT>::plain_type
sl@0
   367
    >::type type;
sl@0
   368
};
sl@0
   369
sl@0
   370
//////////////////////////////////
sl@0
   371
template <typename OperationT,
sl@0
   372
    typename A, typename B, typename C, typename D>
sl@0
   373
struct composite<OperationT,
sl@0
   374
    A, B, C, D, nil_t, nil_t,
sl@0
   375
#if PHOENIX_LIMIT > 6
sl@0
   376
    nil_t, nil_t, nil_t,
sl@0
   377
#if PHOENIX_LIMIT > 9
sl@0
   378
    nil_t, nil_t, nil_t,
sl@0
   379
#if PHOENIX_LIMIT > 12
sl@0
   380
    nil_t, nil_t, nil_t,
sl@0
   381
#endif
sl@0
   382
#endif
sl@0
   383
#endif
sl@0
   384
    nil_t   //  Unused
sl@0
   385
> {
sl@0
   386
sl@0
   387
    typedef composite<OperationT, A, B, C, D> self_t;
sl@0
   388
sl@0
   389
    template <typename TupleT>
sl@0
   390
    struct result {
sl@0
   391
sl@0
   392
        typedef typename composite4_result<
sl@0
   393
            OperationT, TupleT, A, B, C, D
sl@0
   394
        >::type type;
sl@0
   395
    };
sl@0
   396
sl@0
   397
    composite(OperationT const& op_,
sl@0
   398
        A const& a_, B const& b_, C const& c_, D const& d_)
sl@0
   399
    :   op(op_), a(a_), b(b_), c(c_), d(d_) {}
sl@0
   400
sl@0
   401
    template <typename TupleT>
sl@0
   402
    typename actor_result<self_t, TupleT>::type
sl@0
   403
    eval(TupleT const& args) const
sl@0
   404
    {
sl@0
   405
        typename actor_result<A, TupleT>::type ra = a.eval(args);
sl@0
   406
        typename actor_result<B, TupleT>::type rb = b.eval(args);
sl@0
   407
        typename actor_result<C, TupleT>::type rc = c.eval(args);
sl@0
   408
        typename actor_result<D, TupleT>::type rd = d.eval(args);
sl@0
   409
        return op(ra, rb, rc, rd);
sl@0
   410
    }
sl@0
   411
sl@0
   412
    mutable OperationT op; //  operation
sl@0
   413
    A a; B b; C c; D d; //  actors
sl@0
   414
};
sl@0
   415
sl@0
   416
///////////////////////////////////////////////////////////////////////////////
sl@0
   417
//
sl@0
   418
//  composite <5 actors> class
sl@0
   419
//
sl@0
   420
///////////////////////////////////////////////////////////////////////////////
sl@0
   421
template <typename OperationT, typename TupleT,
sl@0
   422
    typename A, typename B, typename C, typename D, typename E>
sl@0
   423
struct composite5_result {
sl@0
   424
sl@0
   425
    typedef typename OperationT::template result<
sl@0
   426
        typename actor_result<A, TupleT>::plain_type,
sl@0
   427
        typename actor_result<B, TupleT>::plain_type,
sl@0
   428
        typename actor_result<C, TupleT>::plain_type,
sl@0
   429
        typename actor_result<D, TupleT>::plain_type,
sl@0
   430
        typename actor_result<E, TupleT>::plain_type
sl@0
   431
    >::type type;
sl@0
   432
};
sl@0
   433
sl@0
   434
//////////////////////////////////
sl@0
   435
template <typename OperationT,
sl@0
   436
    typename A, typename B, typename C, typename D, typename E>
sl@0
   437
struct composite<OperationT,
sl@0
   438
    A, B, C, D, E, nil_t,
sl@0
   439
#if PHOENIX_LIMIT > 6
sl@0
   440
    nil_t, nil_t, nil_t,
sl@0
   441
#if PHOENIX_LIMIT > 9
sl@0
   442
    nil_t, nil_t, nil_t,
sl@0
   443
#if PHOENIX_LIMIT > 12
sl@0
   444
    nil_t, nil_t, nil_t,
sl@0
   445
#endif
sl@0
   446
#endif
sl@0
   447
#endif
sl@0
   448
    nil_t   //  Unused
sl@0
   449
> {
sl@0
   450
sl@0
   451
    typedef composite<OperationT, A, B, C, D, E> self_t;
sl@0
   452
sl@0
   453
    template <typename TupleT>
sl@0
   454
    struct result {
sl@0
   455
sl@0
   456
        typedef typename composite5_result<
sl@0
   457
            OperationT, TupleT, A, B, C, D, E
sl@0
   458
        >::type type;
sl@0
   459
    };
sl@0
   460
sl@0
   461
    composite(OperationT const& op_,
sl@0
   462
        A const& a_, B const& b_, C const& c_, D const& d_, E const& e_)
sl@0
   463
    :   op(op_), a(a_), b(b_), c(c_), d(d_), e(e_) {}
sl@0
   464
sl@0
   465
    template <typename TupleT>
sl@0
   466
    typename actor_result<self_t, TupleT>::type
sl@0
   467
    eval(TupleT const& args) const
sl@0
   468
    {
sl@0
   469
        typename actor_result<A, TupleT>::type ra = a.eval(args);
sl@0
   470
        typename actor_result<B, TupleT>::type rb = b.eval(args);
sl@0
   471
        typename actor_result<C, TupleT>::type rc = c.eval(args);
sl@0
   472
        typename actor_result<D, TupleT>::type rd = d.eval(args);
sl@0
   473
        typename actor_result<E, TupleT>::type re = e.eval(args);
sl@0
   474
        return op(ra, rb, rc, rd, re);
sl@0
   475
    }
sl@0
   476
sl@0
   477
    mutable OperationT op; //  operation
sl@0
   478
    A a; B b; C c; D d; E e; //  actors
sl@0
   479
};
sl@0
   480
sl@0
   481
///////////////////////////////////////////////////////////////////////////////
sl@0
   482
//
sl@0
   483
//  composite <6 actors> class
sl@0
   484
//
sl@0
   485
///////////////////////////////////////////////////////////////////////////////
sl@0
   486
template <typename OperationT, typename TupleT,
sl@0
   487
    typename A, typename B, typename C, typename D, typename E,
sl@0
   488
    typename F>
sl@0
   489
struct composite6_result {
sl@0
   490
sl@0
   491
    typedef typename OperationT::template result<
sl@0
   492
        typename actor_result<A, TupleT>::plain_type,
sl@0
   493
        typename actor_result<B, TupleT>::plain_type,
sl@0
   494
        typename actor_result<C, TupleT>::plain_type,
sl@0
   495
        typename actor_result<D, TupleT>::plain_type,
sl@0
   496
        typename actor_result<E, TupleT>::plain_type,
sl@0
   497
        typename actor_result<F, TupleT>::plain_type
sl@0
   498
    >::type type;
sl@0
   499
};
sl@0
   500
sl@0
   501
//////////////////////////////////
sl@0
   502
template <typename OperationT,
sl@0
   503
    typename A, typename B, typename C, typename D, typename E,
sl@0
   504
    typename F>
sl@0
   505
struct composite<OperationT,
sl@0
   506
    A, B, C, D, E, F,
sl@0
   507
#if PHOENIX_LIMIT > 6
sl@0
   508
    nil_t, nil_t, nil_t,
sl@0
   509
#if PHOENIX_LIMIT > 9
sl@0
   510
    nil_t, nil_t, nil_t,
sl@0
   511
#if PHOENIX_LIMIT > 12
sl@0
   512
    nil_t, nil_t, nil_t,
sl@0
   513
#endif
sl@0
   514
#endif
sl@0
   515
#endif
sl@0
   516
    nil_t   //  Unused
sl@0
   517
> {
sl@0
   518
sl@0
   519
    typedef composite<OperationT, A, B, C, D, E, F> self_t;
sl@0
   520
sl@0
   521
    template <typename TupleT>
sl@0
   522
    struct result {
sl@0
   523
sl@0
   524
        typedef typename composite6_result<
sl@0
   525
            OperationT, TupleT, A, B, C, D, E, F
sl@0
   526
        >::type type;
sl@0
   527
    };
sl@0
   528
sl@0
   529
    composite(OperationT const& op_,
sl@0
   530
        A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
sl@0
   531
        F const& f_)
sl@0
   532
    :   op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
sl@0
   533
        f(f_) {}
sl@0
   534
sl@0
   535
    template <typename TupleT>
sl@0
   536
    typename actor_result<self_t, TupleT>::type
sl@0
   537
    eval(TupleT const& args) const
sl@0
   538
    {
sl@0
   539
        typename actor_result<A, TupleT>::type ra = a.eval(args);
sl@0
   540
        typename actor_result<B, TupleT>::type rb = b.eval(args);
sl@0
   541
        typename actor_result<C, TupleT>::type rc = c.eval(args);
sl@0
   542
        typename actor_result<D, TupleT>::type rd = d.eval(args);
sl@0
   543
        typename actor_result<E, TupleT>::type re = e.eval(args);
sl@0
   544
        typename actor_result<F, TupleT>::type rf = f.eval(args);
sl@0
   545
        return op(ra, rb, rc, rd, re, rf);
sl@0
   546
    }
sl@0
   547
sl@0
   548
    mutable OperationT op; //  operation
sl@0
   549
    A a; B b; C c; D d; E e; F f; //  actors
sl@0
   550
};
sl@0
   551
sl@0
   552
#if PHOENIX_LIMIT > 6
sl@0
   553
///////////////////////////////////////////////////////////////////////////////
sl@0
   554
//
sl@0
   555
//  composite <7 actors> class
sl@0
   556
//
sl@0
   557
///////////////////////////////////////////////////////////////////////////////
sl@0
   558
template <typename OperationT, typename TupleT,
sl@0
   559
    typename A, typename B, typename C, typename D, typename E,
sl@0
   560
    typename F, typename G>
sl@0
   561
struct composite7_result {
sl@0
   562
sl@0
   563
    typedef typename OperationT::template result<
sl@0
   564
        typename actor_result<A, TupleT>::plain_type,
sl@0
   565
        typename actor_result<B, TupleT>::plain_type,
sl@0
   566
        typename actor_result<C, TupleT>::plain_type,
sl@0
   567
        typename actor_result<D, TupleT>::plain_type,
sl@0
   568
        typename actor_result<E, TupleT>::plain_type,
sl@0
   569
        typename actor_result<F, TupleT>::plain_type,
sl@0
   570
        typename actor_result<G, TupleT>::plain_type
sl@0
   571
    >::type type;
sl@0
   572
};
sl@0
   573
sl@0
   574
//////////////////////////////////
sl@0
   575
template <typename OperationT,
sl@0
   576
    typename A, typename B, typename C, typename D, typename E,
sl@0
   577
    typename F, typename G>
sl@0
   578
struct composite<OperationT,
sl@0
   579
    A, B, C, D, E, F, G, nil_t, nil_t,
sl@0
   580
#if PHOENIX_LIMIT > 9
sl@0
   581
    nil_t, nil_t, nil_t,
sl@0
   582
#if PHOENIX_LIMIT > 12
sl@0
   583
    nil_t, nil_t, nil_t,
sl@0
   584
#endif
sl@0
   585
#endif
sl@0
   586
    nil_t   //  Unused
sl@0
   587
> {
sl@0
   588
sl@0
   589
    typedef composite<OperationT, A, B, C, D, E, F, G> self_t;
sl@0
   590
sl@0
   591
    template <typename TupleT>
sl@0
   592
    struct result {
sl@0
   593
sl@0
   594
        typedef typename composite7_result<
sl@0
   595
            OperationT, TupleT, A, B, C, D, E, F, G
sl@0
   596
        >::type type;
sl@0
   597
    };
sl@0
   598
sl@0
   599
    composite(OperationT const& op_,
sl@0
   600
        A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
sl@0
   601
        F const& f_, G const& g_)
sl@0
   602
    :   op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
sl@0
   603
        f(f_), g(g_) {}
sl@0
   604
sl@0
   605
    template <typename TupleT>
sl@0
   606
    typename actor_result<self_t, TupleT>::type
sl@0
   607
    eval(TupleT const& args) const
sl@0
   608
    {
sl@0
   609
        typename actor_result<A, TupleT>::type ra = a.eval(args);
sl@0
   610
        typename actor_result<B, TupleT>::type rb = b.eval(args);
sl@0
   611
        typename actor_result<C, TupleT>::type rc = c.eval(args);
sl@0
   612
        typename actor_result<D, TupleT>::type rd = d.eval(args);
sl@0
   613
        typename actor_result<E, TupleT>::type re = e.eval(args);
sl@0
   614
        typename actor_result<F, TupleT>::type rf = f.eval(args);
sl@0
   615
        typename actor_result<G, TupleT>::type rg = g.eval(args);
sl@0
   616
        return op(ra, rb, rc, rd, re, rf, rg);
sl@0
   617
    }
sl@0
   618
sl@0
   619
    mutable OperationT op; //  operation
sl@0
   620
    A a; B b; C c; D d; E e; F f; G g; //  actors
sl@0
   621
};
sl@0
   622
sl@0
   623
///////////////////////////////////////////////////////////////////////////////
sl@0
   624
//
sl@0
   625
//  composite <8 actors> class
sl@0
   626
//
sl@0
   627
///////////////////////////////////////////////////////////////////////////////
sl@0
   628
template <typename OperationT, typename TupleT,
sl@0
   629
    typename A, typename B, typename C, typename D, typename E,
sl@0
   630
    typename F, typename G, typename H>
sl@0
   631
struct composite8_result {
sl@0
   632
sl@0
   633
    typedef typename OperationT::template result<
sl@0
   634
        typename actor_result<A, TupleT>::plain_type,
sl@0
   635
        typename actor_result<B, TupleT>::plain_type,
sl@0
   636
        typename actor_result<C, TupleT>::plain_type,
sl@0
   637
        typename actor_result<D, TupleT>::plain_type,
sl@0
   638
        typename actor_result<E, TupleT>::plain_type,
sl@0
   639
        typename actor_result<F, TupleT>::plain_type,
sl@0
   640
        typename actor_result<G, TupleT>::plain_type,
sl@0
   641
        typename actor_result<H, TupleT>::plain_type
sl@0
   642
    >::type type;
sl@0
   643
};
sl@0
   644
sl@0
   645
//////////////////////////////////
sl@0
   646
template <typename OperationT,
sl@0
   647
    typename A, typename B, typename C, typename D, typename E,
sl@0
   648
    typename F, typename G, typename H>
sl@0
   649
struct composite<OperationT,
sl@0
   650
    A, B, C, D, E, F, G, H, nil_t,
sl@0
   651
#if PHOENIX_LIMIT > 9
sl@0
   652
    nil_t, nil_t, nil_t,
sl@0
   653
#if PHOENIX_LIMIT > 12
sl@0
   654
    nil_t, nil_t, nil_t,
sl@0
   655
#endif
sl@0
   656
#endif
sl@0
   657
    nil_t   //  Unused
sl@0
   658
> {
sl@0
   659
sl@0
   660
    typedef composite<OperationT, A, B, C, D, E, F, G, H> self_t;
sl@0
   661
sl@0
   662
    template <typename TupleT>
sl@0
   663
    struct result {
sl@0
   664
sl@0
   665
        typedef typename composite8_result<
sl@0
   666
            OperationT, TupleT, A, B, C, D, E, F, G, H
sl@0
   667
        >::type type;
sl@0
   668
    };
sl@0
   669
sl@0
   670
    composite(OperationT const& op_,
sl@0
   671
        A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
sl@0
   672
        F const& f_, G const& g_, H const& h_)
sl@0
   673
    :   op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
sl@0
   674
        f(f_), g(g_), h(h_) {}
sl@0
   675
sl@0
   676
    template <typename TupleT>
sl@0
   677
    typename actor_result<self_t, TupleT>::type
sl@0
   678
    eval(TupleT const& args) const
sl@0
   679
    {
sl@0
   680
        typename actor_result<A, TupleT>::type ra = a.eval(args);
sl@0
   681
        typename actor_result<B, TupleT>::type rb = b.eval(args);
sl@0
   682
        typename actor_result<C, TupleT>::type rc = c.eval(args);
sl@0
   683
        typename actor_result<D, TupleT>::type rd = d.eval(args);
sl@0
   684
        typename actor_result<E, TupleT>::type re = e.eval(args);
sl@0
   685
        typename actor_result<F, TupleT>::type rf = f.eval(args);
sl@0
   686
        typename actor_result<G, TupleT>::type rg = g.eval(args);
sl@0
   687
        typename actor_result<H, TupleT>::type rh = h.eval(args);
sl@0
   688
        return op(ra, rb, rc, rd, re, rf, rg, rh);
sl@0
   689
    }
sl@0
   690
sl@0
   691
    mutable OperationT op; //  operation
sl@0
   692
    A a; B b; C c; D d; E e; F f; G g; H h; //  actors
sl@0
   693
};
sl@0
   694
sl@0
   695
///////////////////////////////////////////////////////////////////////////////
sl@0
   696
//
sl@0
   697
//  composite <9 actors> class
sl@0
   698
//
sl@0
   699
///////////////////////////////////////////////////////////////////////////////
sl@0
   700
template <typename OperationT, typename TupleT,
sl@0
   701
    typename A, typename B, typename C, typename D, typename E,
sl@0
   702
    typename F, typename G, typename H, typename I>
sl@0
   703
struct composite9_result {
sl@0
   704
sl@0
   705
    typedef typename OperationT::template result<
sl@0
   706
        typename actor_result<A, TupleT>::plain_type,
sl@0
   707
        typename actor_result<B, TupleT>::plain_type,
sl@0
   708
        typename actor_result<C, TupleT>::plain_type,
sl@0
   709
        typename actor_result<D, TupleT>::plain_type,
sl@0
   710
        typename actor_result<E, TupleT>::plain_type,
sl@0
   711
        typename actor_result<F, TupleT>::plain_type,
sl@0
   712
        typename actor_result<G, TupleT>::plain_type,
sl@0
   713
        typename actor_result<H, TupleT>::plain_type,
sl@0
   714
        typename actor_result<I, TupleT>::plain_type
sl@0
   715
    >::type type;
sl@0
   716
};
sl@0
   717
sl@0
   718
//////////////////////////////////
sl@0
   719
template <typename OperationT,
sl@0
   720
    typename A, typename B, typename C, typename D, typename E,
sl@0
   721
    typename F, typename G, typename H, typename I>
sl@0
   722
struct composite<OperationT,
sl@0
   723
    A, B, C, D, E, F, G, H, I,
sl@0
   724
#if PHOENIX_LIMIT > 9
sl@0
   725
    nil_t, nil_t, nil_t,
sl@0
   726
#if PHOENIX_LIMIT > 12
sl@0
   727
    nil_t, nil_t, nil_t,
sl@0
   728
#endif
sl@0
   729
#endif
sl@0
   730
    nil_t   //  Unused
sl@0
   731
> {
sl@0
   732
sl@0
   733
    typedef composite<OperationT, A, B, C, D, E, F, G, H, I> self_t;
sl@0
   734
sl@0
   735
    template <typename TupleT>
sl@0
   736
    struct result {
sl@0
   737
sl@0
   738
        typedef typename composite9_result<
sl@0
   739
            OperationT, TupleT, A, B, C, D, E, F, G, H, I
sl@0
   740
        >::type type;
sl@0
   741
    };
sl@0
   742
sl@0
   743
    composite(OperationT const& op_,
sl@0
   744
        A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
sl@0
   745
        F const& f_, G const& g_, H const& h_, I const& i_)
sl@0
   746
    :   op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
sl@0
   747
        f(f_), g(g_), h(h_), i(i_) {}
sl@0
   748
sl@0
   749
    template <typename TupleT>
sl@0
   750
    typename actor_result<self_t, TupleT>::type
sl@0
   751
    eval(TupleT const& args) const
sl@0
   752
    {
sl@0
   753
        typename actor_result<A, TupleT>::type ra = a.eval(args);
sl@0
   754
        typename actor_result<B, TupleT>::type rb = b.eval(args);
sl@0
   755
        typename actor_result<C, TupleT>::type rc = c.eval(args);
sl@0
   756
        typename actor_result<D, TupleT>::type rd = d.eval(args);
sl@0
   757
        typename actor_result<E, TupleT>::type re = e.eval(args);
sl@0
   758
        typename actor_result<F, TupleT>::type rf = f.eval(args);
sl@0
   759
        typename actor_result<G, TupleT>::type rg = g.eval(args);
sl@0
   760
        typename actor_result<H, TupleT>::type rh = h.eval(args);
sl@0
   761
        typename actor_result<I, TupleT>::type ri = i.eval(args);
sl@0
   762
        return op(ra, rb, rc, rd, re, rf, rg, rh, ri);
sl@0
   763
    }
sl@0
   764
sl@0
   765
    mutable OperationT op; //  operation
sl@0
   766
    A a; B b; C c; D d; E e; F f; G g; H h; I i; //  actors
sl@0
   767
};
sl@0
   768
sl@0
   769
#if PHOENIX_LIMIT > 9
sl@0
   770
///////////////////////////////////////////////////////////////////////////////
sl@0
   771
//
sl@0
   772
//  composite <10 actors> class
sl@0
   773
//
sl@0
   774
///////////////////////////////////////////////////////////////////////////////
sl@0
   775
template <typename OperationT, typename TupleT,
sl@0
   776
    typename A, typename B, typename C, typename D, typename E,
sl@0
   777
    typename F, typename G, typename H, typename I, typename J>
sl@0
   778
struct composite10_result {
sl@0
   779
sl@0
   780
    typedef typename OperationT::template result<
sl@0
   781
        typename actor_result<A, TupleT>::plain_type,
sl@0
   782
        typename actor_result<B, TupleT>::plain_type,
sl@0
   783
        typename actor_result<C, TupleT>::plain_type,
sl@0
   784
        typename actor_result<D, TupleT>::plain_type,
sl@0
   785
        typename actor_result<E, TupleT>::plain_type,
sl@0
   786
        typename actor_result<F, TupleT>::plain_type,
sl@0
   787
        typename actor_result<G, TupleT>::plain_type,
sl@0
   788
        typename actor_result<H, TupleT>::plain_type,
sl@0
   789
        typename actor_result<I, TupleT>::plain_type,
sl@0
   790
        typename actor_result<J, TupleT>::plain_type
sl@0
   791
    >::type type;
sl@0
   792
};
sl@0
   793
sl@0
   794
//////////////////////////////////
sl@0
   795
template <typename OperationT,
sl@0
   796
    typename A, typename B, typename C, typename D, typename E,
sl@0
   797
    typename F, typename G, typename H, typename I, typename J>
sl@0
   798
struct composite<OperationT,
sl@0
   799
    A, B, C, D, E, F, G, H, I, J, nil_t, nil_t,
sl@0
   800
#if PHOENIX_LIMIT > 12
sl@0
   801
    nil_t, nil_t, nil_t,
sl@0
   802
#endif
sl@0
   803
    nil_t   //  Unused
sl@0
   804
> {
sl@0
   805
sl@0
   806
    typedef composite<OperationT, A, B, C, D, E, F, G, H, I, J> self_t;
sl@0
   807
sl@0
   808
    template <typename TupleT>
sl@0
   809
    struct result {
sl@0
   810
sl@0
   811
        typedef typename composite10_result<
sl@0
   812
            OperationT, TupleT, A, B, C, D, E, F, G, H, I, J
sl@0
   813
        >::type type;
sl@0
   814
    };
sl@0
   815
sl@0
   816
    composite(OperationT const& op_,
sl@0
   817
        A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
sl@0
   818
        F const& f_, G const& g_, H const& h_, I const& i_, J const& j_)
sl@0
   819
    :   op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
sl@0
   820
        f(f_), g(g_), h(h_), i(i_), j(j_) {}
sl@0
   821
sl@0
   822
    template <typename TupleT>
sl@0
   823
    typename actor_result<self_t, TupleT>::type
sl@0
   824
    eval(TupleT const& args) const
sl@0
   825
    {
sl@0
   826
        typename actor_result<A, TupleT>::type ra = a.eval(args);
sl@0
   827
        typename actor_result<B, TupleT>::type rb = b.eval(args);
sl@0
   828
        typename actor_result<C, TupleT>::type rc = c.eval(args);
sl@0
   829
        typename actor_result<D, TupleT>::type rd = d.eval(args);
sl@0
   830
        typename actor_result<E, TupleT>::type re = e.eval(args);
sl@0
   831
        typename actor_result<F, TupleT>::type rf = f.eval(args);
sl@0
   832
        typename actor_result<G, TupleT>::type rg = g.eval(args);
sl@0
   833
        typename actor_result<H, TupleT>::type rh = h.eval(args);
sl@0
   834
        typename actor_result<I, TupleT>::type ri = i.eval(args);
sl@0
   835
        typename actor_result<J, TupleT>::type rj = j.eval(args);
sl@0
   836
        return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj);
sl@0
   837
    }
sl@0
   838
sl@0
   839
    mutable OperationT op; //  operation
sl@0
   840
    A a; B b; C c; D d; E e; F f; G g; H h; I i; J j; //  actors
sl@0
   841
};
sl@0
   842
sl@0
   843
///////////////////////////////////////////////////////////////////////////////
sl@0
   844
//
sl@0
   845
//  composite <11 actors> class
sl@0
   846
//
sl@0
   847
///////////////////////////////////////////////////////////////////////////////
sl@0
   848
template <typename OperationT, typename TupleT,
sl@0
   849
    typename A, typename B, typename C, typename D, typename E,
sl@0
   850
    typename F, typename G, typename H, typename I, typename J,
sl@0
   851
    typename K>
sl@0
   852
struct composite11_result {
sl@0
   853
sl@0
   854
    typedef typename OperationT::template result<
sl@0
   855
        typename actor_result<A, TupleT>::plain_type,
sl@0
   856
        typename actor_result<B, TupleT>::plain_type,
sl@0
   857
        typename actor_result<C, TupleT>::plain_type,
sl@0
   858
        typename actor_result<D, TupleT>::plain_type,
sl@0
   859
        typename actor_result<E, TupleT>::plain_type,
sl@0
   860
        typename actor_result<F, TupleT>::plain_type,
sl@0
   861
        typename actor_result<G, TupleT>::plain_type,
sl@0
   862
        typename actor_result<H, TupleT>::plain_type,
sl@0
   863
        typename actor_result<I, TupleT>::plain_type,
sl@0
   864
        typename actor_result<J, TupleT>::plain_type,
sl@0
   865
        typename actor_result<K, TupleT>::plain_type
sl@0
   866
    >::type type;
sl@0
   867
};
sl@0
   868
sl@0
   869
//////////////////////////////////
sl@0
   870
template <typename OperationT,
sl@0
   871
    typename A, typename B, typename C, typename D, typename E,
sl@0
   872
    typename F, typename G, typename H, typename I, typename J,
sl@0
   873
    typename K>
sl@0
   874
struct composite<OperationT,
sl@0
   875
    A, B, C, D, E, F, G, H, I, J, K, nil_t,
sl@0
   876
#if PHOENIX_LIMIT > 12
sl@0
   877
    nil_t, nil_t, nil_t,
sl@0
   878
#endif
sl@0
   879
    nil_t   //  Unused
sl@0
   880
> {
sl@0
   881
sl@0
   882
    typedef composite<OperationT,
sl@0
   883
        A, B, C, D, E, F, G, H, I, J, K> self_t;
sl@0
   884
sl@0
   885
    template <typename TupleT>
sl@0
   886
    struct result {
sl@0
   887
sl@0
   888
        typedef typename composite11_result<
sl@0
   889
            OperationT, TupleT, A, B, C, D, E, F, G, H, I, J, K
sl@0
   890
        >::type type;
sl@0
   891
    };
sl@0
   892
sl@0
   893
    composite(OperationT const& op_,
sl@0
   894
        A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
sl@0
   895
        F const& f_, G const& g_, H const& h_, I const& i_, J const& j_,
sl@0
   896
        K const& k_)
sl@0
   897
    :   op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
sl@0
   898
        f(f_), g(g_), h(h_), i(i_), j(j_),
sl@0
   899
        k(k_) {}
sl@0
   900
sl@0
   901
    template <typename TupleT>
sl@0
   902
    typename actor_result<self_t, TupleT>::type
sl@0
   903
    eval(TupleT const& args) const
sl@0
   904
    {
sl@0
   905
        typename actor_result<A, TupleT>::type ra = a.eval(args);
sl@0
   906
        typename actor_result<B, TupleT>::type rb = b.eval(args);
sl@0
   907
        typename actor_result<C, TupleT>::type rc = c.eval(args);
sl@0
   908
        typename actor_result<D, TupleT>::type rd = d.eval(args);
sl@0
   909
        typename actor_result<E, TupleT>::type re = e.eval(args);
sl@0
   910
        typename actor_result<F, TupleT>::type rf = f.eval(args);
sl@0
   911
        typename actor_result<G, TupleT>::type rg = g.eval(args);
sl@0
   912
        typename actor_result<H, TupleT>::type rh = h.eval(args);
sl@0
   913
        typename actor_result<I, TupleT>::type ri = i.eval(args);
sl@0
   914
        typename actor_result<J, TupleT>::type rj = j.eval(args);
sl@0
   915
        typename actor_result<K, TupleT>::type rk = k.eval(args);
sl@0
   916
        return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj, rk);
sl@0
   917
    }
sl@0
   918
sl@0
   919
    mutable OperationT op; //  operation
sl@0
   920
    A a; B b; C c; D d; E e; F f; G g; H h; I i; J j;
sl@0
   921
    K k;//  actors
sl@0
   922
};
sl@0
   923
sl@0
   924
///////////////////////////////////////////////////////////////////////////////
sl@0
   925
//
sl@0
   926
//  composite <12 actors> class
sl@0
   927
//
sl@0
   928
///////////////////////////////////////////////////////////////////////////////
sl@0
   929
template <typename OperationT, typename TupleT,
sl@0
   930
    typename A, typename B, typename C, typename D, typename E,
sl@0
   931
    typename F, typename G, typename H, typename I, typename J,
sl@0
   932
    typename K, typename L>
sl@0
   933
struct composite12_result {
sl@0
   934
sl@0
   935
    typedef typename OperationT::template result<
sl@0
   936
        typename actor_result<A, TupleT>::plain_type,
sl@0
   937
        typename actor_result<B, TupleT>::plain_type,
sl@0
   938
        typename actor_result<C, TupleT>::plain_type,
sl@0
   939
        typename actor_result<D, TupleT>::plain_type,
sl@0
   940
        typename actor_result<E, TupleT>::plain_type,
sl@0
   941
        typename actor_result<F, TupleT>::plain_type,
sl@0
   942
        typename actor_result<G, TupleT>::plain_type,
sl@0
   943
        typename actor_result<H, TupleT>::plain_type,
sl@0
   944
        typename actor_result<I, TupleT>::plain_type,
sl@0
   945
        typename actor_result<J, TupleT>::plain_type,
sl@0
   946
        typename actor_result<K, TupleT>::plain_type,
sl@0
   947
        typename actor_result<L, TupleT>::plain_type
sl@0
   948
    >::type type;
sl@0
   949
};
sl@0
   950
sl@0
   951
//////////////////////////////////
sl@0
   952
template <typename OperationT,
sl@0
   953
    typename A, typename B, typename C, typename D, typename E,
sl@0
   954
    typename F, typename G, typename H, typename I, typename J,
sl@0
   955
    typename K, typename L>
sl@0
   956
struct composite<OperationT,
sl@0
   957
    A, B, C, D, E, F, G, H, I, J, K, L,
sl@0
   958
#if PHOENIX_LIMIT > 12
sl@0
   959
    nil_t, nil_t, nil_t,
sl@0
   960
#endif
sl@0
   961
    nil_t   //  Unused
sl@0
   962
> {
sl@0
   963
sl@0
   964
    typedef composite<OperationT,
sl@0
   965
        A, B, C, D, E, F, G, H, I, J, K, L> self_t;
sl@0
   966
sl@0
   967
    template <typename TupleT>
sl@0
   968
    struct result {
sl@0
   969
sl@0
   970
        typedef typename composite12_result<
sl@0
   971
            OperationT, TupleT, A, B, C, D, E, F, G, H, I, J, K, L
sl@0
   972
        >::type type;
sl@0
   973
    };
sl@0
   974
sl@0
   975
    composite(OperationT const& op_,
sl@0
   976
        A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
sl@0
   977
        F const& f_, G const& g_, H const& h_, I const& i_, J const& j_,
sl@0
   978
        K const& k_, L const& l_)
sl@0
   979
    :   op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
sl@0
   980
        f(f_), g(g_), h(h_), i(i_), j(j_),
sl@0
   981
        k(k_), l(l_) {}
sl@0
   982
sl@0
   983
    template <typename TupleT>
sl@0
   984
    typename actor_result<self_t, TupleT>::type
sl@0
   985
    eval(TupleT const& args) const
sl@0
   986
    {
sl@0
   987
        typename actor_result<A, TupleT>::type ra = a.eval(args);
sl@0
   988
        typename actor_result<B, TupleT>::type rb = b.eval(args);
sl@0
   989
        typename actor_result<C, TupleT>::type rc = c.eval(args);
sl@0
   990
        typename actor_result<D, TupleT>::type rd = d.eval(args);
sl@0
   991
        typename actor_result<E, TupleT>::type re = e.eval(args);
sl@0
   992
        typename actor_result<F, TupleT>::type rf = f.eval(args);
sl@0
   993
        typename actor_result<G, TupleT>::type rg = g.eval(args);
sl@0
   994
        typename actor_result<H, TupleT>::type rh = h.eval(args);
sl@0
   995
        typename actor_result<I, TupleT>::type ri = i.eval(args);
sl@0
   996
        typename actor_result<J, TupleT>::type rj = j.eval(args);
sl@0
   997
        typename actor_result<K, TupleT>::type rk = k.eval(args);
sl@0
   998
        typename actor_result<L, TupleT>::type rl = l.eval(args);
sl@0
   999
        return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj, rk, rl);
sl@0
  1000
    }
sl@0
  1001
sl@0
  1002
    mutable OperationT op; //  operation
sl@0
  1003
    A a; B b; C c; D d; E e; F f; G g; H h; I i; J j;
sl@0
  1004
    K k; L l;//  actors
sl@0
  1005
};
sl@0
  1006
sl@0
  1007
#if PHOENIX_LIMIT > 12
sl@0
  1008
///////////////////////////////////////////////////////////////////////////////
sl@0
  1009
//
sl@0
  1010
//  composite <13 actors> class
sl@0
  1011
//
sl@0
  1012
///////////////////////////////////////////////////////////////////////////////
sl@0
  1013
template <typename OperationT, typename TupleT,
sl@0
  1014
    typename A, typename B, typename C, typename D, typename E,
sl@0
  1015
    typename F, typename G, typename H, typename I, typename J,
sl@0
  1016
    typename K, typename L, typename M>
sl@0
  1017
struct composite13_result {
sl@0
  1018
sl@0
  1019
    typedef typename OperationT::template result<
sl@0
  1020
        typename actor_result<A, TupleT>::plain_type,
sl@0
  1021
        typename actor_result<B, TupleT>::plain_type,
sl@0
  1022
        typename actor_result<C, TupleT>::plain_type,
sl@0
  1023
        typename actor_result<D, TupleT>::plain_type,
sl@0
  1024
        typename actor_result<E, TupleT>::plain_type,
sl@0
  1025
        typename actor_result<F, TupleT>::plain_type,
sl@0
  1026
        typename actor_result<G, TupleT>::plain_type,
sl@0
  1027
        typename actor_result<H, TupleT>::plain_type,
sl@0
  1028
        typename actor_result<I, TupleT>::plain_type,
sl@0
  1029
        typename actor_result<J, TupleT>::plain_type,
sl@0
  1030
        typename actor_result<K, TupleT>::plain_type,
sl@0
  1031
        typename actor_result<L, TupleT>::plain_type,
sl@0
  1032
        typename actor_result<M, TupleT>::plain_type
sl@0
  1033
    >::type type;
sl@0
  1034
};
sl@0
  1035
sl@0
  1036
//////////////////////////////////
sl@0
  1037
template <typename OperationT,
sl@0
  1038
    typename A, typename B, typename C, typename D, typename E,
sl@0
  1039
    typename F, typename G, typename H, typename I, typename J,
sl@0
  1040
    typename K, typename L, typename M>
sl@0
  1041
struct composite<OperationT,
sl@0
  1042
    A, B, C, D, E, F, G, H, I, J, K, L, M, nil_t, nil_t, nil_t
sl@0
  1043
> {
sl@0
  1044
sl@0
  1045
    typedef composite<OperationT,
sl@0
  1046
        A, B, C, D, E, F, G, H, I, J, K, L, M> self_t;
sl@0
  1047
sl@0
  1048
    template <typename TupleT>
sl@0
  1049
    struct result {
sl@0
  1050
sl@0
  1051
        typedef typename composite13_result<
sl@0
  1052
            OperationT, TupleT, A, B, C, D, E, F, G, H, I, J, K, L, M
sl@0
  1053
        >::type type;
sl@0
  1054
    };
sl@0
  1055
sl@0
  1056
    composite(OperationT const& op_,
sl@0
  1057
        A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
sl@0
  1058
        F const& f_, G const& g_, H const& h_, I const& i_, J const& j_,
sl@0
  1059
        K const& k_, L const& l_, M const& m_)
sl@0
  1060
    :   op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
sl@0
  1061
        f(f_), g(g_), h(h_), i(i_), j(j_),
sl@0
  1062
        k(k_), l(l_), m(m_) {}
sl@0
  1063
sl@0
  1064
    template <typename TupleT>
sl@0
  1065
    typename actor_result<self_t, TupleT>::type
sl@0
  1066
    eval(TupleT const& args) const
sl@0
  1067
    {
sl@0
  1068
        typename actor_result<A, TupleT>::type ra = a.eval(args);
sl@0
  1069
        typename actor_result<B, TupleT>::type rb = b.eval(args);
sl@0
  1070
        typename actor_result<C, TupleT>::type rc = c.eval(args);
sl@0
  1071
        typename actor_result<D, TupleT>::type rd = d.eval(args);
sl@0
  1072
        typename actor_result<E, TupleT>::type re = e.eval(args);
sl@0
  1073
        typename actor_result<F, TupleT>::type rf = f.eval(args);
sl@0
  1074
        typename actor_result<G, TupleT>::type rg = g.eval(args);
sl@0
  1075
        typename actor_result<H, TupleT>::type rh = h.eval(args);
sl@0
  1076
        typename actor_result<I, TupleT>::type ri = i.eval(args);
sl@0
  1077
        typename actor_result<J, TupleT>::type rj = j.eval(args);
sl@0
  1078
        typename actor_result<K, TupleT>::type rk = k.eval(args);
sl@0
  1079
        typename actor_result<L, TupleT>::type rl = l.eval(args);
sl@0
  1080
        typename actor_result<M, TupleT>::type rm = m.eval(args);
sl@0
  1081
        return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj, rk, rl, rm);
sl@0
  1082
    }
sl@0
  1083
sl@0
  1084
    mutable OperationT op; //  operation
sl@0
  1085
    A a; B b; C c; D d; E e; F f; G g; H h; I i; J j;
sl@0
  1086
    K k; L l; M m; //  actors
sl@0
  1087
};
sl@0
  1088
sl@0
  1089
///////////////////////////////////////////////////////////////////////////////
sl@0
  1090
//
sl@0
  1091
//  composite <14 actors> class
sl@0
  1092
//
sl@0
  1093
///////////////////////////////////////////////////////////////////////////////
sl@0
  1094
template <typename OperationT, typename TupleT,
sl@0
  1095
    typename A, typename B, typename C, typename D, typename E,
sl@0
  1096
    typename F, typename G, typename H, typename I, typename J,
sl@0
  1097
    typename K, typename L, typename M, typename N>
sl@0
  1098
struct composite14_result {
sl@0
  1099
sl@0
  1100
    typedef typename OperationT::template result<
sl@0
  1101
        typename actor_result<A, TupleT>::plain_type,
sl@0
  1102
        typename actor_result<B, TupleT>::plain_type,
sl@0
  1103
        typename actor_result<C, TupleT>::plain_type,
sl@0
  1104
        typename actor_result<D, TupleT>::plain_type,
sl@0
  1105
        typename actor_result<E, TupleT>::plain_type,
sl@0
  1106
        typename actor_result<F, TupleT>::plain_type,
sl@0
  1107
        typename actor_result<G, TupleT>::plain_type,
sl@0
  1108
        typename actor_result<H, TupleT>::plain_type,
sl@0
  1109
        typename actor_result<I, TupleT>::plain_type,
sl@0
  1110
        typename actor_result<J, TupleT>::plain_type,
sl@0
  1111
        typename actor_result<K, TupleT>::plain_type,
sl@0
  1112
        typename actor_result<L, TupleT>::plain_type,
sl@0
  1113
        typename actor_result<M, TupleT>::plain_type,
sl@0
  1114
        typename actor_result<N, TupleT>::plain_type
sl@0
  1115
    >::type type;
sl@0
  1116
};
sl@0
  1117
sl@0
  1118
//////////////////////////////////
sl@0
  1119
template <typename OperationT,
sl@0
  1120
    typename A, typename B, typename C, typename D, typename E,
sl@0
  1121
    typename F, typename G, typename H, typename I, typename J,
sl@0
  1122
    typename K, typename L, typename M, typename N>
sl@0
  1123
struct composite<OperationT,
sl@0
  1124
    A, B, C, D, E, F, G, H, I, J, K, L, M, N, nil_t, nil_t
sl@0
  1125
> {
sl@0
  1126
sl@0
  1127
    typedef composite<OperationT,
sl@0
  1128
        A, B, C, D, E, F, G, H, I, J, K, L, M, N> self_t;
sl@0
  1129
sl@0
  1130
    template <typename TupleT>
sl@0
  1131
    struct result {
sl@0
  1132
sl@0
  1133
        typedef typename composite14_result<
sl@0
  1134
            OperationT, TupleT, A, B, C, D, E, F, G, H, I, J, K, L, M, N
sl@0
  1135
        >::type type;
sl@0
  1136
    };
sl@0
  1137
sl@0
  1138
    composite(OperationT const& op_,
sl@0
  1139
        A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
sl@0
  1140
        F const& f_, G const& g_, H const& h_, I const& i_, J const& j_,
sl@0
  1141
        K const& k_, L const& l_, M const& m_, N const& n_)
sl@0
  1142
    :   op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
sl@0
  1143
        f(f_), g(g_), h(h_), i(i_), j(j_),
sl@0
  1144
        k(k_), l(l_), m(m_), n(n_) {}
sl@0
  1145
sl@0
  1146
    template <typename TupleT>
sl@0
  1147
    typename actor_result<self_t, TupleT>::type
sl@0
  1148
    eval(TupleT const& args) const
sl@0
  1149
    {
sl@0
  1150
        typename actor_result<A, TupleT>::type ra = a.eval(args);
sl@0
  1151
        typename actor_result<B, TupleT>::type rb = b.eval(args);
sl@0
  1152
        typename actor_result<C, TupleT>::type rc = c.eval(args);
sl@0
  1153
        typename actor_result<D, TupleT>::type rd = d.eval(args);
sl@0
  1154
        typename actor_result<E, TupleT>::type re = e.eval(args);
sl@0
  1155
        typename actor_result<F, TupleT>::type rf = f.eval(args);
sl@0
  1156
        typename actor_result<G, TupleT>::type rg = g.eval(args);
sl@0
  1157
        typename actor_result<H, TupleT>::type rh = h.eval(args);
sl@0
  1158
        typename actor_result<I, TupleT>::type ri = i.eval(args);
sl@0
  1159
        typename actor_result<J, TupleT>::type rj = j.eval(args);
sl@0
  1160
        typename actor_result<K, TupleT>::type rk = k.eval(args);
sl@0
  1161
        typename actor_result<L, TupleT>::type rl = l.eval(args);
sl@0
  1162
        typename actor_result<M, TupleT>::type rm = m.eval(args);
sl@0
  1163
        typename actor_result<N, TupleT>::type rn = n.eval(args);
sl@0
  1164
        return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj, rk, rl, rm, rn);
sl@0
  1165
    }
sl@0
  1166
sl@0
  1167
    mutable OperationT op; //  operation
sl@0
  1168
    A a; B b; C c; D d; E e; F f; G g; H h; I i; J j;
sl@0
  1169
    K k; L l; M m; N n; //  actors
sl@0
  1170
};
sl@0
  1171
sl@0
  1172
///////////////////////////////////////////////////////////////////////////////
sl@0
  1173
//
sl@0
  1174
//  composite <15 actors> class
sl@0
  1175
//
sl@0
  1176
///////////////////////////////////////////////////////////////////////////////
sl@0
  1177
template <typename OperationT, typename TupleT,
sl@0
  1178
    typename A, typename B, typename C, typename D, typename E,
sl@0
  1179
    typename F, typename G, typename H, typename I, typename J,
sl@0
  1180
    typename K, typename L, typename M, typename N, typename O>
sl@0
  1181
struct composite15_result {
sl@0
  1182
sl@0
  1183
    typedef typename OperationT::template result<
sl@0
  1184
        typename actor_result<A, TupleT>::plain_type,
sl@0
  1185
        typename actor_result<B, TupleT>::plain_type,
sl@0
  1186
        typename actor_result<C, TupleT>::plain_type,
sl@0
  1187
        typename actor_result<D, TupleT>::plain_type,
sl@0
  1188
        typename actor_result<E, TupleT>::plain_type,
sl@0
  1189
        typename actor_result<F, TupleT>::plain_type,
sl@0
  1190
        typename actor_result<G, TupleT>::plain_type,
sl@0
  1191
        typename actor_result<H, TupleT>::plain_type,
sl@0
  1192
        typename actor_result<I, TupleT>::plain_type,
sl@0
  1193
        typename actor_result<J, TupleT>::plain_type,
sl@0
  1194
        typename actor_result<K, TupleT>::plain_type,
sl@0
  1195
        typename actor_result<L, TupleT>::plain_type,
sl@0
  1196
        typename actor_result<M, TupleT>::plain_type,
sl@0
  1197
        typename actor_result<N, TupleT>::plain_type,
sl@0
  1198
        typename actor_result<O, TupleT>::plain_type
sl@0
  1199
    >::type type;
sl@0
  1200
};
sl@0
  1201
sl@0
  1202
//////////////////////////////////
sl@0
  1203
template <typename OperationT,
sl@0
  1204
    typename A, typename B, typename C, typename D, typename E,
sl@0
  1205
    typename F, typename G, typename H, typename I, typename J,
sl@0
  1206
    typename K, typename L, typename M, typename N, typename O>
sl@0
  1207
struct composite<OperationT,
sl@0
  1208
    A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, nil_t
sl@0
  1209
> {
sl@0
  1210
sl@0
  1211
    typedef composite<OperationT,
sl@0
  1212
        A, B, C, D, E, F, G, H, I, J, K, L, M, N, O> self_t;
sl@0
  1213
sl@0
  1214
    template <typename TupleT>
sl@0
  1215
    struct result {
sl@0
  1216
sl@0
  1217
        typedef typename composite15_result<
sl@0
  1218
            OperationT, TupleT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O
sl@0
  1219
        >::type type;
sl@0
  1220
    };
sl@0
  1221
sl@0
  1222
    composite(OperationT const& op_,
sl@0
  1223
        A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
sl@0
  1224
        F const& f_, G const& g_, H const& h_, I const& i_, J const& j_,
sl@0
  1225
        K const& k_, L const& l_, M const& m_, N const& n_, O const& o_)
sl@0
  1226
    :   op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
sl@0
  1227
        f(f_), g(g_), h(h_), i(i_), j(j_),
sl@0
  1228
        k(k_), l(l_), m(m_), n(n_), o(o_) {}
sl@0
  1229
sl@0
  1230
    template <typename TupleT>
sl@0
  1231
    typename actor_result<self_t, TupleT>::type
sl@0
  1232
    eval(TupleT const& args) const
sl@0
  1233
    {
sl@0
  1234
        typename actor_result<A, TupleT>::type ra = a.eval(args);
sl@0
  1235
        typename actor_result<B, TupleT>::type rb = b.eval(args);
sl@0
  1236
        typename actor_result<C, TupleT>::type rc = c.eval(args);
sl@0
  1237
        typename actor_result<D, TupleT>::type rd = d.eval(args);
sl@0
  1238
        typename actor_result<E, TupleT>::type re = e.eval(args);
sl@0
  1239
        typename actor_result<F, TupleT>::type rf = f.eval(args);
sl@0
  1240
        typename actor_result<G, TupleT>::type rg = g.eval(args);
sl@0
  1241
        typename actor_result<H, TupleT>::type rh = h.eval(args);
sl@0
  1242
        typename actor_result<I, TupleT>::type ri = i.eval(args);
sl@0
  1243
        typename actor_result<J, TupleT>::type rj = j.eval(args);
sl@0
  1244
        typename actor_result<K, TupleT>::type rk = k.eval(args);
sl@0
  1245
        typename actor_result<L, TupleT>::type rl = l.eval(args);
sl@0
  1246
        typename actor_result<M, TupleT>::type rm = m.eval(args);
sl@0
  1247
        typename actor_result<N, TupleT>::type rn = n.eval(args);
sl@0
  1248
        typename actor_result<O, TupleT>::type ro = o.eval(args);
sl@0
  1249
        return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj, rk, rl, rm, rn, ro);
sl@0
  1250
    }
sl@0
  1251
sl@0
  1252
    mutable OperationT op; //  operation
sl@0
  1253
    A a; B b; C c; D d; E e; F f; G g; H h; I i; J j;
sl@0
  1254
    K k; L l; M m; N n; O o; //  actors
sl@0
  1255
};
sl@0
  1256
sl@0
  1257
#endif
sl@0
  1258
#endif
sl@0
  1259
#endif
sl@0
  1260
#endif
sl@0
  1261
sl@0
  1262
namespace impl {
sl@0
  1263
sl@0
  1264
    ///////////////////////////////////////////////////////////////////////////
sl@0
  1265
    //
sl@0
  1266
    //      make_composite is basically a type computer that answers the
sl@0
  1267
    //      question "Given types T0..TN, what composite type should I
sl@0
  1268
    //      create <composite_type> and if I were to generate an actual
sl@0
  1269
    //      composite, what type <type> should I return?"
sl@0
  1270
    //
sl@0
  1271
    ///////////////////////////////////////////////////////////////////////////
sl@0
  1272
    template <
sl@0
  1273
        typename OperationT
sl@0
  1274
        ,   typename A = nil_t
sl@0
  1275
        ,   typename B = nil_t
sl@0
  1276
        ,   typename C = nil_t
sl@0
  1277
sl@0
  1278
#if PHOENIX_LIMIT > 3
sl@0
  1279
        ,   typename D = nil_t
sl@0
  1280
        ,   typename E = nil_t
sl@0
  1281
        ,   typename F = nil_t
sl@0
  1282
sl@0
  1283
#if PHOENIX_LIMIT > 6
sl@0
  1284
        ,   typename G = nil_t
sl@0
  1285
        ,   typename H = nil_t
sl@0
  1286
        ,   typename I = nil_t
sl@0
  1287
sl@0
  1288
#if PHOENIX_LIMIT > 9
sl@0
  1289
        ,   typename J = nil_t
sl@0
  1290
        ,   typename K = nil_t
sl@0
  1291
        ,   typename L = nil_t
sl@0
  1292
sl@0
  1293
#if PHOENIX_LIMIT > 12
sl@0
  1294
        ,   typename M = nil_t
sl@0
  1295
        ,   typename N = nil_t
sl@0
  1296
        ,   typename O = nil_t
sl@0
  1297
sl@0
  1298
#endif
sl@0
  1299
#endif
sl@0
  1300
#endif
sl@0
  1301
#endif
sl@0
  1302
    >
sl@0
  1303
    struct make_composite {
sl@0
  1304
sl@0
  1305
        typedef composite<OperationT
sl@0
  1306
            ,   typename as_actor<A>::type
sl@0
  1307
            ,   typename as_actor<B>::type
sl@0
  1308
            ,   typename as_actor<C>::type
sl@0
  1309
sl@0
  1310
#if PHOENIX_LIMIT > 3
sl@0
  1311
            ,   typename as_actor<D>::type
sl@0
  1312
            ,   typename as_actor<E>::type
sl@0
  1313
            ,   typename as_actor<F>::type
sl@0
  1314
sl@0
  1315
#if PHOENIX_LIMIT > 6
sl@0
  1316
            ,   typename as_actor<G>::type
sl@0
  1317
            ,   typename as_actor<H>::type
sl@0
  1318
            ,   typename as_actor<I>::type
sl@0
  1319
sl@0
  1320
#if PHOENIX_LIMIT > 9
sl@0
  1321
            ,   typename as_actor<J>::type
sl@0
  1322
            ,   typename as_actor<K>::type
sl@0
  1323
            ,   typename as_actor<L>::type
sl@0
  1324
sl@0
  1325
#if PHOENIX_LIMIT > 12
sl@0
  1326
            ,   typename as_actor<M>::type
sl@0
  1327
            ,   typename as_actor<N>::type
sl@0
  1328
            ,   typename as_actor<O>::type
sl@0
  1329
sl@0
  1330
#endif
sl@0
  1331
#endif
sl@0
  1332
#endif
sl@0
  1333
#endif
sl@0
  1334
        > composite_type;
sl@0
  1335
sl@0
  1336
        typedef actor<composite_type> type;
sl@0
  1337
    };
sl@0
  1338
sl@0
  1339
    ///////////////////////////////////////////////////////////////////////////
sl@0
  1340
    //
sl@0
  1341
    //      make_unary, make_binary, make_binary1, make_binary2 and
sl@0
  1342
    //      make_binary3 utilities are provided here for easy creation of
sl@0
  1343
    //      unary and binary composites.
sl@0
  1344
    //
sl@0
  1345
    ///////////////////////////////////////////////////////////////////////////
sl@0
  1346
sl@0
  1347
    //////////////////////////////////  input is an actor
sl@0
  1348
    template <typename OperationT, typename BaseT>
sl@0
  1349
    struct make_unary {
sl@0
  1350
sl@0
  1351
        typedef typename make_composite
sl@0
  1352
            <OperationT, actor<BaseT> >::type type;
sl@0
  1353
sl@0
  1354
        static type
sl@0
  1355
        construct(actor<BaseT> const& _0)
sl@0
  1356
        {
sl@0
  1357
            typedef typename make_composite
sl@0
  1358
                    <OperationT, actor<BaseT> >::composite_type
sl@0
  1359
                ret_t;
sl@0
  1360
sl@0
  1361
            return ret_t(OperationT(), _0);
sl@0
  1362
        }
sl@0
  1363
    };
sl@0
  1364
sl@0
  1365
    //////////////////////////////////  LHS is an actor, RHS is unknown
sl@0
  1366
    template <typename OperationT, typename BaseT, typename B>
sl@0
  1367
    struct make_binary1 {
sl@0
  1368
sl@0
  1369
        typedef typename make_composite
sl@0
  1370
            <OperationT, actor<BaseT>, B>::type type;
sl@0
  1371
sl@0
  1372
        static type
sl@0
  1373
        construct(actor<BaseT> const& _0, B const& _1)
sl@0
  1374
        {
sl@0
  1375
            typedef typename make_composite
sl@0
  1376
                    <OperationT, actor<BaseT>, B>::composite_type
sl@0
  1377
                ret_t;
sl@0
  1378
            
sl@0
  1379
            return ret_t(OperationT(), _0, as_actor<B>::convert(_1));
sl@0
  1380
        }
sl@0
  1381
    };
sl@0
  1382
sl@0
  1383
    //////////////////////////////////  LHS is unknown, RHS is an actor
sl@0
  1384
    template <typename OperationT, typename A, typename BaseT>
sl@0
  1385
    struct make_binary2 {
sl@0
  1386
sl@0
  1387
        typedef typename make_composite
sl@0
  1388
            <OperationT, A, actor<BaseT> >::type type;
sl@0
  1389
sl@0
  1390
        static type
sl@0
  1391
        construct(A const& _0, actor<BaseT> const& _1)
sl@0
  1392
        {
sl@0
  1393
            typedef typename make_composite
sl@0
  1394
                    <OperationT, A, actor<BaseT> >::composite_type
sl@0
  1395
                ret_t;
sl@0
  1396
sl@0
  1397
            return ret_t(OperationT(), as_actor<A>::convert(_0), _1);
sl@0
  1398
        }
sl@0
  1399
    };
sl@0
  1400
sl@0
  1401
    //////////////////////////////////  Both LHS and RHS are actors
sl@0
  1402
    template <typename OperationT, typename BaseA, typename BaseB>
sl@0
  1403
    struct make_binary3 {
sl@0
  1404
sl@0
  1405
        typedef typename make_composite
sl@0
  1406
            <OperationT, actor<BaseA>, actor<BaseB> >::type type;
sl@0
  1407
sl@0
  1408
        static type
sl@0
  1409
        construct(actor<BaseA> const& _0, actor<BaseB> const& _1)
sl@0
  1410
        {
sl@0
  1411
            typedef typename make_composite
sl@0
  1412
                    <OperationT, actor<BaseA>, actor<BaseB> >::composite_type
sl@0
  1413
                ret_t;
sl@0
  1414
sl@0
  1415
            return ret_t(OperationT(), _0, _1);
sl@0
  1416
        }
sl@0
  1417
    };
sl@0
  1418
sl@0
  1419
}   // namespace impl
sl@0
  1420
sl@0
  1421
}   //  namespace phoenix
sl@0
  1422
sl@0
  1423
#endif