tuples.hpp 40 KB

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