1 // class template tuple -*- C++ -*-
3 // Copyright (C) 2004 Free Software Foundation, Inc.
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 2, or (at your option)
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License along
17 // with this library; see the file COPYING. If not, write to the Free
18 // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
21 // Chris Jefferson <chris@bubblescope.net>
23 // This header is automatically generated: see maketuple.c for details.
26 * This is a TR1 C++ Library header.
38 // An implementation specific class which is used in the tuple class
39 // when the tuple is not maximum possible size.
40 struct _NullClass { };
42 template<typename _Tp0 = _NullClass, typename _Tp1 = _NullClass,
43 typename _Tp2 = _NullClass, typename _Tp3 = _NullClass,
44 typename _Tp4 = _NullClass, typename _Tp5 = _NullClass,
45 typename _Tp6 = _NullClass, typename _Tp7 = _NullClass,
46 typename _Tp8 = _NullClass, typename _Tp9 = _NullClass>
49 /// Gives the type of the ith element of a given tuple type.
50 template<int __i, typename _Tp>
53 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
54 typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
55 typename _Tp8, typename _Tp9>
56 struct tuple_element<0, tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6,
58 { typedef _Tp0 type; };
60 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
61 typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
62 typename _Tp8, typename _Tp9>
63 struct tuple_element<1, tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6,
65 { typedef _Tp1 type; };
67 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
68 typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
69 typename _Tp8, typename _Tp9>
70 struct tuple_element<2, tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6,
72 { typedef _Tp2 type; };
74 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
75 typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
76 typename _Tp8, typename _Tp9>
77 struct tuple_element<3, tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6,
79 { typedef _Tp3 type; };
81 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
82 typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
83 typename _Tp8, typename _Tp9>
84 struct tuple_element<4, tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6,
86 { typedef _Tp4 type; };
88 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
89 typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
90 typename _Tp8, typename _Tp9>
91 struct tuple_element<5, tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6,
93 { typedef _Tp5 type; };
95 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
96 typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
97 typename _Tp8, typename _Tp9>
98 struct tuple_element<6, tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6,
100 { typedef _Tp6 type; };
102 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
103 typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
104 typename _Tp8, typename _Tp9>
105 struct tuple_element<7, tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6,
107 { typedef _Tp7 type; };
109 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
110 typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
111 typename _Tp8, typename _Tp9>
112 struct tuple_element<8, tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6,
114 { typedef _Tp8 type; };
116 /// @brief class tuple_element
117 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
118 typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
119 typename _Tp8, typename _Tp9>
120 struct tuple_element<9, tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6,
122 { typedef _Tp9 type; };
124 /// Finds the size of a given tuple type.
125 template<typename _Tp>
129 struct tuple_size<tuple<_NullClass, _NullClass, _NullClass, _NullClass,
130 _NullClass, _NullClass, _NullClass, _NullClass,
131 _NullClass, _NullClass> >
132 { static const int value = 0; };
134 template< typename _Tp0>
135 struct tuple_size<tuple< _Tp0, _NullClass, _NullClass, _NullClass,
136 _NullClass, _NullClass, _NullClass, _NullClass,
137 _NullClass, _NullClass> >
138 { static const int value = 1; };
140 template<typename _Tp0, typename _Tp1>
141 struct tuple_size<tuple<_Tp0, _Tp1, _NullClass, _NullClass, _NullClass,
142 _NullClass, _NullClass, _NullClass, _NullClass,
144 { static const int value = 2; };
146 template<typename _Tp0, typename _Tp1, typename _Tp2>
147 struct tuple_size<tuple<_Tp0, _Tp1, _Tp2, _NullClass, _NullClass,
148 _NullClass, _NullClass, _NullClass, _NullClass,
150 { static const int value = 3; };
152 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3>
153 struct tuple_size<tuple<_Tp0, _Tp1, _Tp2, _Tp3, _NullClass, _NullClass,
154 _NullClass, _NullClass, _NullClass, _NullClass> >
155 { static const int value = 4; };
157 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
159 struct tuple_size<tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _NullClass,
160 _NullClass, _NullClass, _NullClass, _NullClass> >
161 { static const int value = 5; };
163 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
164 typename _Tp4, typename _Tp5>
165 struct tuple_size<tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _NullClass,
166 _NullClass, _NullClass, _NullClass> >
167 { static const int value = 6; };
169 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
170 typename _Tp4, typename _Tp5, typename _Tp6>
171 struct tuple_size<tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6,
172 _NullClass, _NullClass, _NullClass> >
173 { static const int value = 7; };
175 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
176 typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7>
177 struct tuple_size<tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7,
178 _NullClass, _NullClass> >
179 { static const int value = 8; };
181 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
182 typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
184 struct tuple_size<tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7,
186 { static const int value = 9; };
188 /// @brief class tuple_size
189 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
190 typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
191 typename _Tp8, typename _Tp9>
192 struct tuple_size<tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7,
194 { static const int value = 10; };
196 // Adds a const reference to a non-reference type.
197 template<typename _Tp>
199 { typedef const _Tp& type; };
201 template<typename _Tp>
202 struct __add_c_ref<_Tp&>
203 { typedef _Tp& type; };
205 // Adds a reference to a non-reference type.
206 template<typename _Tp>
208 { typedef _Tp& type; };
210 template<typename _Tp>
211 struct __add_ref<_Tp&>
212 { typedef _Tp& type; };
216 class tuple<_NullClass, _NullClass, _NullClass, _NullClass, _NullClass,
217 _NullClass, _NullClass, _NullClass, _NullClass, _NullClass>
223 tuple(const tuple& __in)
226 tuple& operator=(const tuple& __in)
230 template< typename _Tp0>
231 class tuple< _Tp0, _NullClass, _NullClass, _NullClass, _NullClass,
232 _NullClass, _NullClass, _NullClass, _NullClass, _NullClass>
240 explicit tuple( typename __add_c_ref<_Tp0>::type __in0):
244 tuple(const tuple& __in):
248 template< typename _Up0>
249 tuple(const tuple< _Up0>& __in):
254 operator=(const tuple& __in)
260 template< typename _Up0>
262 operator=(const tuple< _Up0>& __in)
268 template<int __i, typename _Up>
269 friend class __get_helper;
270 template<typename, typename, typename, typename, typename, typename,
271 typename, typename, typename, typename>
275 template<typename _Tp0, typename _Tp1>
276 class tuple<_Tp0, _Tp1, _NullClass, _NullClass, _NullClass, _NullClass,
277 _NullClass, _NullClass, _NullClass, _NullClass>
286 explicit tuple(typename __add_c_ref<_Tp0>::type __in0,
287 typename __add_c_ref<_Tp1>::type __in1):
288 _M_t0(__in0), _M_t1(__in1)
291 tuple(const tuple& __in):
292 _M_t0(__in._M_t0), _M_t1(__in._M_t1)
295 template<typename _Up0, typename _Up1>
296 tuple(const tuple<_Up0, _Up1>& __in):
297 _M_t0(__in._M_t0), _M_t1(__in._M_t1)
300 template<class _Up1, class _Up2>
301 tuple(const std::pair<_Up1, _Up2>& __u):
302 _M_t0(__u.first), _M_t1(__u.second)
306 operator=(const tuple& __in)
313 template<typename _Up0, typename _Up1>
315 operator=(const tuple<_Up0, _Up1>& __in)
322 template<int __i, typename _Up>
323 friend class __get_helper;
324 template<typename, typename, typename, typename, typename, typename,
325 typename, typename, typename, typename>
329 template<typename _Tp0, typename _Tp1, typename _Tp2>
330 class tuple<_Tp0, _Tp1, _Tp2, _NullClass, _NullClass, _NullClass,
331 _NullClass, _NullClass, _NullClass, _NullClass>
341 explicit tuple(typename __add_c_ref<_Tp0>::type __in0,
342 typename __add_c_ref<_Tp1>::type __in1,
343 typename __add_c_ref<_Tp2>::type __in2):
344 _M_t0(__in0), _M_t1(__in1), _M_t2(__in2)
347 tuple(const tuple& __in):
348 _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2)
351 template<typename _Up0, typename _Up1, typename _Up2>
352 tuple(const tuple<_Up0, _Up1, _Up2>& __in):
353 _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2)
357 operator=(const tuple& __in)
365 template<typename _Up0, typename _Up1, typename _Up2>
367 operator=(const tuple<_Up0, _Up1, _Up2>& __in)
375 template<int __i, typename _Up>
376 friend class __get_helper;
377 template<typename, typename, typename, typename, typename, typename,
378 typename, typename, typename, typename>
382 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3>
383 class tuple<_Tp0, _Tp1, _Tp2, _Tp3, _NullClass, _NullClass, _NullClass,
384 _NullClass, _NullClass, _NullClass>
395 explicit tuple(typename __add_c_ref<_Tp0>::type __in0,
396 typename __add_c_ref<_Tp1>::type __in1,
397 typename __add_c_ref<_Tp2>::type __in2,
398 typename __add_c_ref<_Tp3>::type __in3):
399 _M_t0(__in0), _M_t1(__in1), _M_t2(__in2), _M_t3(__in3)
402 tuple(const tuple& __in):
403 _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2),
407 template<typename _Up0, typename _Up1, typename _Up2, typename _Up3>
408 tuple(const tuple<_Up0, _Up1, _Up2, _Up3>& __in):
409 _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2),
414 operator=(const tuple& __in)
423 template<typename _Up0, typename _Up1, typename _Up2, typename _Up3>
425 operator=(const tuple<_Up0, _Up1, _Up2, _Up3>& __in)
434 template<int __i, typename _Up>
435 friend class __get_helper;
436 template<typename, typename, typename, typename, typename, typename,
437 typename, typename, typename, typename>
441 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
443 class tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _NullClass, _NullClass,
444 _NullClass, _NullClass, _NullClass>
456 explicit tuple(typename __add_c_ref<_Tp0>::type __in0,
457 typename __add_c_ref<_Tp1>::type __in1,
458 typename __add_c_ref<_Tp2>::type __in2,
459 typename __add_c_ref<_Tp3>::type __in3,
460 typename __add_c_ref<_Tp4>::type __in4):
461 _M_t0(__in0), _M_t1(__in1), _M_t2(__in2), _M_t3(__in3), _M_t4(__in4)
464 tuple(const tuple& __in):
465 _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2),
466 _M_t3(__in._M_t3), _M_t4(__in._M_t4)
469 template<typename _Up0, typename _Up1, typename _Up2, typename _Up3,
471 tuple(const tuple<_Up0, _Up1, _Up2, _Up3, _Up4>& __in):
472 _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2),
473 _M_t3(__in._M_t3), _M_t4(__in._M_t4)
477 operator=(const tuple& __in)
487 template<typename _Up0, typename _Up1, typename _Up2, typename _Up3,
490 operator=(const tuple<_Up0, _Up1, _Up2, _Up3, _Up4>& __in)
500 template<int __i, typename _Up>
501 friend class __get_helper;
502 template<typename, typename, typename, typename, typename, typename,
503 typename, typename, typename, typename>
507 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
508 typename _Tp4, typename _Tp5>
509 class tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _NullClass, _NullClass,
510 _NullClass, _NullClass>
523 explicit tuple(typename __add_c_ref<_Tp0>::type __in0,
524 typename __add_c_ref<_Tp1>::type __in1,
525 typename __add_c_ref<_Tp2>::type __in2,
526 typename __add_c_ref<_Tp3>::type __in3,
527 typename __add_c_ref<_Tp4>::type __in4,
528 typename __add_c_ref<_Tp5>::type __in5):
529 _M_t0(__in0), _M_t1(__in1), _M_t2(__in2), _M_t3(__in3), _M_t4(__in4),
533 tuple(const tuple& __in):
534 _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2),
535 _M_t3(__in._M_t3), _M_t4(__in._M_t4), _M_t5(__in._M_t5)
538 template<typename _Up0, typename _Up1, typename _Up2, typename _Up3,
539 typename _Up4, typename _Up5>
540 tuple(const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5>& __in):
541 _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2),
542 _M_t3(__in._M_t3), _M_t4(__in._M_t4), _M_t5(__in._M_t5)
546 operator=(const tuple& __in)
557 template<typename _Up0, typename _Up1, typename _Up2, typename _Up3,
558 typename _Up4, typename _Up5>
560 operator=(const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5>& __in)
571 template<int __i, typename _Up>
572 friend class __get_helper;
573 template<typename, typename, typename, typename, typename, typename,
574 typename, typename, typename, typename>
578 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
579 typename _Tp4, typename _Tp5, typename _Tp6>
580 class tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _NullClass,
581 _NullClass, _NullClass>
595 explicit tuple(typename __add_c_ref<_Tp0>::type __in0,
596 typename __add_c_ref<_Tp1>::type __in1,
597 typename __add_c_ref<_Tp2>::type __in2,
598 typename __add_c_ref<_Tp3>::type __in3,
599 typename __add_c_ref<_Tp4>::type __in4,
600 typename __add_c_ref<_Tp5>::type __in5,
601 typename __add_c_ref<_Tp6>::type __in6):
602 _M_t0(__in0), _M_t1(__in1), _M_t2(__in2), _M_t3(__in3), _M_t4(__in4),
603 _M_t5(__in5), _M_t6(__in6)
606 tuple(const tuple& __in):
607 _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2),
608 _M_t3(__in._M_t3), _M_t4(__in._M_t4), _M_t5(__in._M_t5),
612 template<typename _Up0, typename _Up1, typename _Up2, typename _Up3,
613 typename _Up4, typename _Up5, typename _Up6>
614 tuple(const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6>& __in):
615 _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2),
616 _M_t3(__in._M_t3), _M_t4(__in._M_t4), _M_t5(__in._M_t5),
621 operator=(const tuple& __in)
633 template<typename _Up0, typename _Up1, typename _Up2, typename _Up3,
634 typename _Up4, typename _Up5, typename _Up6>
636 operator=(const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5,
649 template<int __i, typename _Up>
650 friend class __get_helper;
651 template<typename, typename, typename, typename, typename, typename,
652 typename, typename, typename, typename>
656 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
657 typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7>
658 class tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, _NullClass,
674 explicit tuple(typename __add_c_ref<_Tp0>::type __in0,
675 typename __add_c_ref<_Tp1>::type __in1,
676 typename __add_c_ref<_Tp2>::type __in2,
677 typename __add_c_ref<_Tp3>::type __in3,
678 typename __add_c_ref<_Tp4>::type __in4,
679 typename __add_c_ref<_Tp5>::type __in5,
680 typename __add_c_ref<_Tp6>::type __in6,
681 typename __add_c_ref<_Tp7>::type __in7):
682 _M_t0(__in0), _M_t1(__in1), _M_t2(__in2), _M_t3(__in3), _M_t4(__in4),
683 _M_t5(__in5), _M_t6(__in6), _M_t7(__in7)
686 tuple(const tuple& __in):
687 _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2),
688 _M_t3(__in._M_t3), _M_t4(__in._M_t4), _M_t5(__in._M_t5),
689 _M_t6(__in._M_t6), _M_t7(__in._M_t7)
692 template<typename _Up0, typename _Up1, typename _Up2, typename _Up3,
693 typename _Up4, typename _Up5, typename _Up6, typename _Up7>
694 tuple(const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6,
696 _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2),
697 _M_t3(__in._M_t3), _M_t4(__in._M_t4), _M_t5(__in._M_t5),
698 _M_t6(__in._M_t6), _M_t7(__in._M_t7)
702 operator=(const tuple& __in)
715 template<typename _Up0, typename _Up1, typename _Up2, typename _Up3,
716 typename _Up4, typename _Up5, typename _Up6, typename _Up7>
718 operator=(const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6,
732 template<int __i, typename _Up>
733 friend class __get_helper;
734 template<typename, typename, typename, typename, typename, typename,
735 typename, typename, typename, typename>
739 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
740 typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
742 class tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, _Tp8,
759 explicit tuple(typename __add_c_ref<_Tp0>::type __in0,
760 typename __add_c_ref<_Tp1>::type __in1,
761 typename __add_c_ref<_Tp2>::type __in2,
762 typename __add_c_ref<_Tp3>::type __in3,
763 typename __add_c_ref<_Tp4>::type __in4,
764 typename __add_c_ref<_Tp5>::type __in5,
765 typename __add_c_ref<_Tp6>::type __in6,
766 typename __add_c_ref<_Tp7>::type __in7,
767 typename __add_c_ref<_Tp8>::type __in8):
768 _M_t0(__in0), _M_t1(__in1), _M_t2(__in2), _M_t3(__in3), _M_t4(__in4),
769 _M_t5(__in5), _M_t6(__in6), _M_t7(__in7), _M_t8(__in8)
772 tuple(const tuple& __in):
773 _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2),
774 _M_t3(__in._M_t3), _M_t4(__in._M_t4), _M_t5(__in._M_t5),
775 _M_t6(__in._M_t6), _M_t7(__in._M_t7), _M_t8(__in._M_t8)
778 template<typename _Up0, typename _Up1, typename _Up2, typename _Up3,
779 typename _Up4, typename _Up5, typename _Up6, typename _Up7,
781 tuple(const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6, _Up7,
783 _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2),
784 _M_t3(__in._M_t3), _M_t4(__in._M_t4), _M_t5(__in._M_t5),
785 _M_t6(__in._M_t6), _M_t7(__in._M_t7), _M_t8(__in._M_t8)
789 operator=(const tuple& __in)
803 template<typename _Up0, typename _Up1, typename _Up2, typename _Up3,
804 typename _Up4, typename _Up5, typename _Up6, typename _Up7,
807 operator=(const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6, _Up7,
822 template<int __i, typename _Up>
823 friend class __get_helper;
824 template<typename, typename, typename, typename, typename, typename,
825 typename, typename, typename, typename>
829 /// @brief Template class tuple
830 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
831 typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
832 typename _Tp8, typename _Tp9>
850 explicit tuple(typename __add_c_ref<_Tp0>::type __in0,
851 typename __add_c_ref<_Tp1>::type __in1,
852 typename __add_c_ref<_Tp2>::type __in2,
853 typename __add_c_ref<_Tp3>::type __in3,
854 typename __add_c_ref<_Tp4>::type __in4,
855 typename __add_c_ref<_Tp5>::type __in5,
856 typename __add_c_ref<_Tp6>::type __in6,
857 typename __add_c_ref<_Tp7>::type __in7,
858 typename __add_c_ref<_Tp8>::type __in8,
859 typename __add_c_ref<_Tp9>::type __in9):
860 _M_t0(__in0), _M_t1(__in1), _M_t2(__in2), _M_t3(__in3), _M_t4(__in4),
861 _M_t5(__in5), _M_t6(__in6), _M_t7(__in7), _M_t8(__in8), _M_t9(__in9)
864 tuple(const tuple& __in):
865 _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2),
866 _M_t3(__in._M_t3), _M_t4(__in._M_t4), _M_t5(__in._M_t5),
867 _M_t6(__in._M_t6), _M_t7(__in._M_t7), _M_t8(__in._M_t8),
871 template<typename _Up0, typename _Up1, typename _Up2, typename _Up3,
872 typename _Up4, typename _Up5, typename _Up6, typename _Up7,
873 typename _Up8, typename _Up9>
874 tuple(const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6, _Up7, _Up8,
876 _M_t0(__in._M_t0), _M_t1(__in._M_t1), _M_t2(__in._M_t2),
877 _M_t3(__in._M_t3), _M_t4(__in._M_t4), _M_t5(__in._M_t5),
878 _M_t6(__in._M_t6), _M_t7(__in._M_t7), _M_t8(__in._M_t8),
883 operator=(const tuple& __in)
898 template<typename _Up0, typename _Up1, typename _Up2, typename _Up3,
899 typename _Up4, typename _Up5, typename _Up6, typename _Up7,
900 typename _Up8, typename _Up9>
902 operator=(const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6, _Up7,
918 template<int __i, typename _Up>
919 friend class __get_helper;
920 template<typename, typename, typename, typename, typename, typename,
921 typename, typename, typename, typename>
925 // Class used in the implementation of get
926 template<int __i, typename _Tp>
929 template<typename _Tp>
930 struct __get_helper<0, _Tp>
932 static typename __add_ref<typename tuple_element<0, _Tp>::type>::type
934 { return __in._M_t0; }
936 static typename __add_c_ref<typename tuple_element<0, _Tp>::type>::type
937 get_value(const _Tp& __in)
938 { return __in._M_t0; }
941 template<typename _Tp>
942 struct __get_helper<1, _Tp>
944 static typename __add_ref<typename tuple_element<1, _Tp>::type>::type
946 { return __in._M_t1; }
948 static typename __add_c_ref<typename tuple_element<1, _Tp>::type>::type
949 get_value(const _Tp& __in)
950 { return __in._M_t1; }
953 template<typename _Tp>
954 struct __get_helper<2, _Tp>
956 static typename __add_ref<typename tuple_element<2, _Tp>::type>::type
958 { return __in._M_t2; }
960 static typename __add_c_ref<typename tuple_element<2, _Tp>::type>::type
961 get_value(const _Tp& __in)
962 { return __in._M_t2; }
965 template<typename _Tp>
966 struct __get_helper<3, _Tp>
968 static typename __add_ref<typename tuple_element<3, _Tp>::type>::type
970 { return __in._M_t3; }
972 static typename __add_c_ref<typename tuple_element<3, _Tp>::type>::type
973 get_value(const _Tp& __in)
974 { return __in._M_t3; }
977 template<typename _Tp>
978 struct __get_helper<4, _Tp>
980 static typename __add_ref<typename tuple_element<4, _Tp>::type>::type
982 { return __in._M_t4; }
984 static typename __add_c_ref<typename tuple_element<4, _Tp>::type>::type
985 get_value(const _Tp& __in)
986 { return __in._M_t4; }
989 template<typename _Tp>
990 struct __get_helper<5, _Tp>
992 static typename __add_ref<typename tuple_element<5, _Tp>::type>::type
994 { return __in._M_t5; }
996 static typename __add_c_ref<typename tuple_element<5, _Tp>::type>::type
997 get_value(const _Tp& __in)
998 { return __in._M_t5; }
1001 template<typename _Tp>
1002 struct __get_helper<6, _Tp>
1004 static typename __add_ref<typename tuple_element<6, _Tp>::type>::type
1005 get_value(_Tp& __in)
1006 { return __in._M_t6; }
1008 static typename __add_c_ref<typename tuple_element<6, _Tp>::type>::type
1009 get_value(const _Tp& __in)
1010 { return __in._M_t6; }
1013 template<typename _Tp>
1014 struct __get_helper<7, _Tp>
1016 static typename __add_ref<typename tuple_element<7, _Tp>::type>::type
1017 get_value(_Tp& __in)
1018 { return __in._M_t7; }
1020 static typename __add_c_ref<typename tuple_element<7, _Tp>::type>::type
1021 get_value(const _Tp& __in)
1022 { return __in._M_t7; }
1025 template<typename _Tp>
1026 struct __get_helper<8, _Tp>
1028 static typename __add_ref<typename tuple_element<8, _Tp>::type>::type
1029 get_value(_Tp& __in)
1030 { return __in._M_t8; }
1032 static typename __add_c_ref<typename tuple_element<8, _Tp>::type>::type
1033 get_value(const _Tp& __in)
1034 { return __in._M_t8; }
1037 template<typename _Tp>
1038 struct __get_helper<9, _Tp>
1040 static typename __add_ref<typename tuple_element<9, _Tp>::type>::type
1041 get_value(_Tp& __in)
1042 { return __in._M_t9; }
1044 static typename __add_c_ref<typename tuple_element<9, _Tp>::type>::type
1045 get_value(const _Tp& __in)
1046 { return __in._M_t9; }
1049 /* Returns a reference to the ith element of a tuple.
1050 * Any const or non-const ref elements are returned with their original type
1052 template<int __i, typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
1053 typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
1054 typename _Tp8, typename _Tp9>
1055 typename __add_ref<typename tuple_element<__i, tuple<_Tp0, _Tp1, _Tp2,
1058 _Tp9> >::type>::type
1059 get(tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, _Tp8,
1062 return __get_helper<__i, tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6,
1063 _Tp7, _Tp8, _Tp9> >::get_value(__t);
1066 /* Returns a const reference to the ith element of a tuple.
1067 * Any const or non-const ref elements are returned with their original type
1069 template<int __i, typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
1070 typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
1071 typename _Tp8, typename _Tp9>
1072 typename __add_c_ref<typename tuple_element<__i, tuple<_Tp0, _Tp1, _Tp2,
1075 _Tp9> >::type>::type
1076 get(const tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, _Tp8,
1079 return __get_helper<__i, tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6,
1080 _Tp7, _Tp8, _Tp9> >::get_value(__t);
1083 // This class helps construct the various comparison operations on tuples
1084 template<int __check_equal_size, int __i, int __j, typename _Tp, typename _Up>
1085 struct __tuple_compare;
1087 template<int __i, int __j, typename _Tp, typename _Up>
1088 struct __tuple_compare<0, __i, __j, _Tp, _Up>
1090 static bool __eq(const _Tp& __t, const _Up& __u)
1092 return get<__i>(__t) == get<__i>(__u) &&
1093 __tuple_compare<0, __i+1, __j, _Tp, _Up>::__eq(__t, __u);
1095 static bool __neq(const _Tp& __t, const _Up& __u)
1097 return get<__i>(__t) != get<__i>(__u) ||
1098 __tuple_compare<0, __i+1, __j, _Tp, _Up>::__neq(__t, __u);
1100 static bool __less(const _Tp& __t, const _Up& __u)
1102 return (get<__i>(__t) < get<__i>(__u)) || !(get<__i>(__u) < get<__i>(__t)) &&
1103 __tuple_compare<0, __i+1, __j, _Tp, _Up>::__less(__t, __u);
1105 static bool __greater(const _Tp& __t, const _Up& __u)
1107 return (get<__i>(__t) > get<__i>(__u)) || !(get<__i>(__u) > get<__i>(__t)) &&
1108 __tuple_compare<0, __i+1, __j, _Tp, _Up>::__greater(__t, __u);
1110 static bool __leq(const _Tp& __t, const _Up& __u)
1112 return (get<__i>(__t) <= get<__i>(__u)) && (!(get<__i>(__u)<=get<__i>(__t)) ||
1113 __tuple_compare<0, __i+1, __j, _Tp, _Up>::__leq(__t, __u));
1115 static bool __geq(const _Tp& __t, const _Up& __u)
1117 return (get<__i>(__t) >= get<__i>(__u)) && (!(get<__i>(__u)>=get<__i>(__t)) ||
1118 __tuple_compare<0, __i+1, __j, _Tp, _Up>::__geq(__t, __u));
1122 template<int __i, typename _Tp, typename _Up>
1123 struct __tuple_compare<0, __i, __i, _Tp, _Up>
1125 static bool __eq(const _Tp&, const _Up&)
1127 static bool __neq(const _Tp&, const _Up&)
1129 static bool __leq(const _Tp&, const _Up&)
1131 static bool __geq(const _Tp&, const _Up&)
1133 static bool __less(const _Tp&, const _Up&)
1135 static bool __greater(const _Tp&, const _Up&)
1139 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
1140 typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
1141 typename _Tp8, typename _Tp9, typename _Up0, typename _Up1,
1142 typename _Up2, typename _Up3, typename _Up4, typename _Up5,
1143 typename _Up6, typename _Up7, typename _Up8, typename _Up9>
1145 operator==(const tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, _Tp8, _Tp9>& __t,
1146 const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6, _Up7, _Up8, _Up9>& __u)
1148 typedef tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, _Tp8,
1150 typedef tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6, _Up7, _Up8,
1152 return __tuple_compare<tuple_size<__t_tuple>::value -
1153 tuple_size<__u_tuple>::value, 0,
1154 tuple_size<__t_tuple>::value, __t_tuple, __u_tuple>::__eq(__t, __u);
1157 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
1158 typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
1159 typename _Tp8, typename _Tp9, typename _Up0, typename _Up1,
1160 typename _Up2, typename _Up3, typename _Up4, typename _Up5,
1161 typename _Up6, typename _Up7, typename _Up8, typename _Up9>
1163 operator!=(const tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, _Tp8, _Tp9>& __t,
1164 const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6, _Up7, _Up8, _Up9>& __u)
1166 typedef tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, _Tp8,
1168 typedef tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6, _Up7, _Up8,
1170 return __tuple_compare<tuple_size<__t_tuple>::value -
1171 tuple_size<__u_tuple>::value, 0,
1172 tuple_size<__t_tuple>::value, __t_tuple, __u_tuple>::__neq(__t, __u);
1175 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
1176 typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
1177 typename _Tp8, typename _Tp9, typename _Up0, typename _Up1,
1178 typename _Up2, typename _Up3, typename _Up4, typename _Up5,
1179 typename _Up6, typename _Up7, typename _Up8, typename _Up9>
1181 operator<(const tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, _Tp8, _Tp9>& __t,
1182 const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6, _Up7, _Up8, _Up9>& __u)
1184 typedef tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, _Tp8,
1186 typedef tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6, _Up7, _Up8,
1188 return __tuple_compare<tuple_size<__t_tuple>::value -
1189 tuple_size<__u_tuple>::value, 0,
1190 tuple_size<__t_tuple>::value, __t_tuple, __u_tuple>::__less(__t, __u);
1193 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
1194 typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
1195 typename _Tp8, typename _Tp9, typename _Up0, typename _Up1,
1196 typename _Up2, typename _Up3, typename _Up4, typename _Up5,
1197 typename _Up6, typename _Up7, typename _Up8, typename _Up9>
1199 operator>(const tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, _Tp8, _Tp9>& __t,
1200 const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6, _Up7, _Up8, _Up9>& __u)
1202 typedef tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, _Tp8,
1204 typedef tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6, _Up7, _Up8,
1206 return __tuple_compare<tuple_size<__t_tuple>::value -
1207 tuple_size<__u_tuple>::value, 0,
1208 tuple_size<__t_tuple>::value, __t_tuple, __u_tuple>::__greater(__t, __u);
1211 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
1212 typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
1213 typename _Tp8, typename _Tp9, typename _Up0, typename _Up1,
1214 typename _Up2, typename _Up3, typename _Up4, typename _Up5,
1215 typename _Up6, typename _Up7, typename _Up8, typename _Up9>
1217 operator<=(const tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, _Tp8, _Tp9>& __t,
1218 const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6, _Up7, _Up8, _Up9>& __u)
1220 typedef tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, _Tp8,
1222 typedef tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6, _Up7, _Up8,
1224 return __tuple_compare<tuple_size<__t_tuple>::value -
1225 tuple_size<__u_tuple>::value, 0,
1226 tuple_size<__t_tuple>::value, __t_tuple, __u_tuple>::__leq(__t, __u);
1229 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
1230 typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
1231 typename _Tp8, typename _Tp9, typename _Up0, typename _Up1,
1232 typename _Up2, typename _Up3, typename _Up4, typename _Up5,
1233 typename _Up6, typename _Up7, typename _Up8, typename _Up9>
1235 operator>=(const tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, _Tp8, _Tp9>& __t,
1236 const tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6, _Up7, _Up8, _Up9>& __u)
1238 typedef tuple<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6, _Tp7, _Tp8,
1240 typedef tuple<_Up0, _Up1, _Up2, _Up3, _Up4, _Up5, _Up6, _Up7, _Up8,
1242 return __tuple_compare<tuple_size<__t_tuple>::value -
1243 tuple_size<__u_tuple>::value, 0,
1244 tuple_size<__t_tuple>::value, __t_tuple, __u_tuple>::__geq(__t, __u);
1247 // Provides a way to annotate that a reference to
1248 // an object should be passed.
1249 template<typename _Tp>
1250 class reference_wrapper
1255 explicit reference_wrapper(_Tp& __indata): _M_data(__indata)
1258 operator _Tp& () const
1270 // Denotes a reference should be taken to a variable.
1271 template<typename _Tp>
1272 reference_wrapper<_Tp>
1275 return reference_wrapper<_Tp>(__t);
1278 // Denotes a const reference should be taken to a variable.
1279 template<typename _Tp>
1280 reference_wrapper<_Tp const>
1281 cref(const _Tp& __t)
1283 return reference_wrapper<_Tp const>(__t);
1286 // Helper which adds a reference to a type when given a reference_wrapper
1287 template<typename _Tp>
1288 struct __strip_reference_wrapper
1293 template<typename _Tp>
1294 struct __strip_reference_wrapper<reference_wrapper<_Tp> >
1296 typedef _Tp& __type;
1299 template<typename _Tp>
1300 struct __strip_reference_wrapper<const reference_wrapper<_Tp> >
1302 typedef _Tp& __type;
1305 template<typename _Tp0 = _NullClass, typename _Tp1 = _NullClass,
1306 typename _Tp2 = _NullClass, typename _Tp3 = _NullClass,
1307 typename _Tp4 = _NullClass, typename _Tp5 = _NullClass,
1308 typename _Tp6 = _NullClass, typename _Tp7 = _NullClass,
1309 typename _Tp8 = _NullClass, typename _Tp9 = _NullClass>
1310 struct __stripped_tuple_type
1312 typedef tuple<typename __strip_reference_wrapper<_Tp0>::__type,
1313 typename __strip_reference_wrapper<_Tp1>::__type,
1314 typename __strip_reference_wrapper<_Tp2>::__type,
1315 typename __strip_reference_wrapper<_Tp3>::__type,
1316 typename __strip_reference_wrapper<_Tp4>::__type,
1317 typename __strip_reference_wrapper<_Tp5>::__type,
1318 typename __strip_reference_wrapper<_Tp6>::__type,
1319 typename __strip_reference_wrapper<_Tp7>::__type,
1320 typename __strip_reference_wrapper<_Tp8>::__type,
1321 typename __strip_reference_wrapper<_Tp9>::__type> __type;
1326 { return tuple<>(); }
1328 template< typename _Tp0>
1329 typename __stripped_tuple_type< _Tp0>::__type
1330 make_tuple( _Tp0 __t0)
1332 return typename __stripped_tuple_type< _Tp0>::
1336 template<typename _Tp0, typename _Tp1>
1337 typename __stripped_tuple_type<_Tp0, _Tp1>::__type
1338 make_tuple(_Tp0 __t0, _Tp1 __t1)
1340 return typename __stripped_tuple_type<_Tp0, _Tp1>::
1344 template<typename _Tp0, typename _Tp1, typename _Tp2>
1345 typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2>::__type
1346 make_tuple(_Tp0 __t0, _Tp1 __t1, _Tp2 __t2)
1348 return typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2>::
1349 __type(__t0, __t1, __t2);
1352 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3>
1353 typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2, _Tp3>::__type
1354 make_tuple(_Tp0 __t0, _Tp1 __t1, _Tp2 __t2, _Tp3 __t3)
1356 return typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2, _Tp3>::
1357 __type(__t0, __t1, __t2, __t3);
1360 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
1362 typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4>::__type
1363 make_tuple(_Tp0 __t0, _Tp1 __t1, _Tp2 __t2, _Tp3 __t3, _Tp4 __t4)
1365 return typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4>::
1366 __type(__t0, __t1, __t2, __t3, __t4);
1369 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
1370 typename _Tp4, typename _Tp5>
1371 typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4,
1373 make_tuple(_Tp0 __t0, _Tp1 __t1, _Tp2 __t2, _Tp3 __t3, _Tp4 __t4,
1376 return typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4,
1378 __type(__t0, __t1, __t2, __t3, __t4, __t5);
1381 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
1382 typename _Tp4, typename _Tp5, typename _Tp6>
1383 typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5,
1385 make_tuple(_Tp0 __t0, _Tp1 __t1, _Tp2 __t2, _Tp3 __t3, _Tp4 __t4,
1386 _Tp5 __t5, _Tp6 __t6)
1388 return typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4,
1390 __type(__t0, __t1, __t2, __t3, __t4, __t5, __t6);
1393 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
1394 typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7>
1395 typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6,
1397 make_tuple(_Tp0 __t0, _Tp1 __t1, _Tp2 __t2, _Tp3 __t3, _Tp4 __t4,
1398 _Tp5 __t5, _Tp6 __t6, _Tp7 __t7)
1400 return typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4,
1402 __type(__t0, __t1, __t2, __t3, __t4, __t5, __t6, __t7);
1405 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
1406 typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
1408 typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6,
1410 make_tuple(_Tp0 __t0, _Tp1 __t1, _Tp2 __t2, _Tp3 __t3, _Tp4 __t4,
1411 _Tp5 __t5, _Tp6 __t6, _Tp7 __t7, _Tp8 __t8)
1413 return typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4,
1414 _Tp5, _Tp6, _Tp7, _Tp8>::
1415 __type(__t0, __t1, __t2, __t3, __t4, __t5, __t6, __t7, __t8);
1418 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
1419 typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
1420 typename _Tp8, typename _Tp9>
1421 typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4, _Tp5, _Tp6,
1422 _Tp7, _Tp8, _Tp9>::__type
1423 make_tuple(_Tp0 __t0, _Tp1 __t1, _Tp2 __t2, _Tp3 __t3, _Tp4 __t4,
1424 _Tp5 __t5, _Tp6 __t6, _Tp7 __t7, _Tp8 __t8, _Tp9 __t9)
1426 return typename __stripped_tuple_type<_Tp0, _Tp1, _Tp2, _Tp3, _Tp4,
1427 _Tp5, _Tp6, _Tp7, _Tp8, _Tp9>::
1428 __type(__t0, __t1, __t2, __t3, __t4, __t5, __t6, __t7, __t8, __t9);
1431 // A class (and instance) which can be used in 'tie' when an element
1432 // of a tuple is not required
1434 struct swallow_assign
1442 // TODO: Put this in some kind of shared file
1445 swallow_assign ignore;
1449 // Forms a tuple of references to a list of variables.
1450 template< typename _Tp0>
1454 return make_tuple( ref(__t0));
1457 template<typename _Tp0, typename _Tp1>
1459 tie(_Tp0& __t0, _Tp1& __t1)
1461 return make_tuple(ref(__t0), ref(__t1));
1464 template<typename _Tp0, typename _Tp1, typename _Tp2>
1465 tuple<_Tp0&, _Tp1&, _Tp2&>
1466 tie(_Tp0& __t0, _Tp1& __t1, _Tp2& __t2)
1468 return make_tuple(ref(__t0), ref(__t1), ref(__t2));
1471 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3>
1472 tuple<_Tp0&, _Tp1&, _Tp2&, _Tp3&>
1473 tie(_Tp0& __t0, _Tp1& __t1, _Tp2& __t2, _Tp3& __t3)
1475 return make_tuple(ref(__t0), ref(__t1), ref(__t2), ref(__t3));
1478 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
1480 tuple<_Tp0&, _Tp1&, _Tp2&, _Tp3&, _Tp4&>
1481 tie(_Tp0& __t0, _Tp1& __t1, _Tp2& __t2, _Tp3& __t3, _Tp4& __t4)
1483 return make_tuple(ref(__t0), ref(__t1), ref(__t2), ref(__t3),
1487 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
1488 typename _Tp4, typename _Tp5>
1489 tuple<_Tp0&, _Tp1&, _Tp2&, _Tp3&, _Tp4&, _Tp5&>
1490 tie(_Tp0& __t0, _Tp1& __t1, _Tp2& __t2, _Tp3& __t3, _Tp4& __t4,
1493 return make_tuple(ref(__t0), ref(__t1), ref(__t2), ref(__t3), ref(__t4),
1497 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
1498 typename _Tp4, typename _Tp5, typename _Tp6>
1499 tuple<_Tp0&, _Tp1&, _Tp2&, _Tp3&, _Tp4&, _Tp5&, _Tp6&>
1500 tie(_Tp0& __t0, _Tp1& __t1, _Tp2& __t2, _Tp3& __t3, _Tp4& __t4, _Tp5& __t5,
1503 return make_tuple(ref(__t0), ref(__t1), ref(__t2), ref(__t3), ref(__t4),
1504 ref(__t5), ref(__t6));
1507 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
1508 typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7>
1509 tuple<_Tp0&, _Tp1&, _Tp2&, _Tp3&, _Tp4&, _Tp5&, _Tp6&, _Tp7&>
1510 tie(_Tp0& __t0, _Tp1& __t1, _Tp2& __t2, _Tp3& __t3, _Tp4& __t4, _Tp5& __t5,
1511 _Tp6& __t6, _Tp7& __t7)
1513 return make_tuple(ref(__t0), ref(__t1), ref(__t2), ref(__t3), ref(__t4),
1514 ref(__t5), ref(__t6), ref(__t7));
1517 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
1518 typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
1520 tuple<_Tp0&, _Tp1&, _Tp2&, _Tp3&, _Tp4&, _Tp5&, _Tp6&, _Tp7&, _Tp8&>
1521 tie(_Tp0& __t0, _Tp1& __t1, _Tp2& __t2, _Tp3& __t3, _Tp4& __t4, _Tp5& __t5,
1522 _Tp6& __t6, _Tp7& __t7, _Tp8& __t8)
1524 return make_tuple(ref(__t0), ref(__t1), ref(__t2), ref(__t3), ref(__t4),
1525 ref(__t5), ref(__t6), ref(__t7), ref(__t8));
1528 template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
1529 typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
1530 typename _Tp8, typename _Tp9>
1531 tuple<_Tp0&, _Tp1&, _Tp2&, _Tp3&, _Tp4&, _Tp5&, _Tp6&, _Tp7&, _Tp8&,
1533 tie(_Tp0& __t0, _Tp1& __t1, _Tp2& __t2, _Tp3& __t3, _Tp4& __t4, _Tp5& __t5,
1534 _Tp6& __t6, _Tp7& __t7, _Tp8& __t8, _Tp9& __t9)
1536 return make_tuple(ref(__t0), ref(__t1), ref(__t2), ref(__t3), ref(__t4),
1537 ref(__t5), ref(__t6), ref(__t7), ref(__t8),
1541 // Various functions which give std::pair a tuple-like interface.
1542 template<class _Tp1, class _Tp2>
1543 struct tuple_size<std::pair<_Tp1, _Tp2> >
1544 { static const int value = 2; };
1546 template<class _Tp1, class _Tp2>
1547 struct tuple_element<0, std::pair<_Tp1, _Tp2> >
1548 { typedef _Tp1 type; };
1550 template<class _Tp1, class _Tp2>
1551 struct tuple_element<1, std::pair<_Tp1, _Tp2> >
1552 { typedef _Tp2 type; };
1554 template<int _Int, class _Tp1, class _Tp2>
1555 typename tuple_element<_Int, tuple<_Tp1, _Tp2> >::type
1556 get(pair<_Tp1, _Tp2>& __in)
1557 { return get<_Int>(tie(__in.first, __in.second)); }
1559 template<int _Int, class _Tp1, class _Tp2>
1560 typename tuple_element<_Int, tuple<_Tp1, _Tp2> >::type
1561 get(const pair<_Tp1, _Tp2>& __in)
1562 { return get<_Int>(tie(__in.first, __in.second)); }