composite.hpp 47 KB

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