tuples.hpp 42 KB

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