1 /*=============================================================================
3 Copyright (c) 2001-2002 Joel de Guzman
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
11 #if defined(BOOST_MSVC) && (BOOST_MSVC <= 1300)
12 #error "Sorry, Phoenix does not support VC6 and VC7. Please upgrade to at least VC7.1"
15 ///////////////////////////////////////////////////////////////////////////////
17 // Phoenix predefined maximum limit. This limit defines the maximum
18 // number of elements a tuple can hold. This number defaults to 3. The
19 // actual maximum is rounded up in multiples of 3. Thus, if this value
20 // is 4, the actual limit is 6. The ultimate maximum limit in this
21 // implementation is 15.
23 ///////////////////////////////////////////////////////////////////////////////
25 #define PHOENIX_LIMIT 3
28 #if defined(__BORLANDC__) && (__BORLANDC__ <= 0x561)
29 namespace phoenix { namespace borland_only
33 // We define these dummy template functions. Borland complains when
34 // a template class has the same name as a template function,
35 // regardless if they are in different namespaces.
37 template <typename T> void if_(T) {}
38 template <typename T> void for_(T) {}
39 template <typename T> void while_(T) {}
40 template <typename T> void do_(T) {}
45 // We define these dummy template functions. Borland complains when
46 // a template class has the same name as a template function,
47 // regardless if they are in different namespaces.
49 template <typename T> struct if_ {};
50 template <typename T> struct for_ {};
51 template <typename T> struct while_ {};
52 template <typename T> struct do_ {};
55 }} // namespace phoenix::borland_only
58 ///////////////////////////////////////////////////////////////////////////////
59 #include <boost/static_assert.hpp>
60 #include <boost/call_traits.hpp>
61 #include <boost/type_traits/remove_reference.hpp>
63 #if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
65 #pragma warning(disable:4512) //assignment operator could not be generated
68 ///////////////////////////////////////////////////////////////////////////////
71 ///////////////////////////////////////////////////////////////////////////////
75 // Tuples hold heterogeneous types up to a predefined maximum. Only
76 // the most basic functionality needed is provided. Unlike other
77 // recursive list-like tuple implementations, this tuple
78 // implementation uses simple structs similar to std::pair with
79 // specialization for 0 to N tuple elements.
82 // Here are examples on how to construct tuples:
84 // typedef tuple<int, char> t1_t;
85 // typedef tuple<int, std::string, double> t2_t;
87 // // this tuple has an int and char members
90 // // this tuple has an int, std::string and double members
91 // t2_t t2(3, "hello", 3.14);
93 // Tuples can also be constructed from other tuples. The
94 // source and destination tuples need not have exactly the
95 // same element types. The only requirement is that the
96 // source tuple have the same number of elements as the
97 // destination and that each element slot in the
98 // destination can be copy constructed from the source
99 // element. For example:
101 // tuple<double, double> t3(t1); // OK. Compatible tuples
102 // tuple<double, double> t4(t2); // Error! Incompatible tuples
105 // A member in a tuple can be accessed using the
106 // tuple's [] operator by specifying the Nth
107 // tuple_index. Here are some examples:
109 // tuple_index<0> ix0; // 0th index == 1st item
110 // tuple_index<1> ix1; // 1st index == 2nd item
111 // tuple_index<2> ix2; // 2nd index == 3rd item
113 // t1[ix0] = 33; // sets the int member of the tuple t1
114 // t2[ix2] = 6e6; // sets the double member of the tuple t2
115 // t1[ix1] = 'a'; // sets the char member of the tuple t1
117 // There are some predefined names are provided in sub-
118 // namespace tuple_index_names:
120 // tuple_index<0> _1;
121 // tuple_index<1> _2;
123 // tuple_index<N> _N;
125 // These indexes may be used by 'using' namespace
126 // phoenix::tuple_index_names.
128 // Access to out of bound indexes returns a nil_t value.
130 // 3) Member type inquiry
131 // The type of an individual member can be queried.
134 // tuple_element<1, t2_t>::type
136 // Refers to the type of the second member (note zero based,
137 // thus 0 = 1st item, 1 = 2nd item) of the tuple.
139 // Aside from tuple_element<N, T>::type, there are two
140 // more types that tuple_element provides: rtype and
141 // crtype. While 'type' is the plain underlying type,
142 // 'rtype' is the reference type, or type& and 'crtype'
143 // is the constant reference type or type const&. The
144 // latter two are provided to make it easy for the
145 // client in dealing with the possibility of reference
146 // to reference when type is already a reference, which
147 // is illegal in C++.
149 // Access to out of bound indexes returns a nil_t type.
152 // The number of elements in a tuple can be queried.
155 // int n = t1.length;
157 // gets the number of elements in tuple t1.
159 // length is a static constant. Thus, TupleT::length
160 // also works. Example:
162 // int n = t1_t::length;
164 ///////////////////////////////////////////////////////////////////////////////
166 using boost::remove_reference;
167 using boost::call_traits;
169 //////////////////////////////////
172 template <typename T>
175 typedef const T& ctype;
179 template <typename T>
187 ///////////////////////////////////////////////////////////////////////////////
191 // A query class that gets the Nth element inside a tuple.
194 // tuple_element<1, tuple<int, char, void*> >::type // plain
195 // tuple_element<1, tuple<int, char, void*> >::rtype // ref
196 // tuple_element<1, tuple<int, char, void*> >::crtype // const ref
198 // Has type char which is the 2nd type in the tuple
199 // (note zero based, thus 0 = 1st item, 1 = 2nd item).
201 // Given a tuple object, the static function tuple_element<N,
202 // TupleT>::get(tuple) gets the Nth element in the tuple. The
203 // tuple class' tuple::operator[] uses this to get its Nth
206 ///////////////////////////////////////////////////////////////////////////////
207 template <int N, typename TupleT>
211 typedef nil_t& rtype;
212 typedef nil_t const& crtype;
214 static nil_t get(TupleT const& t) { return nil_t(); }
217 //////////////////////////////////
218 template <typename TupleT>
219 struct tuple_element<0, TupleT>
221 typedef typename TupleT::a_type type;
222 typedef typename impl::access<type>::type rtype;
223 typedef typename impl::access<type>::ctype crtype;
225 static rtype get(TupleT& t) { return t.a; }
226 static crtype get(TupleT const& t) { return t.a; }
229 //////////////////////////////////
230 template <typename TupleT>
231 struct tuple_element<1, TupleT>
233 typedef typename TupleT::b_type type;
234 typedef typename impl::access<type>::type rtype;
235 typedef typename impl::access<type>::ctype crtype;
237 static rtype get(TupleT& t) { return t.b; }
238 static crtype get(TupleT const& t) { return t.b; }
241 //////////////////////////////////
242 template <typename TupleT>
243 struct tuple_element<2, TupleT>
245 typedef typename TupleT::c_type type;
246 typedef typename impl::access<type>::type rtype;
247 typedef typename impl::access<type>::ctype crtype;
249 static rtype get(TupleT& t) { return t.c; }
250 static crtype get(TupleT const& t) { return t.c; }
253 #if PHOENIX_LIMIT > 3
254 //////////////////////////////////
255 template <typename TupleT>
256 struct tuple_element<3, TupleT>
258 typedef typename TupleT::d_type type;
259 typedef typename impl::access<type>::type rtype;
260 typedef typename impl::access<type>::ctype crtype;
262 static rtype get(TupleT& t) { return t.d; }
263 static crtype get(TupleT const& t) { return t.d; }
266 //////////////////////////////////
267 template <typename TupleT>
268 struct tuple_element<4, TupleT>
270 typedef typename TupleT::e_type type;
271 typedef typename impl::access<type>::type rtype;
272 typedef typename impl::access<type>::ctype crtype;
274 static rtype get(TupleT& t) { return t.e; }
275 static crtype get(TupleT const& t) { return t.e; }
278 //////////////////////////////////
279 template <typename TupleT>
280 struct tuple_element<5, TupleT>
282 typedef typename TupleT::f_type type;
283 typedef typename impl::access<type>::type rtype;
284 typedef typename impl::access<type>::ctype crtype;
286 static rtype get(TupleT& t) { return t.f; }
287 static crtype get(TupleT const& t) { return t.f; }
290 #if PHOENIX_LIMIT > 6
291 //////////////////////////////////
292 template <typename TupleT>
293 struct tuple_element<6, TupleT>
295 typedef typename TupleT::g_type type;
296 typedef typename impl::access<type>::type rtype;
297 typedef typename impl::access<type>::ctype crtype;
299 static rtype get(TupleT& t) { return t.g; }
300 static crtype get(TupleT const& t) { return t.g; }
303 //////////////////////////////////
304 template <typename TupleT>
305 struct tuple_element<7, TupleT>
307 typedef typename TupleT::h_type type;
308 typedef typename impl::access<type>::type rtype;
309 typedef typename impl::access<type>::ctype crtype;
311 static rtype get(TupleT& t) { return t.h; }
312 static crtype get(TupleT const& t) { return t.h; }
315 //////////////////////////////////
316 template <typename TupleT>
317 struct tuple_element<8, TupleT>
319 typedef typename TupleT::i_type type;
320 typedef typename impl::access<type>::type rtype;
321 typedef typename impl::access<type>::ctype crtype;
323 static rtype get(TupleT& t) { return t.i; }
324 static crtype get(TupleT const& t) { return t.i; }
327 #if PHOENIX_LIMIT > 9
328 //////////////////////////////////
329 template <typename TupleT>
330 struct tuple_element<9, TupleT>
332 typedef typename TupleT::j_type type;
333 typedef typename impl::access<type>::type rtype;
334 typedef typename impl::access<type>::ctype crtype;
336 static rtype get(TupleT& t) { return t.j; }
337 static crtype get(TupleT const& t) { return t.j; }
340 //////////////////////////////////
341 template <typename TupleT>
342 struct tuple_element<10, TupleT>
344 typedef typename TupleT::k_type type;
345 typedef typename impl::access<type>::type rtype;
346 typedef typename impl::access<type>::ctype crtype;
348 static rtype get(TupleT& t) { return t.k; }
349 static crtype get(TupleT const& t) { return t.k; }
352 //////////////////////////////////
353 template <typename TupleT>
354 struct tuple_element<11, TupleT>
356 typedef typename TupleT::l_type type;
357 typedef typename impl::access<type>::type rtype;
358 typedef typename impl::access<type>::ctype crtype;
360 static rtype get(TupleT& t) { return t.l; }
361 static crtype get(TupleT const& t) { return t.l; }
364 #if PHOENIX_LIMIT > 12
365 //////////////////////////////////
366 template <typename TupleT>
367 struct tuple_element<12, TupleT>
369 typedef typename TupleT::m_type type;
370 typedef typename impl::access<type>::type rtype;
371 typedef typename impl::access<type>::ctype crtype;
373 static rtype get(TupleT& t) { return t.m; }
374 static crtype get(TupleT const& t) { return t.m; }
377 //////////////////////////////////
378 template <typename TupleT>
379 struct tuple_element<13, TupleT>
381 typedef typename TupleT::n_type type;
382 typedef typename impl::access<type>::type rtype;
383 typedef typename impl::access<type>::ctype crtype;
385 static rtype get(TupleT& t) { return t.n; }
386 static crtype get(TupleT const& t) { return t.n; }
389 //////////////////////////////////
390 template <typename TupleT>
391 struct tuple_element<14, TupleT>
393 typedef typename TupleT::o_type type;
394 typedef typename impl::access<type>::type rtype;
395 typedef typename impl::access<type>::ctype crtype;
397 static rtype get(TupleT& t) { return t.o; }
398 static crtype get(TupleT const& t) { return t.o; }
406 ///////////////////////////////////////////////////////////////////////////////
408 // tuple forward declaration.
410 ///////////////////////////////////////////////////////////////////////////////
416 #if PHOENIX_LIMIT > 3
421 #if PHOENIX_LIMIT > 6
426 #if PHOENIX_LIMIT > 9
431 #if PHOENIX_LIMIT > 12
441 , typename NU = nil_t // Not used
445 ///////////////////////////////////////////////////////////////////////////////
449 // This class wraps an integer in a type to be used for indexing
450 // the Nth element in a tuple. See tuple operator[]. Some
451 // predefined names are provided in sub-namespace
452 // tuple_index_names.
454 ///////////////////////////////////////////////////////////////////////////////
456 struct tuple_index {};
458 //////////////////////////////////
459 namespace tuple_index_names {
461 tuple_index<0> const _1 = tuple_index<0>();
462 tuple_index<1> const _2 = tuple_index<1>();
463 tuple_index<2> const _3 = tuple_index<2>();
465 #if PHOENIX_LIMIT > 3
466 tuple_index<3> const _4 = tuple_index<3>();
467 tuple_index<4> const _5 = tuple_index<4>();
468 tuple_index<5> const _6 = tuple_index<5>();
470 #if PHOENIX_LIMIT > 6
471 tuple_index<6> const _7 = tuple_index<6>();
472 tuple_index<7> const _8 = tuple_index<7>();
473 tuple_index<8> const _9 = tuple_index<8>();
475 #if PHOENIX_LIMIT > 9
476 tuple_index<9> const _10 = tuple_index<9>();
477 tuple_index<10> const _11 = tuple_index<10>();
478 tuple_index<11> const _12 = tuple_index<11>();
480 #if PHOENIX_LIMIT > 12
481 tuple_index<12> const _13 = tuple_index<12>();
482 tuple_index<13> const _14 = tuple_index<13>();
483 tuple_index<14> const _15 = tuple_index<14>();
491 ///////////////////////////////////////////////////////////////////////////////
493 // tuple_common class
495 ///////////////////////////////////////////////////////////////////////////////
496 template <typename DerivedT>
499 typedef nil_t a_type;
500 typedef nil_t b_type;
501 typedef nil_t c_type;
503 #if PHOENIX_LIMIT > 3
504 typedef nil_t d_type;
505 typedef nil_t e_type;
506 typedef nil_t f_type;
508 #if PHOENIX_LIMIT > 6
509 typedef nil_t g_type;
510 typedef nil_t h_type;
511 typedef nil_t i_type;
513 #if PHOENIX_LIMIT > 9
514 typedef nil_t j_type;
515 typedef nil_t k_type;
516 typedef nil_t l_type;
518 #if PHOENIX_LIMIT > 12
519 typedef nil_t m_type;
520 typedef nil_t n_type;
521 typedef nil_t o_type;
529 typename tuple_element<N, DerivedT>::crtype
530 operator[](tuple_index<N>) const
532 return tuple_element<N, DerivedT>
533 ::get(*static_cast<DerivedT const*>(this));
537 typename tuple_element<N, DerivedT>::rtype
538 operator[](tuple_index<N>)
540 return tuple_element<N, DerivedT>
541 ::get(*static_cast<DerivedT*>(this));
545 ///////////////////////////////////////////////////////////////////////////////
547 // tuple <0 member> class
549 ///////////////////////////////////////////////////////////////////////////////
552 : public tuple_base<tuple<> > {
554 BOOST_STATIC_CONSTANT(int, length = 0);
557 ///////////////////////////////////////////////////////////////////////////////
559 // tuple <1 member> class
561 ///////////////////////////////////////////////////////////////////////////////
562 template <typename A>
563 struct tuple<A, nil_t, nil_t,
564 #if PHOENIX_LIMIT > 3
566 #if PHOENIX_LIMIT > 6
568 #if PHOENIX_LIMIT > 9
570 #if PHOENIX_LIMIT > 12
578 : public tuple_base<tuple<A> > {
580 BOOST_STATIC_CONSTANT(int, length = 1);
586 typename call_traits<A>::param_type a_
589 template <typename TupleT>
590 tuple(TupleT const& init)
591 : a(init[tuple_index<0>()])
592 { BOOST_STATIC_ASSERT(TupleT::length == length); }
597 ///////////////////////////////////////////////////////////////////////////////
599 // tuple <2 member> class
601 ///////////////////////////////////////////////////////////////////////////////
602 template <typename A, typename B>
603 struct tuple<A, B, nil_t,
604 #if PHOENIX_LIMIT > 3
606 #if PHOENIX_LIMIT > 6
608 #if PHOENIX_LIMIT > 9
610 #if PHOENIX_LIMIT > 12
618 : public tuple_base<tuple<A, B> > {
620 BOOST_STATIC_CONSTANT(int, length = 2);
621 typedef A a_type; typedef B b_type;
626 typename call_traits<A>::param_type a_,
627 typename call_traits<B>::param_type b_
630 template <typename TupleT>
631 tuple(TupleT const& init)
632 : a(init[tuple_index<0>()]), b(init[tuple_index<1>()])
633 { BOOST_STATIC_ASSERT(TupleT::length == length); }
638 ///////////////////////////////////////////////////////////////////////////////
640 // tuple <3 member> class
642 ///////////////////////////////////////////////////////////////////////////////
643 template <typename A, typename B, typename C>
644 struct tuple<A, B, C,
645 #if PHOENIX_LIMIT > 3
647 #if PHOENIX_LIMIT > 6
649 #if PHOENIX_LIMIT > 9
651 #if PHOENIX_LIMIT > 12
659 : public tuple_base<tuple<A, B, C> > {
661 BOOST_STATIC_CONSTANT(int, length = 3);
662 typedef A a_type; typedef B b_type;
668 typename call_traits<A>::param_type a_,
669 typename call_traits<B>::param_type b_,
670 typename call_traits<C>::param_type c_
671 ): a(a_), b(b_), c(c_) {}
673 template <typename TupleT>
674 tuple(TupleT const& init)
675 : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
676 c(init[tuple_index<2>()])
677 { BOOST_STATIC_ASSERT(TupleT::length == length); }
682 #if PHOENIX_LIMIT > 3
683 ///////////////////////////////////////////////////////////////////////////////
685 // tuple <4 member> class
687 ///////////////////////////////////////////////////////////////////////////////
688 template <typename A, typename B, typename C, typename D>
689 struct tuple<A, B, C, D, nil_t, nil_t,
690 #if PHOENIX_LIMIT > 6
692 #if PHOENIX_LIMIT > 9
694 #if PHOENIX_LIMIT > 12
701 : public tuple_base<tuple<A, B, C, D> > {
703 BOOST_STATIC_CONSTANT(int, length = 4);
704 typedef A a_type; typedef B b_type;
705 typedef C c_type; typedef D d_type;
710 typename call_traits<A>::param_type a_,
711 typename call_traits<B>::param_type b_,
712 typename call_traits<C>::param_type c_,
713 typename call_traits<D>::param_type d_
714 ): a(a_), b(b_), c(c_), d(d_) {}
716 template <typename TupleT>
717 tuple(TupleT const& init)
718 : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
719 c(init[tuple_index<2>()]), d(init[tuple_index<3>()])
720 { BOOST_STATIC_ASSERT(TupleT::length == length); }
725 ///////////////////////////////////////////////////////////////////////////////
727 // tuple <5 member> class
729 ///////////////////////////////////////////////////////////////////////////////
730 template <typename A, typename B, typename C, typename D, typename E>
731 struct tuple<A, B, C, D, E, nil_t,
732 #if PHOENIX_LIMIT > 6
734 #if PHOENIX_LIMIT > 9
736 #if PHOENIX_LIMIT > 12
743 : public tuple_base<tuple<A, B, C, D, E> > {
745 BOOST_STATIC_CONSTANT(int, length = 5);
746 typedef A a_type; typedef B b_type;
747 typedef C c_type; typedef D d_type;
753 typename call_traits<A>::param_type a_,
754 typename call_traits<B>::param_type b_,
755 typename call_traits<C>::param_type c_,
756 typename call_traits<D>::param_type d_,
757 typename call_traits<E>::param_type e_
758 ): a(a_), b(b_), c(c_), d(d_), e(e_) {}
760 template <typename TupleT>
761 tuple(TupleT const& init)
762 : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
763 c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
764 e(init[tuple_index<4>()])
765 { BOOST_STATIC_ASSERT(TupleT::length == length); }
767 A a; B b; C c; D d; E e;
770 ///////////////////////////////////////////////////////////////////////////////
772 // tuple <6 member> class
774 ///////////////////////////////////////////////////////////////////////////////
776 typename A, typename B, typename C, typename D, typename E,
778 struct tuple<A, B, C, D, E, F,
779 #if PHOENIX_LIMIT > 6
781 #if PHOENIX_LIMIT > 9
783 #if PHOENIX_LIMIT > 12
790 : public tuple_base<tuple<A, B, C, D, E, F> > {
792 BOOST_STATIC_CONSTANT(int, length = 6);
793 typedef A a_type; typedef B b_type;
794 typedef C c_type; typedef D d_type;
795 typedef E e_type; typedef F f_type;
800 typename call_traits<A>::param_type a_,
801 typename call_traits<B>::param_type b_,
802 typename call_traits<C>::param_type c_,
803 typename call_traits<D>::param_type d_,
804 typename call_traits<E>::param_type e_,
805 typename call_traits<F>::param_type f_
806 ): a(a_), b(b_), c(c_), d(d_), e(e_),
809 template <typename TupleT>
810 tuple(TupleT const& init)
811 : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
812 c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
813 e(init[tuple_index<4>()]), f(init[tuple_index<5>()])
814 { BOOST_STATIC_ASSERT(TupleT::length == length); }
816 A a; B b; C c; D d; E e;
820 #if PHOENIX_LIMIT > 6
821 ///////////////////////////////////////////////////////////////////////////////
823 // tuple <7 member> class
825 ///////////////////////////////////////////////////////////////////////////////
827 typename A, typename B, typename C, typename D, typename E,
828 typename F, typename G>
829 struct tuple<A, B, C, D, E, F, G, nil_t, nil_t,
830 #if PHOENIX_LIMIT > 9
832 #if PHOENIX_LIMIT > 12
838 : public tuple_base<tuple<A, B, C, D, E, F, G> > {
840 BOOST_STATIC_CONSTANT(int, length = 7);
841 typedef A a_type; typedef B b_type;
842 typedef C c_type; typedef D d_type;
843 typedef E e_type; typedef F f_type;
849 typename call_traits<A>::param_type a_,
850 typename call_traits<B>::param_type b_,
851 typename call_traits<C>::param_type c_,
852 typename call_traits<D>::param_type d_,
853 typename call_traits<E>::param_type e_,
854 typename call_traits<F>::param_type f_,
855 typename call_traits<G>::param_type g_
856 ): a(a_), b(b_), c(c_), d(d_), e(e_),
859 template <typename TupleT>
860 tuple(TupleT const& init)
861 : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
862 c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
863 e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
864 g(init[tuple_index<6>()])
865 { BOOST_STATIC_ASSERT(TupleT::length == length); }
867 A a; B b; C c; D d; E e;
871 ///////////////////////////////////////////////////////////////////////////////
873 // tuple <8 member> class
875 ///////////////////////////////////////////////////////////////////////////////
877 typename A, typename B, typename C, typename D, typename E,
878 typename F, typename G, typename H>
879 struct tuple<A, B, C, D, E, F, G, H, nil_t,
880 #if PHOENIX_LIMIT > 9
882 #if PHOENIX_LIMIT > 12
888 : public tuple_base<tuple<A, B, C, D, E, F, G, H> > {
890 BOOST_STATIC_CONSTANT(int, length = 8);
891 typedef A a_type; typedef B b_type;
892 typedef C c_type; typedef D d_type;
893 typedef E e_type; typedef F f_type;
894 typedef G g_type; typedef H h_type;
899 typename call_traits<A>::param_type a_,
900 typename call_traits<B>::param_type b_,
901 typename call_traits<C>::param_type c_,
902 typename call_traits<D>::param_type d_,
903 typename call_traits<E>::param_type e_,
904 typename call_traits<F>::param_type f_,
905 typename call_traits<G>::param_type g_,
906 typename call_traits<H>::param_type h_
907 ): a(a_), b(b_), c(c_), d(d_), e(e_),
908 f(f_), g(g_), h(h_) {}
910 template <typename TupleT>
911 tuple(TupleT const& init)
912 : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
913 c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
914 e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
915 g(init[tuple_index<6>()]), h(init[tuple_index<7>()])
916 { BOOST_STATIC_ASSERT(TupleT::length == length); }
918 A a; B b; C c; D d; E e;
922 ///////////////////////////////////////////////////////////////////////////////
924 // tuple <9 member> class
926 ///////////////////////////////////////////////////////////////////////////////
928 typename A, typename B, typename C, typename D, typename E,
929 typename F, typename G, typename H, typename I>
930 struct tuple<A, B, C, D, E, F, G, H, I,
931 #if PHOENIX_LIMIT > 9
933 #if PHOENIX_LIMIT > 12
939 : public tuple_base<tuple<A, B, C, D, E, F, G, H, I> > {
941 BOOST_STATIC_CONSTANT(int, length = 9);
942 typedef A a_type; typedef B b_type;
943 typedef C c_type; typedef D d_type;
944 typedef E e_type; typedef F f_type;
945 typedef G g_type; typedef H h_type;
951 typename call_traits<A>::param_type a_,
952 typename call_traits<B>::param_type b_,
953 typename call_traits<C>::param_type c_,
954 typename call_traits<D>::param_type d_,
955 typename call_traits<E>::param_type e_,
956 typename call_traits<F>::param_type f_,
957 typename call_traits<G>::param_type g_,
958 typename call_traits<H>::param_type h_,
959 typename call_traits<I>::param_type i_
960 ): a(a_), b(b_), c(c_), d(d_), e(e_),
961 f(f_), g(g_), h(h_), i(i_) {}
963 template <typename TupleT>
964 tuple(TupleT const& init)
965 : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
966 c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
967 e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
968 g(init[tuple_index<6>()]), h(init[tuple_index<7>()]),
969 i(init[tuple_index<8>()])
970 { BOOST_STATIC_ASSERT(TupleT::length == length); }
972 A a; B b; C c; D d; E e;
976 #if PHOENIX_LIMIT > 9
977 ///////////////////////////////////////////////////////////////////////////////
979 // tuple <10 member> class
981 ///////////////////////////////////////////////////////////////////////////////
983 typename A, typename B, typename C, typename D, typename E,
984 typename F, typename G, typename H, typename I, typename J>
985 struct tuple<A, B, C, D, E, F, G, H, I, J, nil_t, nil_t,
986 #if PHOENIX_LIMIT > 12
991 : public tuple_base<tuple<A, B, C, D, E, F, G, H, I, J> > {
993 BOOST_STATIC_CONSTANT(int, length = 10);
994 typedef A a_type; typedef B b_type;
995 typedef C c_type; typedef D d_type;
996 typedef E e_type; typedef F f_type;
997 typedef G g_type; typedef H h_type;
998 typedef I i_type; typedef J j_type;
1003 typename call_traits<A>::param_type a_,
1004 typename call_traits<B>::param_type b_,
1005 typename call_traits<C>::param_type c_,
1006 typename call_traits<D>::param_type d_,
1007 typename call_traits<E>::param_type e_,
1008 typename call_traits<F>::param_type f_,
1009 typename call_traits<G>::param_type g_,
1010 typename call_traits<H>::param_type h_,
1011 typename call_traits<I>::param_type i_,
1012 typename call_traits<J>::param_type j_
1013 ): a(a_), b(b_), c(c_), d(d_), e(e_),
1014 f(f_), g(g_), h(h_), i(i_), j(j_) {}
1016 template <typename TupleT>
1017 tuple(TupleT const& init)
1018 : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
1019 c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
1020 e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
1021 g(init[tuple_index<6>()]), h(init[tuple_index<7>()]),
1022 i(init[tuple_index<8>()]), j(init[tuple_index<9>()])
1023 { BOOST_STATIC_ASSERT(TupleT::length == length); }
1025 A a; B b; C c; D d; E e;
1026 F f; G g; H h; I i; J j;
1029 ///////////////////////////////////////////////////////////////////////////////
1031 // tuple <11 member> class
1033 ///////////////////////////////////////////////////////////////////////////////
1035 typename A, typename B, typename C, typename D, typename E,
1036 typename F, typename G, typename H, typename I, typename J,
1038 struct tuple<A, B, C, D, E, F, G, H, I, J, K, nil_t,
1039 #if PHOENIX_LIMIT > 12
1040 nil_t, nil_t, nil_t,
1044 : public tuple_base<tuple<A, B, C, D, E, F, G, H, I, J, K> > {
1046 BOOST_STATIC_CONSTANT(int, length = 11);
1047 typedef A a_type; typedef B b_type;
1048 typedef C c_type; typedef D d_type;
1049 typedef E e_type; typedef F f_type;
1050 typedef G g_type; typedef H h_type;
1051 typedef I i_type; typedef J j_type;
1057 typename call_traits<A>::param_type a_,
1058 typename call_traits<B>::param_type b_,
1059 typename call_traits<C>::param_type c_,
1060 typename call_traits<D>::param_type d_,
1061 typename call_traits<E>::param_type e_,
1062 typename call_traits<F>::param_type f_,
1063 typename call_traits<G>::param_type g_,
1064 typename call_traits<H>::param_type h_,
1065 typename call_traits<I>::param_type i_,
1066 typename call_traits<J>::param_type j_,
1067 typename call_traits<K>::param_type k_
1068 ): a(a_), b(b_), c(c_), d(d_), e(e_),
1069 f(f_), g(g_), h(h_), i(i_), j(j_),
1072 template <typename TupleT>
1073 tuple(TupleT const& init)
1074 : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
1075 c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
1076 e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
1077 g(init[tuple_index<6>()]), h(init[tuple_index<7>()]),
1078 i(init[tuple_index<8>()]), j(init[tuple_index<9>()]),
1079 k(init[tuple_index<10>()])
1080 { BOOST_STATIC_ASSERT(TupleT::length == length); }
1082 A a; B b; C c; D d; E e;
1083 F f; G g; H h; I i; J j;
1087 ///////////////////////////////////////////////////////////////////////////////
1089 // tuple <12 member> class
1091 ///////////////////////////////////////////////////////////////////////////////
1093 typename A, typename B, typename C, typename D, typename E,
1094 typename F, typename G, typename H, typename I, typename J,
1095 typename K, typename L>
1096 struct tuple<A, B, C, D, E, F, G, H, I, J, K, L,
1097 #if PHOENIX_LIMIT > 12
1098 nil_t, nil_t, nil_t,
1102 : public tuple_base<tuple<A, B, C, D, E, F, G, H, I, J, K, L> > {
1104 BOOST_STATIC_CONSTANT(int, length = 12);
1105 typedef A a_type; typedef B b_type;
1106 typedef C c_type; typedef D d_type;
1107 typedef E e_type; typedef F f_type;
1108 typedef G g_type; typedef H h_type;
1109 typedef I i_type; typedef J j_type;
1110 typedef K k_type; typedef L l_type;
1115 typename call_traits<A>::param_type a_,
1116 typename call_traits<B>::param_type b_,
1117 typename call_traits<C>::param_type c_,
1118 typename call_traits<D>::param_type d_,
1119 typename call_traits<E>::param_type e_,
1120 typename call_traits<F>::param_type f_,
1121 typename call_traits<G>::param_type g_,
1122 typename call_traits<H>::param_type h_,
1123 typename call_traits<I>::param_type i_,
1124 typename call_traits<J>::param_type j_,
1125 typename call_traits<K>::param_type k_,
1126 typename call_traits<L>::param_type l_
1127 ): a(a_), b(b_), c(c_), d(d_), e(e_),
1128 f(f_), g(g_), h(h_), i(i_), j(j_),
1131 template <typename TupleT>
1132 tuple(TupleT const& init)
1133 : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
1134 c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
1135 e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
1136 g(init[tuple_index<6>()]), h(init[tuple_index<7>()]),
1137 i(init[tuple_index<8>()]), j(init[tuple_index<9>()]),
1138 k(init[tuple_index<10>()]), l(init[tuple_index<11>()])
1139 { BOOST_STATIC_ASSERT(TupleT::length == length); }
1141 A a; B b; C c; D d; E e;
1142 F f; G g; H h; I i; J j;
1146 #if PHOENIX_LIMIT > 12
1147 ///////////////////////////////////////////////////////////////////////////////
1149 // tuple <13 member> class
1151 ///////////////////////////////////////////////////////////////////////////////
1153 typename A, typename B, typename C, typename D, typename E,
1154 typename F, typename G, typename H, typename I, typename J,
1155 typename K, typename L, typename M>
1156 struct tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, nil_t, nil_t, nil_t>
1157 : public tuple_base<
1158 tuple<A, B, C, D, E, F, G, H, I, J, K, L, M> > {
1160 BOOST_STATIC_CONSTANT(int, length = 13);
1161 typedef A a_type; typedef B b_type;
1162 typedef C c_type; typedef D d_type;
1163 typedef E e_type; typedef F f_type;
1164 typedef G g_type; typedef H h_type;
1165 typedef I i_type; typedef J j_type;
1166 typedef K k_type; typedef L l_type;
1172 typename call_traits<A>::param_type a_,
1173 typename call_traits<B>::param_type b_,
1174 typename call_traits<C>::param_type c_,
1175 typename call_traits<D>::param_type d_,
1176 typename call_traits<E>::param_type e_,
1177 typename call_traits<F>::param_type f_,
1178 typename call_traits<G>::param_type g_,
1179 typename call_traits<H>::param_type h_,
1180 typename call_traits<I>::param_type i_,
1181 typename call_traits<J>::param_type j_,
1182 typename call_traits<K>::param_type k_,
1183 typename call_traits<L>::param_type l_,
1184 typename call_traits<M>::param_type m_
1185 ): a(a_), b(b_), c(c_), d(d_), e(e_),
1186 f(f_), g(g_), h(h_), i(i_), j(j_),
1187 k(k_), l(l_), m(m_) {}
1189 template <typename TupleT>
1190 tuple(TupleT const& init)
1191 : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
1192 c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
1193 e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
1194 g(init[tuple_index<6>()]), h(init[tuple_index<7>()]),
1195 i(init[tuple_index<8>()]), j(init[tuple_index<9>()]),
1196 k(init[tuple_index<10>()]), l(init[tuple_index<11>()]),
1197 m(init[tuple_index<12>()])
1198 { BOOST_STATIC_ASSERT(TupleT::length == length); }
1200 A a; B b; C c; D d; E e;
1201 F f; G g; H h; I i; J j;
1205 ///////////////////////////////////////////////////////////////////////////////
1207 // tuple <14 member> class
1209 ///////////////////////////////////////////////////////////////////////////////
1211 typename A, typename B, typename C, typename D, typename E,
1212 typename F, typename G, typename H, typename I, typename J,
1213 typename K, typename L, typename M, typename N>
1214 struct tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N, nil_t, nil_t>
1215 : public tuple_base<
1216 tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N> > {
1218 BOOST_STATIC_CONSTANT(int, length = 14);
1219 typedef A a_type; typedef B b_type;
1220 typedef C c_type; typedef D d_type;
1221 typedef E e_type; typedef F f_type;
1222 typedef G g_type; typedef H h_type;
1223 typedef I i_type; typedef J j_type;
1224 typedef K k_type; typedef L l_type;
1225 typedef M m_type; typedef N n_type;
1230 typename call_traits<A>::param_type a_,
1231 typename call_traits<B>::param_type b_,
1232 typename call_traits<C>::param_type c_,
1233 typename call_traits<D>::param_type d_,
1234 typename call_traits<E>::param_type e_,
1235 typename call_traits<F>::param_type f_,
1236 typename call_traits<G>::param_type g_,
1237 typename call_traits<H>::param_type h_,
1238 typename call_traits<I>::param_type i_,
1239 typename call_traits<J>::param_type j_,
1240 typename call_traits<K>::param_type k_,
1241 typename call_traits<L>::param_type l_,
1242 typename call_traits<M>::param_type m_,
1243 typename call_traits<N>::param_type n_
1244 ): a(a_), b(b_), c(c_), d(d_), e(e_),
1245 f(f_), g(g_), h(h_), i(i_), j(j_),
1246 k(k_), l(l_), m(m_), n(n_) {}
1248 template <typename TupleT>
1249 tuple(TupleT const& init)
1250 : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
1251 c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
1252 e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
1253 g(init[tuple_index<6>()]), h(init[tuple_index<7>()]),
1254 i(init[tuple_index<8>()]), j(init[tuple_index<9>()]),
1255 k(init[tuple_index<10>()]), l(init[tuple_index<11>()]),
1256 m(init[tuple_index<12>()]), n(init[tuple_index<13>()])
1257 { BOOST_STATIC_ASSERT(TupleT::length == length); }
1259 A a; B b; C c; D d; E e;
1260 F f; G g; H h; I i; J j;
1264 ///////////////////////////////////////////////////////////////////////////////
1266 // tuple <15 member> class
1268 ///////////////////////////////////////////////////////////////////////////////
1270 typename A, typename B, typename C, typename D, typename E,
1271 typename F, typename G, typename H, typename I, typename J,
1272 typename K, typename L, typename M, typename N, typename O>
1273 struct tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, nil_t>
1274 : public tuple_base<
1275 tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O> > {
1277 BOOST_STATIC_CONSTANT(int, length = 15);
1278 typedef A a_type; typedef B b_type;
1279 typedef C c_type; typedef D d_type;
1280 typedef E e_type; typedef F f_type;
1281 typedef G g_type; typedef H h_type;
1282 typedef I i_type; typedef J j_type;
1283 typedef K k_type; typedef L l_type;
1284 typedef M m_type; typedef N n_type;
1290 typename call_traits<A>::param_type a_,
1291 typename call_traits<B>::param_type b_,
1292 typename call_traits<C>::param_type c_,
1293 typename call_traits<D>::param_type d_,
1294 typename call_traits<E>::param_type e_,
1295 typename call_traits<F>::param_type f_,
1296 typename call_traits<G>::param_type g_,
1297 typename call_traits<H>::param_type h_,
1298 typename call_traits<I>::param_type i_,
1299 typename call_traits<J>::param_type j_,
1300 typename call_traits<K>::param_type k_,
1301 typename call_traits<L>::param_type l_,
1302 typename call_traits<M>::param_type m_,
1303 typename call_traits<N>::param_type n_,
1304 typename call_traits<O>::param_type o_
1305 ): a(a_), b(b_), c(c_), d(d_), e(e_),
1306 f(f_), g(g_), h(h_), i(i_), j(j_),
1307 k(k_), l(l_), m(m_), n(n_), o(o_) {}
1309 template <typename TupleT>
1310 tuple(TupleT const& init)
1311 : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
1312 c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
1313 e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
1314 g(init[tuple_index<6>()]), h(init[tuple_index<7>()]),
1315 i(init[tuple_index<8>()]), j(init[tuple_index<9>()]),
1316 k(init[tuple_index<10>()]), l(init[tuple_index<11>()]),
1317 m(init[tuple_index<12>()]), n(init[tuple_index<13>()]),
1318 o(init[tuple_index<14>()])
1319 { BOOST_STATIC_ASSERT(TupleT::length == length); }
1321 A a; B b; C c; D d; E e;
1322 F f; G g; H h; I i; J j;
1323 K k; L l; M m; N n; O o;
1331 #if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
1332 #pragma warning(pop)
1335 ///////////////////////////////////////////////////////////////////////////////
1336 } // namespace phoenix