tuple_helpers.hpp 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075
  1. /*=============================================================================
  2. Phoenix V1.2.1
  3. Copyright (c) 2002 Joel de Guzman
  4. Copyright (c) 2002-2003 Hartmut Kaiser
  5. Distributed under the Boost Software License, Version 1.0. (See accompanying
  6. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  7. ==============================================================================*/
  8. #ifndef PHOENIX_TUPLEHELPERS_HPP
  9. #define PHOENIX_TUPLEHELPERS_HPP
  10. ///////////////////////////////////////////////////////////////////////////////
  11. #include <cassert>
  12. #include <boost/spirit/home/classic/phoenix/tuples.hpp>
  13. ///////////////////////////////////////////////////////////////////////////////
  14. namespace phoenix
  15. {
  16. ///////////////////////////////////////////////////////////////////////////////
  17. //
  18. // make_tuple template class
  19. //
  20. // This template class is used to calculate a tuple type required to hold
  21. // the given template parameter type
  22. //
  23. ///////////////////////////////////////////////////////////////////////////////
  24. ///////////////////////////////////////////////////////////////////////////////
  25. // normal (non-tuple types are wrapped into a tuple)
  26. template <typename ResultT>
  27. struct make_tuple {
  28. typedef tuple<ResultT> type;
  29. };
  30. ///////////////////////////////////////////////////////////////////////////////
  31. // nil_t is converted to an empty tuple type
  32. template <>
  33. struct make_tuple<nil_t> {
  34. typedef tuple<> type;
  35. };
  36. ///////////////////////////////////////////////////////////////////////////////
  37. // tuple types are left alone without any refactoring
  38. template <
  39. typename A, typename B, typename C
  40. #if PHOENIX_LIMIT > 3
  41. , typename D, typename E, typename F
  42. #if PHOENIX_LIMIT > 6
  43. , typename G, typename H, typename I
  44. #if PHOENIX_LIMIT > 9
  45. , typename J, typename K, typename L
  46. #if PHOENIX_LIMIT > 12
  47. , typename M, typename N, typename O
  48. #endif
  49. #endif
  50. #endif
  51. #endif
  52. >
  53. struct make_tuple<tuple<A, B, C
  54. #if PHOENIX_LIMIT > 3
  55. , D, E, F
  56. #if PHOENIX_LIMIT > 6
  57. , G, H, I
  58. #if PHOENIX_LIMIT > 9
  59. , J, K, L
  60. #if PHOENIX_LIMIT > 12
  61. , M, N, O
  62. #endif
  63. #endif
  64. #endif
  65. #endif
  66. > > {
  67. // the tuple parameter itself is the required tuple type
  68. typedef tuple<A, B, C
  69. #if PHOENIX_LIMIT > 3
  70. , D, E, F
  71. #if PHOENIX_LIMIT > 6
  72. , G, H, I
  73. #if PHOENIX_LIMIT > 9
  74. , J, K, L
  75. #if PHOENIX_LIMIT > 12
  76. , M, N, O
  77. #endif
  78. #endif
  79. #endif
  80. #endif
  81. > type;
  82. };
  83. ///////////////////////////////////////////////////////////////////////////////
  84. //
  85. // concat_tuple type computer
  86. //
  87. // This class returns the type of a tuple, which is constructed by
  88. // concatenating a tuple with a given type
  89. //
  90. ///////////////////////////////////////////////////////////////////////////////
  91. template <typename TupleT, typename AppendT>
  92. struct concat_tuple;
  93. ///////////////////////////////////////////////////////////////////////////////
  94. //
  95. // concat tuple <0 member> class
  96. //
  97. ///////////////////////////////////////////////////////////////////////////////
  98. template <typename AppendT>
  99. struct concat_tuple<tuple<>, AppendT> {
  100. typedef tuple<AppendT> type;
  101. };
  102. template <>
  103. struct concat_tuple<tuple<>, nil_t> {
  104. typedef tuple<> type;
  105. };
  106. ///////////////////////////////////////////////////////////////////////////////
  107. //
  108. // concat tuple <1 member> class
  109. //
  110. ///////////////////////////////////////////////////////////////////////////////
  111. template <typename A, typename AppendT>
  112. struct concat_tuple<tuple<A>, AppendT> {
  113. typedef tuple<A, AppendT> type;
  114. };
  115. template <typename A>
  116. struct concat_tuple<tuple<A>, nil_t> {
  117. typedef tuple<A> type;
  118. };
  119. ///////////////////////////////////////////////////////////////////////////////
  120. //
  121. // concat tuple <2 member> class
  122. //
  123. ///////////////////////////////////////////////////////////////////////////////
  124. template <typename A, typename B, typename AppendT>
  125. struct concat_tuple<tuple<A, B>, AppendT> {
  126. typedef tuple<A, B, AppendT> type;
  127. };
  128. template <typename A, typename B>
  129. struct concat_tuple<tuple<A, B>, nil_t> {
  130. typedef tuple<A, B> type;
  131. };
  132. #if PHOENIX_LIMIT > 3
  133. ///////////////////////////////////////////////////////////////////////////////
  134. //
  135. // concat tuple <3 member> class
  136. //
  137. ///////////////////////////////////////////////////////////////////////////////
  138. template <
  139. typename A, typename B, typename C,
  140. typename AppendT
  141. >
  142. struct concat_tuple<tuple<A, B, C>, AppendT> {
  143. typedef tuple<A, B, C, AppendT> type;
  144. };
  145. template <
  146. typename A, typename B, typename C
  147. >
  148. struct concat_tuple<tuple<A, B, C>, nil_t> {
  149. typedef tuple<A, B, C> type;
  150. };
  151. ///////////////////////////////////////////////////////////////////////////////
  152. //
  153. // concat tuple <4 member> class
  154. //
  155. ///////////////////////////////////////////////////////////////////////////////
  156. template <
  157. typename A, typename B, typename C, typename D,
  158. typename AppendT
  159. >
  160. struct concat_tuple<tuple<A, B, C, D>, AppendT> {
  161. typedef tuple<A, B, C, D, AppendT> type;
  162. };
  163. template <
  164. typename A, typename B, typename C, typename D
  165. >
  166. struct concat_tuple<tuple<A, B, C, D>, nil_t> {
  167. typedef tuple<A, B, C, D> type;
  168. };
  169. ///////////////////////////////////////////////////////////////////////////////
  170. //
  171. // concat tuple <5 member> class
  172. //
  173. ///////////////////////////////////////////////////////////////////////////////
  174. template <
  175. typename A, typename B, typename C, typename D, typename E,
  176. typename AppendT
  177. >
  178. struct concat_tuple<tuple<A, B, C, D, E>, AppendT> {
  179. typedef tuple<A, B, C, D, E, AppendT> type;
  180. };
  181. template <
  182. typename A, typename B, typename C, typename D, typename E
  183. >
  184. struct concat_tuple<tuple<A, B, C, D, E>, nil_t> {
  185. typedef tuple<A, B, C, D, E> type;
  186. };
  187. #if PHOENIX_LIMIT > 6
  188. ///////////////////////////////////////////////////////////////////////////////
  189. //
  190. // concat tuple <6 member> class
  191. //
  192. ///////////////////////////////////////////////////////////////////////////////
  193. template <
  194. typename A, typename B, typename C, typename D, typename E, typename F,
  195. typename AppendT
  196. >
  197. struct concat_tuple<tuple<A, B, C, D, E, F>, AppendT> {
  198. typedef tuple<A, B, C, D, E, F, AppendT> type;
  199. };
  200. template <
  201. typename A, typename B, typename C, typename D, typename E, typename F
  202. >
  203. struct concat_tuple<tuple<A, B, C, D, E, F>, nil_t> {
  204. typedef tuple<A, B, C, D, E, F> type;
  205. };
  206. ///////////////////////////////////////////////////////////////////////////////
  207. //
  208. // concat tuple <7 member> class
  209. //
  210. ///////////////////////////////////////////////////////////////////////////////
  211. template <
  212. typename A, typename B, typename C, typename D, typename E, typename F,
  213. typename G,
  214. typename AppendT
  215. >
  216. struct concat_tuple<tuple<A, B, C, D, E, F, G>, AppendT> {
  217. typedef tuple<A, B, C, D, E, F, G, AppendT> type;
  218. };
  219. template <
  220. typename A, typename B, typename C, typename D, typename E, typename F,
  221. typename G
  222. >
  223. struct concat_tuple<tuple<A, B, C, D, E, F, G>, nil_t> {
  224. typedef tuple<A, B, C, D, E, F, G> type;
  225. };
  226. ///////////////////////////////////////////////////////////////////////////////
  227. //
  228. // concat tuple <8 member> class
  229. //
  230. ///////////////////////////////////////////////////////////////////////////////
  231. template <
  232. typename A, typename B, typename C, typename D, typename E, typename F,
  233. typename G, typename H,
  234. typename AppendT
  235. >
  236. struct concat_tuple<tuple<A, B, C, D, E, F, G, H>, AppendT> {
  237. typedef tuple<A, B, C, D, E, F, G, H, AppendT> type;
  238. };
  239. template <
  240. typename A, typename B, typename C, typename D, typename E, typename F,
  241. typename G, typename H
  242. >
  243. struct concat_tuple<tuple<A, B, C, D, E, F, G, H>, nil_t> {
  244. typedef tuple<A, B, C, D, E, F, G, H> type;
  245. };
  246. #if PHOENIX_LIMIT > 9
  247. ///////////////////////////////////////////////////////////////////////////////
  248. //
  249. // concat tuple <9 member> class
  250. //
  251. ///////////////////////////////////////////////////////////////////////////////
  252. template <
  253. typename A, typename B, typename C, typename D, typename E, typename F,
  254. typename G, typename H, typename I,
  255. typename AppendT
  256. >
  257. struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I>, AppendT> {
  258. typedef tuple<A, B, C, D, E, F, G, H, I, AppendT> type;
  259. };
  260. template <
  261. typename A, typename B, typename C, typename D, typename E, typename F,
  262. typename G, typename H, typename I
  263. >
  264. struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I>, nil_t> {
  265. typedef tuple<A, B, C, D, E, F, G, H, I> type;
  266. };
  267. ///////////////////////////////////////////////////////////////////////////////
  268. //
  269. // concat tuple <10 member> class
  270. //
  271. ///////////////////////////////////////////////////////////////////////////////
  272. template <
  273. typename A, typename B, typename C, typename D, typename E, typename F,
  274. typename G, typename H, typename I, typename J,
  275. typename AppendT
  276. >
  277. struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J>, AppendT> {
  278. typedef tuple<A, B, C, D, E, F, G, H, I, J, AppendT> type;
  279. };
  280. template <
  281. typename A, typename B, typename C, typename D, typename E, typename F,
  282. typename G, typename H, typename I, typename J
  283. >
  284. struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J>, nil_t> {
  285. typedef tuple<A, B, C, D, E, F, G, H, I, J> type;
  286. };
  287. ///////////////////////////////////////////////////////////////////////////////
  288. //
  289. // concat tuple <11 member> class
  290. //
  291. ///////////////////////////////////////////////////////////////////////////////
  292. template <
  293. typename A, typename B, typename C, typename D, typename E, typename F,
  294. typename G, typename H, typename I, typename J, typename K,
  295. typename AppendT
  296. >
  297. struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K>, AppendT> {
  298. typedef tuple<A, B, C, D, E, F, G, H, I, J, K, AppendT> type;
  299. };
  300. template <
  301. typename A, typename B, typename C, typename D, typename E, typename F,
  302. typename G, typename H, typename I, typename J, typename K
  303. >
  304. struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K>, nil_t> {
  305. typedef tuple<A, B, C, D, E, F, G, H, I, J, K> type;
  306. };
  307. #if PHOENIX_LIMIT > 12
  308. ///////////////////////////////////////////////////////////////////////////////
  309. //
  310. // concat tuple <12 member> class
  311. //
  312. ///////////////////////////////////////////////////////////////////////////////
  313. template <
  314. typename A, typename B, typename C, typename D, typename E, typename F,
  315. typename G, typename H, typename I, typename J, typename K, typename L,
  316. typename AppendT
  317. >
  318. struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K, L>, AppendT> {
  319. typedef tuple<A, B, C, D, E, F, G, H, I, J, K, L, AppendT> type;
  320. };
  321. template <
  322. typename A, typename B, typename C, typename D, typename E, typename F,
  323. typename G, typename H, typename I, typename J, typename K, typename L
  324. >
  325. struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K, L>, nil_t> {
  326. typedef tuple<A, B, C, D, E, F, G, H, I, J, K, L> type;
  327. };
  328. ///////////////////////////////////////////////////////////////////////////////
  329. //
  330. // concat tuple <13 member> class
  331. //
  332. ///////////////////////////////////////////////////////////////////////////////
  333. template <
  334. typename A, typename B, typename C, typename D, typename E, typename F,
  335. typename G, typename H, typename I, typename J, typename K, typename L,
  336. typename M,
  337. typename AppendT
  338. >
  339. struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K, L, M>, AppendT> {
  340. typedef tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, AppendT> type;
  341. };
  342. template <
  343. typename A, typename B, typename C, typename D, typename E, typename F,
  344. typename G, typename H, typename I, typename J, typename K, typename L,
  345. typename M
  346. >
  347. struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K, L, M>, nil_t> {
  348. typedef tuple<A, B, C, D, E, F, G, H, I, J, K, L, M> type;
  349. };
  350. ///////////////////////////////////////////////////////////////////////////////
  351. //
  352. // concat tuple <14 member> class
  353. //
  354. ///////////////////////////////////////////////////////////////////////////////
  355. template <
  356. typename A, typename B, typename C, typename D, typename E, typename F,
  357. typename G, typename H, typename I, typename J, typename K, typename L,
  358. typename M, typename N,
  359. typename AppendT
  360. >
  361. struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N>, AppendT> {
  362. typedef tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N, AppendT> type;
  363. };
  364. template <
  365. typename A, typename B, typename C, typename D, typename E, typename F,
  366. typename G, typename H, typename I, typename J, typename K, typename L,
  367. typename M, typename N
  368. >
  369. struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N>, nil_t> {
  370. typedef tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N> type;
  371. };
  372. #endif
  373. #endif
  374. #endif
  375. #endif
  376. ///////////////////////////////////////////////////////////////////////////////
  377. //
  378. // concat_tuples type computer
  379. //
  380. // This template class returns the type of a tuple built from the
  381. // concatenation of two given tuples.
  382. //
  383. ///////////////////////////////////////////////////////////////////////////////
  384. template <typename TupleT1, typename TupleT2, int N, typename AppendT>
  385. struct concat_tuple_element {
  386. typedef
  387. typename concat_tuple_element<
  388. typename concat_tuple<TupleT1, AppendT>::type, TupleT2, N+1,
  389. typename tuple_element<N+1, TupleT2>::type
  390. >::type
  391. type;
  392. };
  393. template <typename TupleT1, typename TupleT2, int N>
  394. struct concat_tuple_element<TupleT1, TupleT2, N, nil_t> {
  395. typedef TupleT1 type;
  396. };
  397. template <typename TupleT1, typename TupleT2>
  398. struct concat_tuples {
  399. typedef
  400. typename concat_tuple_element<
  401. TupleT1, TupleT2, 0,
  402. typename tuple_element<0, TupleT2>::type
  403. >::type
  404. type;
  405. };
  406. ///////////////////////////////////////////////////////////////////////////////
  407. //
  408. // convert_actors template function
  409. //
  410. // The convert_actors template functions constructs a new tuple object
  411. // composed of the elements returned by the actors contained in the
  412. // input tuple. (i.e. the given tuple type 'actor_tuple' contains a set
  413. // of actors to evaluate and the resulting tuple contains the results of
  414. // evaluating the actors.)
  415. //
  416. ///////////////////////////////////////////////////////////////////////////////
  417. template <typename ActorT, typename TupleT>
  418. struct actor_result; // forward declaration
  419. namespace impl
  420. {
  421. template <unsigned N>
  422. struct convert_actors_ {};
  423. }
  424. template <typename TupleResultT, typename ActorTupleT>
  425. TupleResultT
  426. convert_actors(ActorTupleT const& actor_tuple)
  427. {
  428. BOOST_STATIC_ASSERT(ActorTupleT::length <= TupleResultT::length);
  429. BOOST_STATIC_CONSTANT(int, length = TupleResultT::length);
  430. return impl::convert_actors_<length>
  431. ::template apply<TupleResultT, ActorTupleT>::do_(actor_tuple);
  432. }
  433. namespace impl
  434. {
  435. template <int N, typename TupleResultT, typename ActorTupleT>
  436. struct convert_actor
  437. {
  438. typedef typename tuple_element<N, TupleResultT>::type type;
  439. template <bool C>
  440. struct is_default_t {};
  441. typedef is_default_t<true> is_default;
  442. typedef is_default_t<false> is_not_default;
  443. static type
  444. actor_element(ActorTupleT const& /*actor_tuple*/, is_default)
  445. {
  446. return type(); // default construct
  447. }
  448. static type
  449. actor_element(ActorTupleT const& actor_tuple, is_not_default)
  450. {
  451. BOOST_STATIC_ASSERT(ActorTupleT::length <= TupleResultT::length);
  452. return actor_tuple[tuple_index<N>()](); // apply the actor
  453. }
  454. static type
  455. do_(ActorTupleT const& actor_tuple)
  456. {
  457. return actor_element(
  458. actor_tuple, is_default_t<(N >= ActorTupleT::length)>());
  459. }
  460. };
  461. ///////////////////////////////////////
  462. template <>
  463. struct convert_actors_<1>
  464. {
  465. template <typename TupleResultT, typename ActorTupleT>
  466. struct apply
  467. {
  468. static TupleResultT
  469. do_(ActorTupleT const& actor_tuple)
  470. {
  471. typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
  472. return TupleResultT(
  473. converter0::do_(actor_tuple)
  474. );
  475. }
  476. };
  477. };
  478. ///////////////////////////////////////
  479. template <>
  480. struct convert_actors_<2>
  481. {
  482. template <typename TupleResultT, typename ActorTupleT>
  483. struct apply
  484. {
  485. static TupleResultT
  486. do_(ActorTupleT const& actor_tuple)
  487. {
  488. typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
  489. typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
  490. using namespace tuple_index_names;
  491. return TupleResultT(
  492. converter0::do_(actor_tuple)
  493. , converter1::do_(actor_tuple)
  494. );
  495. }
  496. };
  497. };
  498. ///////////////////////////////////////
  499. template <>
  500. struct convert_actors_<3>
  501. {
  502. template <typename TupleResultT, typename ActorTupleT>
  503. struct apply
  504. {
  505. static TupleResultT
  506. do_(ActorTupleT const& actor_tuple)
  507. {
  508. typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
  509. typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
  510. typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
  511. using namespace tuple_index_names;
  512. return TupleResultT(
  513. converter0::do_(actor_tuple)
  514. , converter1::do_(actor_tuple)
  515. , converter2::do_(actor_tuple)
  516. );
  517. }
  518. };
  519. };
  520. #if PHOENIX_LIMIT > 3
  521. /////////////////////////////////////
  522. template <>
  523. struct convert_actors_<4>
  524. {
  525. template <typename TupleResultT, typename ActorTupleT>
  526. struct apply
  527. {
  528. static TupleResultT
  529. do_(ActorTupleT const& actor_tuple)
  530. {
  531. typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
  532. typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
  533. typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
  534. typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
  535. using namespace tuple_index_names;
  536. return TupleResultT(
  537. converter0::do_(actor_tuple)
  538. , converter1::do_(actor_tuple)
  539. , converter2::do_(actor_tuple)
  540. , converter3::do_(actor_tuple)
  541. );
  542. }
  543. };
  544. };
  545. /////////////////////////////////////
  546. template <>
  547. struct convert_actors_<5>
  548. {
  549. template <typename TupleResultT, typename ActorTupleT>
  550. struct apply
  551. {
  552. static TupleResultT
  553. do_(ActorTupleT const& actor_tuple)
  554. {
  555. typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
  556. typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
  557. typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
  558. typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
  559. typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
  560. using namespace tuple_index_names;
  561. return TupleResultT(
  562. converter0::do_(actor_tuple)
  563. , converter1::do_(actor_tuple)
  564. , converter2::do_(actor_tuple)
  565. , converter3::do_(actor_tuple)
  566. , converter4::do_(actor_tuple)
  567. );
  568. }
  569. };
  570. };
  571. /////////////////////////////////////
  572. template <>
  573. struct convert_actors_<6>
  574. {
  575. template <typename TupleResultT, typename ActorTupleT>
  576. struct apply
  577. {
  578. static TupleResultT
  579. do_(ActorTupleT const& actor_tuple)
  580. {
  581. typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
  582. typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
  583. typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
  584. typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
  585. typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
  586. typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;
  587. using namespace tuple_index_names;
  588. return TupleResultT(
  589. converter0::do_(actor_tuple)
  590. , converter1::do_(actor_tuple)
  591. , converter2::do_(actor_tuple)
  592. , converter3::do_(actor_tuple)
  593. , converter4::do_(actor_tuple)
  594. , converter5::do_(actor_tuple)
  595. );
  596. }
  597. };
  598. };
  599. #if PHOENIX_LIMIT > 6
  600. /////////////////////////////////////
  601. template <>
  602. struct convert_actors_<7>
  603. {
  604. template <typename TupleResultT, typename ActorTupleT>
  605. struct apply
  606. {
  607. static TupleResultT
  608. do_(ActorTupleT const& actor_tuple)
  609. {
  610. typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
  611. typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
  612. typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
  613. typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
  614. typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
  615. typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;
  616. typedef impl::convert_actor<6, TupleResultT, ActorTupleT> converter6;
  617. using namespace tuple_index_names;
  618. return TupleResultT(
  619. converter0::do_(actor_tuple)
  620. , converter1::do_(actor_tuple)
  621. , converter2::do_(actor_tuple)
  622. , converter3::do_(actor_tuple)
  623. , converter4::do_(actor_tuple)
  624. , converter5::do_(actor_tuple)
  625. , converter6::do_(actor_tuple)
  626. );
  627. }
  628. };
  629. };
  630. /////////////////////////////////////
  631. template <>
  632. struct convert_actors_<8>
  633. {
  634. template <typename TupleResultT, typename ActorTupleT>
  635. struct apply
  636. {
  637. static TupleResultT
  638. do_(ActorTupleT const& actor_tuple)
  639. {
  640. typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
  641. typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
  642. typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
  643. typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
  644. typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
  645. typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;
  646. typedef impl::convert_actor<6, TupleResultT, ActorTupleT> converter6;
  647. typedef impl::convert_actor<7, TupleResultT, ActorTupleT> converter7;
  648. using namespace tuple_index_names;
  649. return TupleResultT(
  650. converter0::do_(actor_tuple)
  651. , converter1::do_(actor_tuple)
  652. , converter2::do_(actor_tuple)
  653. , converter3::do_(actor_tuple)
  654. , converter4::do_(actor_tuple)
  655. , converter5::do_(actor_tuple)
  656. , converter6::do_(actor_tuple)
  657. , converter7::do_(actor_tuple)
  658. );
  659. }
  660. };
  661. };
  662. /////////////////////////////////////
  663. template <>
  664. struct convert_actors_<9>
  665. {
  666. template <typename TupleResultT, typename ActorTupleT>
  667. struct apply
  668. {
  669. static TupleResultT
  670. do_(ActorTupleT const& actor_tuple)
  671. {
  672. typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
  673. typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
  674. typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
  675. typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
  676. typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
  677. typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;
  678. typedef impl::convert_actor<6, TupleResultT, ActorTupleT> converter6;
  679. typedef impl::convert_actor<7, TupleResultT, ActorTupleT> converter7;
  680. typedef impl::convert_actor<8, TupleResultT, ActorTupleT> converter8;
  681. using namespace tuple_index_names;
  682. return TupleResultT(
  683. converter0::do_(actor_tuple)
  684. , converter1::do_(actor_tuple)
  685. , converter2::do_(actor_tuple)
  686. , converter3::do_(actor_tuple)
  687. , converter4::do_(actor_tuple)
  688. , converter5::do_(actor_tuple)
  689. , converter6::do_(actor_tuple)
  690. , converter7::do_(actor_tuple)
  691. , converter8::do_(actor_tuple)
  692. );
  693. }
  694. };
  695. };
  696. #if PHOENIX_LIMIT > 9
  697. /////////////////////////////////////
  698. template <>
  699. struct convert_actors_<10>
  700. {
  701. template <typename TupleResultT, typename ActorTupleT>
  702. struct apply
  703. {
  704. static TupleResultT
  705. do_(ActorTupleT const& actor_tuple)
  706. {
  707. typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
  708. typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
  709. typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
  710. typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
  711. typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
  712. typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;
  713. typedef impl::convert_actor<6, TupleResultT, ActorTupleT> converter6;
  714. typedef impl::convert_actor<7, TupleResultT, ActorTupleT> converter7;
  715. typedef impl::convert_actor<8, TupleResultT, ActorTupleT> converter8;
  716. typedef impl::convert_actor<9, TupleResultT, ActorTupleT> converter9;
  717. using namespace tuple_index_names;
  718. return TupleResultT(
  719. converter0::do_(actor_tuple)
  720. , converter1::do_(actor_tuple)
  721. , converter2::do_(actor_tuple)
  722. , converter3::do_(actor_tuple)
  723. , converter4::do_(actor_tuple)
  724. , converter5::do_(actor_tuple)
  725. , converter6::do_(actor_tuple)
  726. , converter7::do_(actor_tuple)
  727. , converter8::do_(actor_tuple)
  728. , converter9::do_(actor_tuple)
  729. );
  730. }
  731. };
  732. };
  733. /////////////////////////////////////
  734. template <>
  735. struct convert_actors_<11>
  736. {
  737. template <typename TupleResultT, typename ActorTupleT>
  738. struct apply
  739. {
  740. static TupleResultT
  741. do_(ActorTupleT const& actor_tuple)
  742. {
  743. typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
  744. typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
  745. typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
  746. typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
  747. typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
  748. typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;
  749. typedef impl::convert_actor<6, TupleResultT, ActorTupleT> converter6;
  750. typedef impl::convert_actor<7, TupleResultT, ActorTupleT> converter7;
  751. typedef impl::convert_actor<8, TupleResultT, ActorTupleT> converter8;
  752. typedef impl::convert_actor<9, TupleResultT, ActorTupleT> converter9;
  753. typedef impl::convert_actor<10, TupleResultT, ActorTupleT> converter10;
  754. using namespace tuple_index_names;
  755. return TupleResultT(
  756. converter0::do_(actor_tuple)
  757. , converter1::do_(actor_tuple)
  758. , converter2::do_(actor_tuple)
  759. , converter3::do_(actor_tuple)
  760. , converter4::do_(actor_tuple)
  761. , converter5::do_(actor_tuple)
  762. , converter6::do_(actor_tuple)
  763. , converter7::do_(actor_tuple)
  764. , converter8::do_(actor_tuple)
  765. , converter9::do_(actor_tuple)
  766. , converter10::do_(actor_tuple)
  767. );
  768. }
  769. };
  770. };
  771. /////////////////////////////////////
  772. template <>
  773. struct convert_actors_<12>
  774. {
  775. template <typename TupleResultT, typename ActorTupleT>
  776. struct apply
  777. {
  778. static TupleResultT
  779. do_(ActorTupleT const& actor_tuple)
  780. {
  781. typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
  782. typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
  783. typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
  784. typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
  785. typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
  786. typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;
  787. typedef impl::convert_actor<6, TupleResultT, ActorTupleT> converter6;
  788. typedef impl::convert_actor<7, TupleResultT, ActorTupleT> converter7;
  789. typedef impl::convert_actor<8, TupleResultT, ActorTupleT> converter8;
  790. typedef impl::convert_actor<9, TupleResultT, ActorTupleT> converter9;
  791. typedef impl::convert_actor<10, TupleResultT, ActorTupleT> converter10;
  792. typedef impl::convert_actor<11, TupleResultT, ActorTupleT> converter11;
  793. using namespace tuple_index_names;
  794. return TupleResultT(
  795. converter0::do_(actor_tuple)
  796. , converter1::do_(actor_tuple)
  797. , converter2::do_(actor_tuple)
  798. , converter3::do_(actor_tuple)
  799. , converter4::do_(actor_tuple)
  800. , converter5::do_(actor_tuple)
  801. , converter6::do_(actor_tuple)
  802. , converter7::do_(actor_tuple)
  803. , converter8::do_(actor_tuple)
  804. , converter9::do_(actor_tuple)
  805. , converter10::do_(actor_tuple)
  806. , converter11::do_(actor_tuple)
  807. );
  808. }
  809. };
  810. };
  811. #if PHOENIX_LIMIT > 12
  812. /////////////////////////////////////
  813. template <>
  814. struct convert_actors_<13>
  815. {
  816. template <typename TupleResultT, typename ActorTupleT>
  817. struct apply
  818. {
  819. static TupleResultT
  820. do_(ActorTupleT const& actor_tuple)
  821. {
  822. typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
  823. typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
  824. typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
  825. typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
  826. typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
  827. typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;
  828. typedef impl::convert_actor<6, TupleResultT, ActorTupleT> converter6;
  829. typedef impl::convert_actor<7, TupleResultT, ActorTupleT> converter7;
  830. typedef impl::convert_actor<8, TupleResultT, ActorTupleT> converter8;
  831. typedef impl::convert_actor<9, TupleResultT, ActorTupleT> converter9;
  832. typedef impl::convert_actor<10, TupleResultT, ActorTupleT> converter10;
  833. typedef impl::convert_actor<11, TupleResultT, ActorTupleT> converter11;
  834. typedef impl::convert_actor<12, TupleResultT, ActorTupleT> converter12;
  835. using namespace tuple_index_names;
  836. return TupleResultT(
  837. converter0::do_(actor_tuple)
  838. , converter1::do_(actor_tuple)
  839. , converter2::do_(actor_tuple)
  840. , converter3::do_(actor_tuple)
  841. , converter4::do_(actor_tuple)
  842. , converter5::do_(actor_tuple)
  843. , converter6::do_(actor_tuple)
  844. , converter7::do_(actor_tuple)
  845. , converter8::do_(actor_tuple)
  846. , converter9::do_(actor_tuple)
  847. , converter10::do_(actor_tuple)
  848. , converter11::do_(actor_tuple)
  849. , converter12::do_(actor_tuple)
  850. );
  851. }
  852. };
  853. };
  854. ///////////////////////////////////////
  855. template <>
  856. struct convert_actors_<14>
  857. {
  858. template <typename TupleResultT, typename ActorTupleT>
  859. struct apply
  860. {
  861. static TupleResultT
  862. do_(ActorTupleT const& actor_tuple)
  863. {
  864. typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
  865. typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
  866. typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
  867. typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
  868. typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
  869. typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;
  870. typedef impl::convert_actor<6, TupleResultT, ActorTupleT> converter6;
  871. typedef impl::convert_actor<7, TupleResultT, ActorTupleT> converter7;
  872. typedef impl::convert_actor<8, TupleResultT, ActorTupleT> converter8;
  873. typedef impl::convert_actor<9, TupleResultT, ActorTupleT> converter9;
  874. typedef impl::convert_actor<10, TupleResultT, ActorTupleT> converter10;
  875. typedef impl::convert_actor<11, TupleResultT, ActorTupleT> converter11;
  876. typedef impl::convert_actor<12, TupleResultT, ActorTupleT> converter12;
  877. typedef impl::convert_actor<13, TupleResultT, ActorTupleT> converter13;
  878. using namespace tuple_index_names;
  879. return TupleResultT(
  880. converter0::do_(actor_tuple)
  881. , converter1::do_(actor_tuple)
  882. , converter2::do_(actor_tuple)
  883. , converter3::do_(actor_tuple)
  884. , converter4::do_(actor_tuple)
  885. , converter5::do_(actor_tuple)
  886. , converter6::do_(actor_tuple)
  887. , converter7::do_(actor_tuple)
  888. , converter8::do_(actor_tuple)
  889. , converter9::do_(actor_tuple)
  890. , converter10::do_(actor_tuple)
  891. , converter11::do_(actor_tuple)
  892. , converter12::do_(actor_tuple)
  893. , converter13::do_(actor_tuple)
  894. );
  895. }
  896. };
  897. };
  898. ///////////////////////////////////////
  899. template <>
  900. struct convert_actors_<15>
  901. {
  902. template <typename TupleResultT, typename ActorTupleT>
  903. struct apply
  904. {
  905. static TupleResultT
  906. do_(ActorTupleT const& actor_tuple)
  907. {
  908. typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
  909. typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
  910. typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
  911. typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
  912. typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
  913. typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;
  914. typedef impl::convert_actor<6, TupleResultT, ActorTupleT> converter6;
  915. typedef impl::convert_actor<7, TupleResultT, ActorTupleT> converter7;
  916. typedef impl::convert_actor<8, TupleResultT, ActorTupleT> converter8;
  917. typedef impl::convert_actor<9, TupleResultT, ActorTupleT> converter9;
  918. typedef impl::convert_actor<10, TupleResultT, ActorTupleT> converter10;
  919. typedef impl::convert_actor<11, TupleResultT, ActorTupleT> converter11;
  920. typedef impl::convert_actor<12, TupleResultT, ActorTupleT> converter12;
  921. typedef impl::convert_actor<13, TupleResultT, ActorTupleT> converter13;
  922. typedef impl::convert_actor<14, TupleResultT, ActorTupleT> converter14;
  923. using namespace tuple_index_names;
  924. return TupleResultT(
  925. converter0::do_(actor_tuple)
  926. , converter1::do_(actor_tuple)
  927. , converter2::do_(actor_tuple)
  928. , converter3::do_(actor_tuple)
  929. , converter4::do_(actor_tuple)
  930. , converter5::do_(actor_tuple)
  931. , converter6::do_(actor_tuple)
  932. , converter7::do_(actor_tuple)
  933. , converter8::do_(actor_tuple)
  934. , converter9::do_(actor_tuple)
  935. , converter10::do_(actor_tuple)
  936. , converter11::do_(actor_tuple)
  937. , converter12::do_(actor_tuple)
  938. , converter13::do_(actor_tuple)
  939. , converter14::do_(actor_tuple)
  940. );
  941. }
  942. };
  943. };
  944. #endif
  945. #endif
  946. #endif
  947. #endif
  948. } // namespace impl
  949. ///////////////////////////////////////////////////////////////////////////////
  950. } // namespace phoenix
  951. #endif // PHOENIX_TUPLEHELPERS_HPP