tuples.hpp 41 KB

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