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