tuples.hpp 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306
  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 BOOST_SPIRIT_CLASSIC_PHOENIX_TUPLES_HPP
  8. #define BOOST_SPIRIT_CLASSIC_PHOENIX_TUPLES_HPP
  9. ///////////////////////////////////////////////////////////////////////////////
  10. //
  11. // Phoenix predefined maximum limit. This limit defines the maximum
  12. // number of elements a tuple can hold. This number defaults to 3. The
  13. // actual maximum is rounded up in multiples of 3. Thus, if this value
  14. // is 4, the actual limit is 6. The ultimate maximum limit in this
  15. // implementation is 15.
  16. //
  17. ///////////////////////////////////////////////////////////////////////////////
  18. #ifndef PHOENIX_LIMIT
  19. #define PHOENIX_LIMIT 3
  20. #endif
  21. ///////////////////////////////////////////////////////////////////////////////
  22. #include <boost/static_assert.hpp>
  23. #include <boost/call_traits.hpp>
  24. #include <boost/type_traits/remove_reference.hpp>
  25. #if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
  26. #pragma warning(push)
  27. #pragma warning(disable:4512) //assignment operator could not be generated
  28. // bogus https://developercommunity.visualstudio.com/t/buggy-warning-c4709/471956
  29. #pragma warning(disable:4709) //comma operator within array index expression
  30. #endif
  31. ///////////////////////////////////////////////////////////////////////////////
  32. namespace phoenix {
  33. ///////////////////////////////////////////////////////////////////////////////
  34. //
  35. // tuple
  36. //
  37. // Tuples hold heterogeneous types up to a predefined maximum. Only
  38. // the most basic functionality needed is provided. Unlike other
  39. // recursive list-like tuple implementations, this tuple
  40. // implementation uses simple structs similar to std::pair with
  41. // specialization for 0 to N tuple elements.
  42. //
  43. // 1) Construction
  44. // Here are examples on how to construct tuples:
  45. //
  46. // typedef tuple<int, char> t1_t;
  47. // typedef tuple<int, std::string, double> t2_t;
  48. //
  49. // // this tuple has an int and char members
  50. // t1_t t1(3, 'c');
  51. //
  52. // // this tuple has an int, std::string and double members
  53. // t2_t t2(3, "hello", 3.14);
  54. //
  55. // Tuples can also be constructed from other tuples. The
  56. // source and destination tuples need not have exactly the
  57. // same element types. The only requirement is that the
  58. // source tuple have the same number of elements as the
  59. // destination and that each element slot in the
  60. // destination can be copy constructed from the source
  61. // element. For example:
  62. //
  63. // tuple<double, double> t3(t1); // OK. Compatible tuples
  64. // tuple<double, double> t4(t2); // Error! Incompatible tuples
  65. //
  66. // 2) Member access
  67. // A member in a tuple can be accessed using the
  68. // tuple's [] operator by specifying the Nth
  69. // tuple_index. Here are some examples:
  70. //
  71. // tuple_index<0> ix0; // 0th index == 1st item
  72. // tuple_index<1> ix1; // 1st index == 2nd item
  73. // tuple_index<2> ix2; // 2nd index == 3rd item
  74. //
  75. // t1[ix0] = 33; // sets the int member of the tuple t1
  76. // t2[ix2] = 6e6; // sets the double member of the tuple t2
  77. // t1[ix1] = 'a'; // sets the char member of the tuple t1
  78. //
  79. // There are some predefined names are provided in sub-
  80. // namespace tuple_index_names:
  81. //
  82. // tuple_index<0> _1;
  83. // tuple_index<1> _2;
  84. // ...
  85. // tuple_index<N> _N;
  86. //
  87. // These indexes may be used by 'using' namespace
  88. // phoenix::tuple_index_names.
  89. //
  90. // Access to out of bound indexes returns a nil_t value.
  91. //
  92. // 3) Member type inquiry
  93. // The type of an individual member can be queried.
  94. // Example:
  95. //
  96. // tuple_element<1, t2_t>::type
  97. //
  98. // Refers to the type of the second member (note zero based,
  99. // thus 0 = 1st item, 1 = 2nd item) of the tuple.
  100. //
  101. // Aside from tuple_element<N, T>::type, there are two
  102. // more types that tuple_element provides: rtype and
  103. // crtype. While 'type' is the plain underlying type,
  104. // 'rtype' is the reference type, or type& and 'crtype'
  105. // is the constant reference type or type const&. The
  106. // latter two are provided to make it easy for the
  107. // client in dealing with the possibility of reference
  108. // to reference when type is already a reference, which
  109. // is illegal in C++.
  110. //
  111. // Access to out of bound indexes returns a nil_t type.
  112. //
  113. // 4) Tuple length
  114. // The number of elements in a tuple can be queried.
  115. // Example:
  116. //
  117. // int n = t1.length;
  118. //
  119. // gets the number of elements in tuple t1.
  120. //
  121. // length is a static constant. Thus, TupleT::length
  122. // also works. Example:
  123. //
  124. // int n = t1_t::length;
  125. //
  126. ///////////////////////////////////////////////////////////////////////////////
  127. struct nil_t {};
  128. using boost::remove_reference;
  129. using boost::call_traits;
  130. //////////////////////////////////
  131. namespace impl {
  132. template <typename T>
  133. struct access {
  134. typedef const T& ctype;
  135. typedef T& type;
  136. };
  137. template <typename T>
  138. struct access<T&> {
  139. typedef T& ctype;
  140. typedef T& type;
  141. };
  142. }
  143. ///////////////////////////////////////////////////////////////////////////////
  144. //
  145. // tuple_element
  146. //
  147. // A query class that gets the Nth element inside a tuple.
  148. // Examples:
  149. //
  150. // tuple_element<1, tuple<int, char, void*> >::type // plain
  151. // tuple_element<1, tuple<int, char, void*> >::rtype // ref
  152. // tuple_element<1, tuple<int, char, void*> >::crtype // const ref
  153. //
  154. // Has type char which is the 2nd type in the tuple
  155. // (note zero based, thus 0 = 1st item, 1 = 2nd item).
  156. //
  157. // Given a tuple object, the static function tuple_element<N,
  158. // TupleT>::get(tuple) gets the Nth element in the tuple. The
  159. // tuple class' tuple::operator[] uses this to get its Nth
  160. // element.
  161. //
  162. ///////////////////////////////////////////////////////////////////////////////
  163. template <int N, typename TupleT>
  164. struct tuple_element
  165. {
  166. typedef nil_t type;
  167. typedef nil_t& rtype;
  168. typedef nil_t const& crtype;
  169. static nil_t get(TupleT const&) { return nil_t(); }
  170. };
  171. //////////////////////////////////
  172. template <typename TupleT>
  173. struct tuple_element<0, TupleT>
  174. {
  175. typedef typename TupleT::a_type type;
  176. typedef typename impl::access<type>::type rtype;
  177. typedef typename impl::access<type>::ctype crtype;
  178. static rtype get(TupleT& t) { return t.a; }
  179. static crtype get(TupleT const& t) { return t.a; }
  180. };
  181. //////////////////////////////////
  182. template <typename TupleT>
  183. struct tuple_element<1, TupleT>
  184. {
  185. typedef typename TupleT::b_type type;
  186. typedef typename impl::access<type>::type rtype;
  187. typedef typename impl::access<type>::ctype crtype;
  188. static rtype get(TupleT& t) { return t.b; }
  189. static crtype get(TupleT const& t) { return t.b; }
  190. };
  191. //////////////////////////////////
  192. template <typename TupleT>
  193. struct tuple_element<2, TupleT>
  194. {
  195. typedef typename TupleT::c_type type;
  196. typedef typename impl::access<type>::type rtype;
  197. typedef typename impl::access<type>::ctype crtype;
  198. static rtype get(TupleT& t) { return t.c; }
  199. static crtype get(TupleT const& t) { return t.c; }
  200. };
  201. #if PHOENIX_LIMIT > 3
  202. //////////////////////////////////
  203. template <typename TupleT>
  204. struct tuple_element<3, TupleT>
  205. {
  206. typedef typename TupleT::d_type type;
  207. typedef typename impl::access<type>::type rtype;
  208. typedef typename impl::access<type>::ctype crtype;
  209. static rtype get(TupleT& t) { return t.d; }
  210. static crtype get(TupleT const& t) { return t.d; }
  211. };
  212. //////////////////////////////////
  213. template <typename TupleT>
  214. struct tuple_element<4, TupleT>
  215. {
  216. typedef typename TupleT::e_type type;
  217. typedef typename impl::access<type>::type rtype;
  218. typedef typename impl::access<type>::ctype crtype;
  219. static rtype get(TupleT& t) { return t.e; }
  220. static crtype get(TupleT const& t) { return t.e; }
  221. };
  222. //////////////////////////////////
  223. template <typename TupleT>
  224. struct tuple_element<5, TupleT>
  225. {
  226. typedef typename TupleT::f_type type;
  227. typedef typename impl::access<type>::type rtype;
  228. typedef typename impl::access<type>::ctype crtype;
  229. static rtype get(TupleT& t) { return t.f; }
  230. static crtype get(TupleT const& t) { return t.f; }
  231. };
  232. #if PHOENIX_LIMIT > 6
  233. //////////////////////////////////
  234. template <typename TupleT>
  235. struct tuple_element<6, TupleT>
  236. {
  237. typedef typename TupleT::g_type type;
  238. typedef typename impl::access<type>::type rtype;
  239. typedef typename impl::access<type>::ctype crtype;
  240. static rtype get(TupleT& t) { return t.g; }
  241. static crtype get(TupleT const& t) { return t.g; }
  242. };
  243. //////////////////////////////////
  244. template <typename TupleT>
  245. struct tuple_element<7, TupleT>
  246. {
  247. typedef typename TupleT::h_type type;
  248. typedef typename impl::access<type>::type rtype;
  249. typedef typename impl::access<type>::ctype crtype;
  250. static rtype get(TupleT& t) { return t.h; }
  251. static crtype get(TupleT const& t) { return t.h; }
  252. };
  253. //////////////////////////////////
  254. template <typename TupleT>
  255. struct tuple_element<8, TupleT>
  256. {
  257. typedef typename TupleT::i_type type;
  258. typedef typename impl::access<type>::type rtype;
  259. typedef typename impl::access<type>::ctype crtype;
  260. static rtype get(TupleT& t) { return t.i; }
  261. static crtype get(TupleT const& t) { return t.i; }
  262. };
  263. #if PHOENIX_LIMIT > 9
  264. //////////////////////////////////
  265. template <typename TupleT>
  266. struct tuple_element<9, TupleT>
  267. {
  268. typedef typename TupleT::j_type type;
  269. typedef typename impl::access<type>::type rtype;
  270. typedef typename impl::access<type>::ctype crtype;
  271. static rtype get(TupleT& t) { return t.j; }
  272. static crtype get(TupleT const& t) { return t.j; }
  273. };
  274. //////////////////////////////////
  275. template <typename TupleT>
  276. struct tuple_element<10, TupleT>
  277. {
  278. typedef typename TupleT::k_type type;
  279. typedef typename impl::access<type>::type rtype;
  280. typedef typename impl::access<type>::ctype crtype;
  281. static rtype get(TupleT& t) { return t.k; }
  282. static crtype get(TupleT const& t) { return t.k; }
  283. };
  284. //////////////////////////////////
  285. template <typename TupleT>
  286. struct tuple_element<11, TupleT>
  287. {
  288. typedef typename TupleT::l_type type;
  289. typedef typename impl::access<type>::type rtype;
  290. typedef typename impl::access<type>::ctype crtype;
  291. static rtype get(TupleT& t) { return t.l; }
  292. static crtype get(TupleT const& t) { return t.l; }
  293. };
  294. #if PHOENIX_LIMIT > 12
  295. //////////////////////////////////
  296. template <typename TupleT>
  297. struct tuple_element<12, TupleT>
  298. {
  299. typedef typename TupleT::m_type type;
  300. typedef typename impl::access<type>::type rtype;
  301. typedef typename impl::access<type>::ctype crtype;
  302. static rtype get(TupleT& t) { return t.m; }
  303. static crtype get(TupleT const& t) { return t.m; }
  304. };
  305. //////////////////////////////////
  306. template <typename TupleT>
  307. struct tuple_element<13, TupleT>
  308. {
  309. typedef typename TupleT::n_type type;
  310. typedef typename impl::access<type>::type rtype;
  311. typedef typename impl::access<type>::ctype crtype;
  312. static rtype get(TupleT& t) { return t.n; }
  313. static crtype get(TupleT const& t) { return t.n; }
  314. };
  315. //////////////////////////////////
  316. template <typename TupleT>
  317. struct tuple_element<14, TupleT>
  318. {
  319. typedef typename TupleT::o_type type;
  320. typedef typename impl::access<type>::type rtype;
  321. typedef typename impl::access<type>::ctype crtype;
  322. static rtype get(TupleT& t) { return t.o; }
  323. static crtype get(TupleT const& t) { return t.o; }
  324. };
  325. #endif
  326. #endif
  327. #endif
  328. #endif
  329. ///////////////////////////////////////////////////////////////////////////////
  330. //
  331. // tuple forward declaration.
  332. //
  333. ///////////////////////////////////////////////////////////////////////////////
  334. template <
  335. typename A = nil_t
  336. , typename B = nil_t
  337. , typename C = nil_t
  338. #if PHOENIX_LIMIT > 3
  339. , typename D = nil_t
  340. , typename E = nil_t
  341. , typename F = nil_t
  342. #if PHOENIX_LIMIT > 6
  343. , typename G = nil_t
  344. , typename H = nil_t
  345. , typename I = nil_t
  346. #if PHOENIX_LIMIT > 9
  347. , typename J = nil_t
  348. , typename K = nil_t
  349. , typename L = nil_t
  350. #if PHOENIX_LIMIT > 12
  351. , typename M = nil_t
  352. , typename N = nil_t
  353. , typename O = nil_t
  354. #endif
  355. #endif
  356. #endif
  357. #endif
  358. , typename NU = nil_t // Not used
  359. >
  360. struct tuple;
  361. ///////////////////////////////////////////////////////////////////////////////
  362. //
  363. // tuple_index
  364. //
  365. // This class wraps an integer in a type to be used for indexing
  366. // the Nth element in a tuple. See tuple operator[]. Some
  367. // predefined names are provided in sub-namespace
  368. // tuple_index_names.
  369. //
  370. ///////////////////////////////////////////////////////////////////////////////
  371. template <int N>
  372. struct tuple_index {};
  373. //////////////////////////////////
  374. namespace tuple_index_names {
  375. tuple_index<0> const _1 = tuple_index<0>();
  376. tuple_index<1> const _2 = tuple_index<1>();
  377. tuple_index<2> const _3 = tuple_index<2>();
  378. #if PHOENIX_LIMIT > 3
  379. tuple_index<3> const _4 = tuple_index<3>();
  380. tuple_index<4> const _5 = tuple_index<4>();
  381. tuple_index<5> const _6 = tuple_index<5>();
  382. #if PHOENIX_LIMIT > 6
  383. tuple_index<6> const _7 = tuple_index<6>();
  384. tuple_index<7> const _8 = tuple_index<7>();
  385. tuple_index<8> const _9 = tuple_index<8>();
  386. #if PHOENIX_LIMIT > 9
  387. tuple_index<9> const _10 = tuple_index<9>();
  388. tuple_index<10> const _11 = tuple_index<10>();
  389. tuple_index<11> const _12 = tuple_index<11>();
  390. #if PHOENIX_LIMIT > 12
  391. tuple_index<12> const _13 = tuple_index<12>();
  392. tuple_index<13> const _14 = tuple_index<13>();
  393. tuple_index<14> const _15 = tuple_index<14>();
  394. #endif
  395. #endif
  396. #endif
  397. #endif
  398. }
  399. ///////////////////////////////////////////////////////////////////////////////
  400. //
  401. // tuple_common class
  402. //
  403. ///////////////////////////////////////////////////////////////////////////////
  404. template <typename DerivedT>
  405. struct tuple_base {
  406. typedef nil_t a_type;
  407. typedef nil_t b_type;
  408. typedef nil_t c_type;
  409. #if PHOENIX_LIMIT > 3
  410. typedef nil_t d_type;
  411. typedef nil_t e_type;
  412. typedef nil_t f_type;
  413. #if PHOENIX_LIMIT > 6
  414. typedef nil_t g_type;
  415. typedef nil_t h_type;
  416. typedef nil_t i_type;
  417. #if PHOENIX_LIMIT > 9
  418. typedef nil_t j_type;
  419. typedef nil_t k_type;
  420. typedef nil_t l_type;
  421. #if PHOENIX_LIMIT > 12
  422. typedef nil_t m_type;
  423. typedef nil_t n_type;
  424. typedef nil_t o_type;
  425. #endif
  426. #endif
  427. #endif
  428. #endif
  429. template <int N>
  430. typename tuple_element<N, DerivedT>::crtype
  431. operator[](tuple_index<N>) const
  432. {
  433. return tuple_element<N, DerivedT>
  434. ::get(*static_cast<DerivedT const*>(this));
  435. }
  436. template <int N>
  437. typename tuple_element<N, DerivedT>::rtype
  438. operator[](tuple_index<N>)
  439. {
  440. return tuple_element<N, DerivedT>
  441. ::get(*static_cast<DerivedT*>(this));
  442. }
  443. };
  444. ///////////////////////////////////////////////////////////////////////////////
  445. //
  446. // tuple <0 member> class
  447. //
  448. ///////////////////////////////////////////////////////////////////////////////
  449. template <>
  450. struct tuple<>
  451. : public tuple_base<tuple<> > {
  452. BOOST_STATIC_CONSTANT(int, length = 0);
  453. };
  454. ///////////////////////////////////////////////////////////////////////////////
  455. //
  456. // tuple <1 member> class
  457. //
  458. ///////////////////////////////////////////////////////////////////////////////
  459. template <typename A>
  460. struct tuple<A, nil_t, nil_t,
  461. #if PHOENIX_LIMIT > 3
  462. nil_t, nil_t, nil_t,
  463. #if PHOENIX_LIMIT > 6
  464. nil_t, nil_t, nil_t,
  465. #if PHOENIX_LIMIT > 9
  466. nil_t, nil_t, nil_t,
  467. #if PHOENIX_LIMIT > 12
  468. nil_t, nil_t, nil_t,
  469. #endif
  470. #endif
  471. #endif
  472. #endif
  473. nil_t // Unused
  474. >
  475. : public tuple_base<tuple<A> > {
  476. BOOST_STATIC_CONSTANT(int, length = 1);
  477. typedef A a_type;
  478. tuple() {}
  479. tuple(
  480. typename call_traits<A>::param_type a_
  481. ): a(a_) {}
  482. template <typename TupleT>
  483. tuple(TupleT const& init)
  484. : a(init[tuple_index<0>()])
  485. { BOOST_STATIC_ASSERT(TupleT::length == length); }
  486. A a;
  487. };
  488. ///////////////////////////////////////////////////////////////////////////////
  489. //
  490. // tuple <2 member> class
  491. //
  492. ///////////////////////////////////////////////////////////////////////////////
  493. template <typename A, typename B>
  494. struct tuple<A, B, nil_t,
  495. #if PHOENIX_LIMIT > 3
  496. nil_t, nil_t, nil_t,
  497. #if PHOENIX_LIMIT > 6
  498. nil_t, nil_t, nil_t,
  499. #if PHOENIX_LIMIT > 9
  500. nil_t, nil_t, nil_t,
  501. #if PHOENIX_LIMIT > 12
  502. nil_t, nil_t, nil_t,
  503. #endif
  504. #endif
  505. #endif
  506. #endif
  507. nil_t // Unused
  508. >
  509. : public tuple_base<tuple<A, B> > {
  510. BOOST_STATIC_CONSTANT(int, length = 2);
  511. typedef A a_type; typedef B b_type;
  512. tuple() {}
  513. tuple(
  514. typename call_traits<A>::param_type a_,
  515. typename call_traits<B>::param_type b_
  516. ): a(a_), b(b_) {}
  517. template <typename TupleT>
  518. tuple(TupleT const& init)
  519. : a(init[tuple_index<0>()]), b(init[tuple_index<1>()])
  520. { BOOST_STATIC_ASSERT(TupleT::length == length); }
  521. A a; B b;
  522. };
  523. ///////////////////////////////////////////////////////////////////////////////
  524. //
  525. // tuple <3 member> class
  526. //
  527. ///////////////////////////////////////////////////////////////////////////////
  528. template <typename A, typename B, typename C>
  529. struct tuple<A, B, C,
  530. #if PHOENIX_LIMIT > 3
  531. nil_t, nil_t, nil_t,
  532. #if PHOENIX_LIMIT > 6
  533. nil_t, nil_t, nil_t,
  534. #if PHOENIX_LIMIT > 9
  535. nil_t, nil_t, nil_t,
  536. #if PHOENIX_LIMIT > 12
  537. nil_t, nil_t, nil_t,
  538. #endif
  539. #endif
  540. #endif
  541. #endif
  542. nil_t // Unused
  543. >
  544. : public tuple_base<tuple<A, B, C> > {
  545. BOOST_STATIC_CONSTANT(int, length = 3);
  546. typedef A a_type; typedef B b_type;
  547. typedef C c_type;
  548. tuple() {}
  549. tuple(
  550. typename call_traits<A>::param_type a_,
  551. typename call_traits<B>::param_type b_,
  552. typename call_traits<C>::param_type c_
  553. ): a(a_), b(b_), c(c_) {}
  554. template <typename TupleT>
  555. tuple(TupleT const& init)
  556. : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
  557. c(init[tuple_index<2>()])
  558. { BOOST_STATIC_ASSERT(TupleT::length == length); }
  559. A a; B b; C c;
  560. };
  561. #if PHOENIX_LIMIT > 3
  562. ///////////////////////////////////////////////////////////////////////////////
  563. //
  564. // tuple <4 member> class
  565. //
  566. ///////////////////////////////////////////////////////////////////////////////
  567. template <typename A, typename B, typename C, typename D>
  568. struct tuple<A, B, C, D, nil_t, nil_t,
  569. #if PHOENIX_LIMIT > 6
  570. nil_t, nil_t, nil_t,
  571. #if PHOENIX_LIMIT > 9
  572. nil_t, nil_t, nil_t,
  573. #if PHOENIX_LIMIT > 12
  574. nil_t, nil_t, nil_t,
  575. #endif
  576. #endif
  577. #endif
  578. nil_t // Unused
  579. >
  580. : public tuple_base<tuple<A, B, C, D> > {
  581. BOOST_STATIC_CONSTANT(int, length = 4);
  582. typedef A a_type; typedef B b_type;
  583. typedef C c_type; typedef D d_type;
  584. tuple() {}
  585. tuple(
  586. typename call_traits<A>::param_type a_,
  587. typename call_traits<B>::param_type b_,
  588. typename call_traits<C>::param_type c_,
  589. typename call_traits<D>::param_type d_
  590. ): a(a_), b(b_), c(c_), d(d_) {}
  591. template <typename TupleT>
  592. tuple(TupleT const& init)
  593. : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
  594. c(init[tuple_index<2>()]), d(init[tuple_index<3>()])
  595. { BOOST_STATIC_ASSERT(TupleT::length == length); }
  596. A a; B b; C c; D d;
  597. };
  598. ///////////////////////////////////////////////////////////////////////////////
  599. //
  600. // tuple <5 member> class
  601. //
  602. ///////////////////////////////////////////////////////////////////////////////
  603. template <typename A, typename B, typename C, typename D, typename E>
  604. struct tuple<A, B, C, D, E, nil_t,
  605. #if PHOENIX_LIMIT > 6
  606. nil_t, nil_t, nil_t,
  607. #if PHOENIX_LIMIT > 9
  608. nil_t, nil_t, nil_t,
  609. #if PHOENIX_LIMIT > 12
  610. nil_t, nil_t, nil_t,
  611. #endif
  612. #endif
  613. #endif
  614. nil_t // Unused
  615. >
  616. : public tuple_base<tuple<A, B, C, D, E> > {
  617. BOOST_STATIC_CONSTANT(int, length = 5);
  618. typedef A a_type; typedef B b_type;
  619. typedef C c_type; typedef D d_type;
  620. typedef E e_type;
  621. tuple() {}
  622. tuple(
  623. typename call_traits<A>::param_type a_,
  624. typename call_traits<B>::param_type b_,
  625. typename call_traits<C>::param_type c_,
  626. typename call_traits<D>::param_type d_,
  627. typename call_traits<E>::param_type e_
  628. ): a(a_), b(b_), c(c_), d(d_), e(e_) {}
  629. template <typename TupleT>
  630. tuple(TupleT const& init)
  631. : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
  632. c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
  633. e(init[tuple_index<4>()])
  634. { BOOST_STATIC_ASSERT(TupleT::length == length); }
  635. A a; B b; C c; D d; E e;
  636. };
  637. ///////////////////////////////////////////////////////////////////////////////
  638. //
  639. // tuple <6 member> class
  640. //
  641. ///////////////////////////////////////////////////////////////////////////////
  642. template <
  643. typename A, typename B, typename C, typename D, typename E,
  644. typename F>
  645. struct tuple<A, B, C, D, E, F,
  646. #if PHOENIX_LIMIT > 6
  647. nil_t, nil_t, nil_t,
  648. #if PHOENIX_LIMIT > 9
  649. nil_t, nil_t, nil_t,
  650. #if PHOENIX_LIMIT > 12
  651. nil_t, nil_t, nil_t,
  652. #endif
  653. #endif
  654. #endif
  655. nil_t // Unused
  656. >
  657. : public tuple_base<tuple<A, B, C, D, E, F> > {
  658. BOOST_STATIC_CONSTANT(int, length = 6);
  659. typedef A a_type; typedef B b_type;
  660. typedef C c_type; typedef D d_type;
  661. typedef E e_type; typedef F f_type;
  662. tuple() {}
  663. tuple(
  664. typename call_traits<A>::param_type a_,
  665. typename call_traits<B>::param_type b_,
  666. typename call_traits<C>::param_type c_,
  667. typename call_traits<D>::param_type d_,
  668. typename call_traits<E>::param_type e_,
  669. typename call_traits<F>::param_type f_
  670. ): a(a_), b(b_), c(c_), d(d_), e(e_),
  671. f(f_) {}
  672. template <typename TupleT>
  673. tuple(TupleT const& init)
  674. : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
  675. c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
  676. e(init[tuple_index<4>()]), f(init[tuple_index<5>()])
  677. { BOOST_STATIC_ASSERT(TupleT::length == length); }
  678. A a; B b; C c; D d; E e;
  679. F f;
  680. };
  681. #if PHOENIX_LIMIT > 6
  682. ///////////////////////////////////////////////////////////////////////////////
  683. //
  684. // tuple <7 member> class
  685. //
  686. ///////////////////////////////////////////////////////////////////////////////
  687. template <
  688. typename A, typename B, typename C, typename D, typename E,
  689. typename F, typename G>
  690. struct tuple<A, B, C, D, E, F, G, nil_t, nil_t,
  691. #if PHOENIX_LIMIT > 9
  692. nil_t, nil_t, nil_t,
  693. #if PHOENIX_LIMIT > 12
  694. nil_t, nil_t, nil_t,
  695. #endif
  696. #endif
  697. nil_t // Unused
  698. >
  699. : public tuple_base<tuple<A, B, C, D, E, F, G> > {
  700. BOOST_STATIC_CONSTANT(int, length = 7);
  701. typedef A a_type; typedef B b_type;
  702. typedef C c_type; typedef D d_type;
  703. typedef E e_type; typedef F f_type;
  704. typedef G g_type;
  705. tuple() {}
  706. tuple(
  707. typename call_traits<A>::param_type a_,
  708. typename call_traits<B>::param_type b_,
  709. typename call_traits<C>::param_type c_,
  710. typename call_traits<D>::param_type d_,
  711. typename call_traits<E>::param_type e_,
  712. typename call_traits<F>::param_type f_,
  713. typename call_traits<G>::param_type g_
  714. ): a(a_), b(b_), c(c_), d(d_), e(e_),
  715. f(f_), g(g_) {}
  716. template <typename TupleT>
  717. tuple(TupleT const& init)
  718. : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
  719. c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
  720. e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
  721. g(init[tuple_index<6>()])
  722. { BOOST_STATIC_ASSERT(TupleT::length == length); }
  723. A a; B b; C c; D d; E e;
  724. F f; G g;
  725. };
  726. ///////////////////////////////////////////////////////////////////////////////
  727. //
  728. // tuple <8 member> class
  729. //
  730. ///////////////////////////////////////////////////////////////////////////////
  731. template <
  732. typename A, typename B, typename C, typename D, typename E,
  733. typename F, typename G, typename H>
  734. struct tuple<A, B, C, D, E, F, G, H, nil_t,
  735. #if PHOENIX_LIMIT > 9
  736. nil_t, nil_t, nil_t,
  737. #if PHOENIX_LIMIT > 12
  738. nil_t, nil_t, nil_t,
  739. #endif
  740. #endif
  741. nil_t // Unused
  742. >
  743. : public tuple_base<tuple<A, B, C, D, E, F, G, H> > {
  744. BOOST_STATIC_CONSTANT(int, length = 8);
  745. typedef A a_type; typedef B b_type;
  746. typedef C c_type; typedef D d_type;
  747. typedef E e_type; typedef F f_type;
  748. typedef G g_type; typedef H h_type;
  749. tuple() {}
  750. tuple(
  751. typename call_traits<A>::param_type a_,
  752. typename call_traits<B>::param_type b_,
  753. typename call_traits<C>::param_type c_,
  754. typename call_traits<D>::param_type d_,
  755. typename call_traits<E>::param_type e_,
  756. typename call_traits<F>::param_type f_,
  757. typename call_traits<G>::param_type g_,
  758. typename call_traits<H>::param_type h_
  759. ): a(a_), b(b_), c(c_), d(d_), e(e_),
  760. f(f_), g(g_), h(h_) {}
  761. template <typename TupleT>
  762. tuple(TupleT const& init)
  763. : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
  764. c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
  765. e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
  766. g(init[tuple_index<6>()]), h(init[tuple_index<7>()])
  767. { BOOST_STATIC_ASSERT(TupleT::length == length); }
  768. A a; B b; C c; D d; E e;
  769. F f; G g; H h;
  770. };
  771. ///////////////////////////////////////////////////////////////////////////////
  772. //
  773. // tuple <9 member> class
  774. //
  775. ///////////////////////////////////////////////////////////////////////////////
  776. template <
  777. typename A, typename B, typename C, typename D, typename E,
  778. typename F, typename G, typename H, typename I>
  779. struct tuple<A, B, C, D, E, F, G, H, I,
  780. #if PHOENIX_LIMIT > 9
  781. nil_t, nil_t, nil_t,
  782. #if PHOENIX_LIMIT > 12
  783. nil_t, nil_t, nil_t,
  784. #endif
  785. #endif
  786. nil_t // Unused
  787. >
  788. : public tuple_base<tuple<A, B, C, D, E, F, G, H, I> > {
  789. BOOST_STATIC_CONSTANT(int, length = 9);
  790. typedef A a_type; typedef B b_type;
  791. typedef C c_type; typedef D d_type;
  792. typedef E e_type; typedef F f_type;
  793. typedef G g_type; typedef H h_type;
  794. typedef I i_type;
  795. tuple() {}
  796. tuple(
  797. typename call_traits<A>::param_type a_,
  798. typename call_traits<B>::param_type b_,
  799. typename call_traits<C>::param_type c_,
  800. typename call_traits<D>::param_type d_,
  801. typename call_traits<E>::param_type e_,
  802. typename call_traits<F>::param_type f_,
  803. typename call_traits<G>::param_type g_,
  804. typename call_traits<H>::param_type h_,
  805. typename call_traits<I>::param_type i_
  806. ): a(a_), b(b_), c(c_), d(d_), e(e_),
  807. f(f_), g(g_), h(h_), i(i_) {}
  808. template <typename TupleT>
  809. tuple(TupleT const& init)
  810. : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
  811. c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
  812. e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
  813. g(init[tuple_index<6>()]), h(init[tuple_index<7>()]),
  814. i(init[tuple_index<8>()])
  815. { BOOST_STATIC_ASSERT(TupleT::length == length); }
  816. A a; B b; C c; D d; E e;
  817. F f; G g; H h; I i;
  818. };
  819. #if PHOENIX_LIMIT > 9
  820. ///////////////////////////////////////////////////////////////////////////////
  821. //
  822. // tuple <10 member> class
  823. //
  824. ///////////////////////////////////////////////////////////////////////////////
  825. template <
  826. typename A, typename B, typename C, typename D, typename E,
  827. typename F, typename G, typename H, typename I, typename J>
  828. struct tuple<A, B, C, D, E, F, G, H, I, J, nil_t, nil_t,
  829. #if PHOENIX_LIMIT > 12
  830. nil_t, nil_t, nil_t,
  831. #endif
  832. nil_t // Unused
  833. >
  834. : public tuple_base<tuple<A, B, C, D, E, F, G, H, I, J> > {
  835. BOOST_STATIC_CONSTANT(int, length = 10);
  836. typedef A a_type; typedef B b_type;
  837. typedef C c_type; typedef D d_type;
  838. typedef E e_type; typedef F f_type;
  839. typedef G g_type; typedef H h_type;
  840. typedef I i_type; typedef J j_type;
  841. tuple() {}
  842. tuple(
  843. typename call_traits<A>::param_type a_,
  844. typename call_traits<B>::param_type b_,
  845. typename call_traits<C>::param_type c_,
  846. typename call_traits<D>::param_type d_,
  847. typename call_traits<E>::param_type e_,
  848. typename call_traits<F>::param_type f_,
  849. typename call_traits<G>::param_type g_,
  850. typename call_traits<H>::param_type h_,
  851. typename call_traits<I>::param_type i_,
  852. typename call_traits<J>::param_type j_
  853. ): a(a_), b(b_), c(c_), d(d_), e(e_),
  854. f(f_), g(g_), h(h_), i(i_), j(j_) {}
  855. template <typename TupleT>
  856. tuple(TupleT const& init)
  857. : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
  858. c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
  859. e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
  860. g(init[tuple_index<6>()]), h(init[tuple_index<7>()]),
  861. i(init[tuple_index<8>()]), j(init[tuple_index<9>()])
  862. { BOOST_STATIC_ASSERT(TupleT::length == length); }
  863. A a; B b; C c; D d; E e;
  864. F f; G g; H h; I i; J j;
  865. };
  866. ///////////////////////////////////////////////////////////////////////////////
  867. //
  868. // tuple <11 member> class
  869. //
  870. ///////////////////////////////////////////////////////////////////////////////
  871. template <
  872. typename A, typename B, typename C, typename D, typename E,
  873. typename F, typename G, typename H, typename I, typename J,
  874. typename K>
  875. struct tuple<A, B, C, D, E, F, G, H, I, J, K, nil_t,
  876. #if PHOENIX_LIMIT > 12
  877. nil_t, nil_t, nil_t,
  878. #endif
  879. nil_t // Unused
  880. >
  881. : public tuple_base<tuple<A, B, C, D, E, F, G, H, I, J, K> > {
  882. BOOST_STATIC_CONSTANT(int, length = 11);
  883. typedef A a_type; typedef B b_type;
  884. typedef C c_type; typedef D d_type;
  885. typedef E e_type; typedef F f_type;
  886. typedef G g_type; typedef H h_type;
  887. typedef I i_type; typedef J j_type;
  888. typedef K k_type;
  889. tuple() {}
  890. tuple(
  891. typename call_traits<A>::param_type a_,
  892. typename call_traits<B>::param_type b_,
  893. typename call_traits<C>::param_type c_,
  894. typename call_traits<D>::param_type d_,
  895. typename call_traits<E>::param_type e_,
  896. typename call_traits<F>::param_type f_,
  897. typename call_traits<G>::param_type g_,
  898. typename call_traits<H>::param_type h_,
  899. typename call_traits<I>::param_type i_,
  900. typename call_traits<J>::param_type j_,
  901. typename call_traits<K>::param_type k_
  902. ): a(a_), b(b_), c(c_), d(d_), e(e_),
  903. f(f_), g(g_), h(h_), i(i_), j(j_),
  904. k(k_) {}
  905. template <typename TupleT>
  906. tuple(TupleT const& init)
  907. : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
  908. c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
  909. e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
  910. g(init[tuple_index<6>()]), h(init[tuple_index<7>()]),
  911. i(init[tuple_index<8>()]), j(init[tuple_index<9>()]),
  912. k(init[tuple_index<10>()])
  913. { BOOST_STATIC_ASSERT(TupleT::length == length); }
  914. A a; B b; C c; D d; E e;
  915. F f; G g; H h; I i; J j;
  916. K k;
  917. };
  918. ///////////////////////////////////////////////////////////////////////////////
  919. //
  920. // tuple <12 member> class
  921. //
  922. ///////////////////////////////////////////////////////////////////////////////
  923. template <
  924. typename A, typename B, typename C, typename D, typename E,
  925. typename F, typename G, typename H, typename I, typename J,
  926. typename K, typename L>
  927. struct tuple<A, B, C, D, E, F, G, H, I, J, K, L,
  928. #if PHOENIX_LIMIT > 12
  929. nil_t, nil_t, nil_t,
  930. #endif
  931. nil_t // Unused
  932. >
  933. : public tuple_base<tuple<A, B, C, D, E, F, G, H, I, J, K, L> > {
  934. BOOST_STATIC_CONSTANT(int, length = 12);
  935. typedef A a_type; typedef B b_type;
  936. typedef C c_type; typedef D d_type;
  937. typedef E e_type; typedef F f_type;
  938. typedef G g_type; typedef H h_type;
  939. typedef I i_type; typedef J j_type;
  940. typedef K k_type; typedef L l_type;
  941. tuple() {}
  942. tuple(
  943. typename call_traits<A>::param_type a_,
  944. typename call_traits<B>::param_type b_,
  945. typename call_traits<C>::param_type c_,
  946. typename call_traits<D>::param_type d_,
  947. typename call_traits<E>::param_type e_,
  948. typename call_traits<F>::param_type f_,
  949. typename call_traits<G>::param_type g_,
  950. typename call_traits<H>::param_type h_,
  951. typename call_traits<I>::param_type i_,
  952. typename call_traits<J>::param_type j_,
  953. typename call_traits<K>::param_type k_,
  954. typename call_traits<L>::param_type l_
  955. ): a(a_), b(b_), c(c_), d(d_), e(e_),
  956. f(f_), g(g_), h(h_), i(i_), j(j_),
  957. k(k_), l(l_) {}
  958. template <typename TupleT>
  959. tuple(TupleT const& init)
  960. : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
  961. c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
  962. e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
  963. g(init[tuple_index<6>()]), h(init[tuple_index<7>()]),
  964. i(init[tuple_index<8>()]), j(init[tuple_index<9>()]),
  965. k(init[tuple_index<10>()]), l(init[tuple_index<11>()])
  966. { BOOST_STATIC_ASSERT(TupleT::length == length); }
  967. A a; B b; C c; D d; E e;
  968. F f; G g; H h; I i; J j;
  969. K k; L l;
  970. };
  971. #if PHOENIX_LIMIT > 12
  972. ///////////////////////////////////////////////////////////////////////////////
  973. //
  974. // tuple <13 member> class
  975. //
  976. ///////////////////////////////////////////////////////////////////////////////
  977. template <
  978. typename A, typename B, typename C, typename D, typename E,
  979. typename F, typename G, typename H, typename I, typename J,
  980. typename K, typename L, typename M>
  981. struct tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, nil_t, nil_t, nil_t>
  982. : public tuple_base<
  983. tuple<A, B, C, D, E, F, G, H, I, J, K, L, M> > {
  984. BOOST_STATIC_CONSTANT(int, length = 13);
  985. typedef A a_type; typedef B b_type;
  986. typedef C c_type; typedef D d_type;
  987. typedef E e_type; typedef F f_type;
  988. typedef G g_type; typedef H h_type;
  989. typedef I i_type; typedef J j_type;
  990. typedef K k_type; typedef L l_type;
  991. typedef M m_type;
  992. tuple() {}
  993. tuple(
  994. typename call_traits<A>::param_type a_,
  995. typename call_traits<B>::param_type b_,
  996. typename call_traits<C>::param_type c_,
  997. typename call_traits<D>::param_type d_,
  998. typename call_traits<E>::param_type e_,
  999. typename call_traits<F>::param_type f_,
  1000. typename call_traits<G>::param_type g_,
  1001. typename call_traits<H>::param_type h_,
  1002. typename call_traits<I>::param_type i_,
  1003. typename call_traits<J>::param_type j_,
  1004. typename call_traits<K>::param_type k_,
  1005. typename call_traits<L>::param_type l_,
  1006. typename call_traits<M>::param_type m_
  1007. ): a(a_), b(b_), c(c_), d(d_), e(e_),
  1008. f(f_), g(g_), h(h_), i(i_), j(j_),
  1009. k(k_), l(l_), m(m_) {}
  1010. template <typename TupleT>
  1011. tuple(TupleT const& init)
  1012. : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
  1013. c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
  1014. e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
  1015. g(init[tuple_index<6>()]), h(init[tuple_index<7>()]),
  1016. i(init[tuple_index<8>()]), j(init[tuple_index<9>()]),
  1017. k(init[tuple_index<10>()]), l(init[tuple_index<11>()]),
  1018. m(init[tuple_index<12>()])
  1019. { BOOST_STATIC_ASSERT(TupleT::length == length); }
  1020. A a; B b; C c; D d; E e;
  1021. F f; G g; H h; I i; J j;
  1022. K k; L l; M m;
  1023. };
  1024. ///////////////////////////////////////////////////////////////////////////////
  1025. //
  1026. // tuple <14 member> class
  1027. //
  1028. ///////////////////////////////////////////////////////////////////////////////
  1029. template <
  1030. typename A, typename B, typename C, typename D, typename E,
  1031. typename F, typename G, typename H, typename I, typename J,
  1032. typename K, typename L, typename M, typename N>
  1033. struct tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N, nil_t, nil_t>
  1034. : public tuple_base<
  1035. tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N> > {
  1036. BOOST_STATIC_CONSTANT(int, length = 14);
  1037. typedef A a_type; typedef B b_type;
  1038. typedef C c_type; typedef D d_type;
  1039. typedef E e_type; typedef F f_type;
  1040. typedef G g_type; typedef H h_type;
  1041. typedef I i_type; typedef J j_type;
  1042. typedef K k_type; typedef L l_type;
  1043. typedef M m_type; typedef N n_type;
  1044. tuple() {}
  1045. tuple(
  1046. typename call_traits<A>::param_type a_,
  1047. typename call_traits<B>::param_type b_,
  1048. typename call_traits<C>::param_type c_,
  1049. typename call_traits<D>::param_type d_,
  1050. typename call_traits<E>::param_type e_,
  1051. typename call_traits<F>::param_type f_,
  1052. typename call_traits<G>::param_type g_,
  1053. typename call_traits<H>::param_type h_,
  1054. typename call_traits<I>::param_type i_,
  1055. typename call_traits<J>::param_type j_,
  1056. typename call_traits<K>::param_type k_,
  1057. typename call_traits<L>::param_type l_,
  1058. typename call_traits<M>::param_type m_,
  1059. typename call_traits<N>::param_type n_
  1060. ): a(a_), b(b_), c(c_), d(d_), e(e_),
  1061. f(f_), g(g_), h(h_), i(i_), j(j_),
  1062. k(k_), l(l_), m(m_), n(n_) {}
  1063. template <typename TupleT>
  1064. tuple(TupleT const& init)
  1065. : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
  1066. c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
  1067. e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
  1068. g(init[tuple_index<6>()]), h(init[tuple_index<7>()]),
  1069. i(init[tuple_index<8>()]), j(init[tuple_index<9>()]),
  1070. k(init[tuple_index<10>()]), l(init[tuple_index<11>()]),
  1071. m(init[tuple_index<12>()]), n(init[tuple_index<13>()])
  1072. { BOOST_STATIC_ASSERT(TupleT::length == length); }
  1073. A a; B b; C c; D d; E e;
  1074. F f; G g; H h; I i; J j;
  1075. K k; L l; M m; N n;
  1076. };
  1077. ///////////////////////////////////////////////////////////////////////////////
  1078. //
  1079. // tuple <15 member> class
  1080. //
  1081. ///////////////////////////////////////////////////////////////////////////////
  1082. template <
  1083. typename A, typename B, typename C, typename D, typename E,
  1084. typename F, typename G, typename H, typename I, typename J,
  1085. typename K, typename L, typename M, typename N, typename O>
  1086. struct tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, nil_t>
  1087. : public tuple_base<
  1088. tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O> > {
  1089. BOOST_STATIC_CONSTANT(int, length = 15);
  1090. typedef A a_type; typedef B b_type;
  1091. typedef C c_type; typedef D d_type;
  1092. typedef E e_type; typedef F f_type;
  1093. typedef G g_type; typedef H h_type;
  1094. typedef I i_type; typedef J j_type;
  1095. typedef K k_type; typedef L l_type;
  1096. typedef M m_type; typedef N n_type;
  1097. typedef O o_type;
  1098. tuple() {}
  1099. tuple(
  1100. typename call_traits<A>::param_type a_,
  1101. typename call_traits<B>::param_type b_,
  1102. typename call_traits<C>::param_type c_,
  1103. typename call_traits<D>::param_type d_,
  1104. typename call_traits<E>::param_type e_,
  1105. typename call_traits<F>::param_type f_,
  1106. typename call_traits<G>::param_type g_,
  1107. typename call_traits<H>::param_type h_,
  1108. typename call_traits<I>::param_type i_,
  1109. typename call_traits<J>::param_type j_,
  1110. typename call_traits<K>::param_type k_,
  1111. typename call_traits<L>::param_type l_,
  1112. typename call_traits<M>::param_type m_,
  1113. typename call_traits<N>::param_type n_,
  1114. typename call_traits<O>::param_type o_
  1115. ): a(a_), b(b_), c(c_), d(d_), e(e_),
  1116. f(f_), g(g_), h(h_), i(i_), j(j_),
  1117. k(k_), l(l_), m(m_), n(n_), o(o_) {}
  1118. template <typename TupleT>
  1119. tuple(TupleT const& init)
  1120. : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
  1121. c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
  1122. e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
  1123. g(init[tuple_index<6>()]), h(init[tuple_index<7>()]),
  1124. i(init[tuple_index<8>()]), j(init[tuple_index<9>()]),
  1125. k(init[tuple_index<10>()]), l(init[tuple_index<11>()]),
  1126. m(init[tuple_index<12>()]), n(init[tuple_index<13>()]),
  1127. o(init[tuple_index<14>()])
  1128. { BOOST_STATIC_ASSERT(TupleT::length == length); }
  1129. A a; B b; C c; D d; E e;
  1130. F f; G g; H h; I i; J j;
  1131. K k; L l; M m; N n; O o;
  1132. };
  1133. #endif
  1134. #endif
  1135. #endif
  1136. #endif
  1137. #if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
  1138. #pragma warning(pop)
  1139. #endif
  1140. ///////////////////////////////////////////////////////////////////////////////
  1141. } // namespace phoenix
  1142. #endif