remove \r
[extl.git] / extl / container / detail / tuple_impl.h
blob06b923d48c9404ef1ba31ef19344470fbeb29c0d
1 /* ///////////////////////////////////////////////////////////////////////
2 * File: tuple_impl.h
4 * Created: 08.07.21
5 * Updated: 08.07.24
7 * Brief: tuple class
9 * [<Home>]
10 * Copyright (c) 2008-2020, Waruqi All rights reserved.
11 * //////////////////////////////////////////////////////////////////// */
13 #ifndef EXTL_CONTAINER_DETAIL_TUPLE_IMPL_H
14 #define EXTL_CONTAINER_DETAIL_TUPLE_IMPL_H
16 #ifndef __cplusplus
17 # error tuple_impl.h need be supported by c++.
18 #endif
20 /* ///////////////////////////////////////////////////////////////////////
21 * Includes
23 #include "tuple2.h"
25 #ifdef EXTL_MPL_IF_SUPPORT
26 # include "../../mpl/if_.h"
27 #endif
29 #ifdef EXTL_TYPE_TRAITS_ADD_CONST_SUPPORT
30 # include "../../type/traits/add_const.h"
31 #endif
33 #ifdef EXTL_TYPE_TRAITS_IS_CONST_SUPPORT
34 # include "../../type/traits/is_const.h"
35 #endif
36 /* ///////////////////////////////////////////////////////////////////////
37 * ::extl namespace
39 EXTL_BEGIN_NAMESPACE
41 /* ///////////////////////////////////////////////////////////////////////
42 * Forward declaration
44 template< typename_param_k T0 = e_null_t
45 , typename_param_k T1 = e_null_t
46 , typename_param_k T2 = e_null_t
47 , typename_param_k T3 = e_null_t
48 , typename_param_k T4 = e_null_t
49 , typename_param_k T5 = e_null_t
50 , typename_param_k T6 = e_null_t
51 , typename_param_k T7 = e_null_t
52 , typename_param_k T8 = e_null_t
53 , typename_param_k T9 = e_null_t
55 class tuple;
57 template<typename_param_k T>
58 struct tuple_elements_size;
60 template< e_size_t N
61 , typename_param_k T
63 struct tuple_element_traits;
65 /* ///////////////////////////////////////////////////////////////////////
66 * ::extl::detail namespace
68 EXTL_DETAIL_BEGIN_NAMESPACE
70 // tuple_element_traits implemention
71 #if defined(EXTL_TEMPLATE_PARTIAL_SPEC_SUPPORT) && \
72 !EXTL_WORKAROUND_BORLAND(==, 0x551)
74 template< e_size_t N
75 , typename_param_k T
77 struct tuple_element_traits_impl
79 private:
80 typedef typename_type_k T::tail_type next_type;
81 public:
82 typedef typename_type_k tuple_element_traits_impl<N - 1, next_type>::type type;
85 template<typename_param_k T>
86 struct tuple_element_traits_impl<0, T>
88 typedef typename_type_k T::head_type type;
90 #else
91 template<e_size_t N>
92 struct tuple_element_traits_impl_helper
94 template<typename_param_k T>
95 struct result
97 private:
98 typedef typename_type_k T::tail_type next_type;
99 public:
100 typedef typename_type_k tuple_element_traits_impl_helper<N - 1>::template_qual_k result<next_type>::type type;
103 EXTL_TEMPLATE_SPECIALISATION
104 struct tuple_element_traits_impl_helper<0>
106 template<typename_param_k T>
107 struct result
109 typedef typename_type_k T::head_type type;
112 template< e_size_t N
113 , typename_param_k T
115 struct tuple_element_traits_impl
116 : tuple_element_traits_impl_helper<N>::template_qual_k result<T>
120 #endif
121 /* ///////////////////////////////////////////////////////////////////////
122 * ::extl::detail namespace
124 EXTL_DETAIL_END_NAMESPACE
126 /*!\brief tuple_element_traits class
128 * \param N The sequence number of elements
129 * \param T The tuple<>/EXTL_NS_DETAIL(tuple2)<> type
131 * \ingroup extl_group_container
133 template< e_size_t N
134 , typename_param_k T
136 struct tuple_element_traits
138 private:
139 typedef typename_type_k EXTL_NS_DETAIL(tuple_element_traits_impl)<N, T>::type old_type_;
141 /// \name Types
142 /// @{
143 public:
144 // The element type will be added const-qualified if tuple<> is const-qualified
145 #if defined(EXTL_MPL_IF_SUPPORT) && \
146 defined(EXTL_TYPE_TRAITS_ADD_CONST_SUPPORT) && \
147 defined(EXTL_TYPE_TRAITS_IS_CONST_SUPPORT)
148 /// The element type
149 typedef typename_type_k EXTL_NS_MPL(if_)< (is_const<T>::value)
150 , typename_type_k add_const<old_type_>::type
151 , old_type_
152 >::type type;
153 #else
154 typedef old_type_ type;
155 #endif
156 /// The return type of element
157 typedef typename_type_k call_traits<type>::reference reference;
158 /// The const return type of element
159 typedef typename_type_k call_traits<type>::const_reference const_reference;
160 /// The parameter type of element
161 typedef typename_type_k call_traits<type>::param_type param_type;
162 /// @}
165 /* ///////////////////////////////////////////////////////////////////////
166 * ::extl::detail namespace
168 EXTL_DETAIL_BEGIN_NAMESPACE
170 // get_tuple_element implemention
171 template <e_size_t N>
172 struct get_tuple_element_impl
174 #if EXTL_WORKAROUND_MSVC(==, 1200)
176 template< typename_param_k T1
177 , typename_param_k T2
179 inline static typename_type_ret_k
180 tuple_element_traits< N
181 , tuple2<T1, T2>
182 >::reference
183 get(tuple2<T1, T2>& t)
185 return get_tuple_element_impl<N - 1>::get(t.get_tail());
188 template< typename_param_k T1
189 , typename_param_k T2
191 inline static typename_type_ret_k
192 tuple_element_traits< N
193 , tuple2<T1, T2>
194 >::const_reference
195 get(tuple2<T1, T2> const& t)
197 return get_tuple_element_impl<N - 1>::get(t.get_tail());
200 #else
202 template< typename_param_k RT
203 , typename_param_k T1
204 , typename_param_k T2
206 inline static RT get(tuple2<T1, T2> const& t)
208 return get_tuple_element_impl<N - 1>::template_qual_k get<RT>(t.get_tail());
211 template< typename_param_k RT
212 , typename_param_k T1
213 , typename_param_k T2
215 inline static RT get(tuple2<T1, T2>& t)
217 return get_tuple_element_impl<N - 1>::template_qual_k get<RT>(t.get_tail());
219 #endif
221 EXTL_TEMPLATE_SPECIALISATION
222 struct get_tuple_element_impl<0>
224 #if EXTL_WORKAROUND_MSVC(==, 1200)
226 template< typename_param_k T1
227 , typename_param_k T2
229 inline static typename_type_ret_k
230 tuple_element_traits< 0
231 , tuple2<T1, T2>
232 >::reference
233 get(tuple2<T1, T2>& t)
235 return t.get_head();
238 template< typename_param_k T1
239 , typename_param_k T2
241 inline static typename_type_ret_k
242 tuple_element_traits< 0
243 , tuple2<T1, T2>
244 >::const_reference
245 get(tuple2<T1, T2> const& t)
247 return t.get_head();
249 #else
250 template< typename_param_k RT
251 , typename_param_k T1
252 , typename_param_k T2
254 inline static RT get(tuple2<T1, T2> const& t)
256 return t.get_head();
259 template< typename_param_k RT
260 , typename_param_k T1
261 , typename_param_k T2
263 inline static RT get(tuple2<T1, T2>& t)
265 return t.get_head();
267 #endif
270 /* ///////////////////////////////////////////////////////////////////////
271 * ::extl::detail namespace
273 EXTL_DETAIL_END_NAMESPACE
275 #if EXTL_WORKAROUND_MSVC(==, 1200)
276 /*!\brief Gets the element of tuple/EXTL_NS_DETAIL(tuple2)
278 * \param N The sequence number of elements
279 * \param T1 The head type of EXTL_NS_DETAIL(tuple2)
280 * \param T2 The tail type of EXTL_NS_DETAIL(tuple2)
281 * \param t EXTL_NS_DETAIL(tuple2)<T1, T2> const&
283 * \code
284 tuple<int, void*, double> t(1, NULL, 1.5);
285 int a = get_tuple_element<0>(t);
286 get_tuple_element<0>(t) = 10;
287 * \endcode
289 * \ingroup extl_group_container
291 template< e_size_t N
292 , typename_param_k T1
293 , typename_param_k T2
295 EXTL_INLINE
296 typename_type_ret_k
297 tuple_element_traits< N
298 , EXTL_NS_DETAIL(tuple2)<T1, T2>
299 >::reference
300 get_tuple_element(EXTL_NS_DETAIL(tuple2)<T1, T2>& t EXTL_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(e_size_t, N))
302 return EXTL_NS_DETAIL(get_tuple_element_impl)<N>::get(t);
304 /*!\brief Gets the const element of tuple/EXTL_NS_DETAIL(tuple2)
306 * \param N The sequence number of elements
307 * \param T1 The head type of EXTL_NS_DETAIL(tuple2)
308 * \param T2 The tail type of EXTL_NS_DETAIL(tuple2)
309 * \param t EXTL_NS_DETAIL(tuple2)<T1, T2> const&
311 * \code
312 tuple<int, void*, double> t(1, NULL, 1.5);
313 int a = get_tuple_element<0>(t);
314 * \endcode
316 * \ingroup extl_group_container
318 template< e_size_t N
319 , typename_param_k T1
320 , typename_param_k T2
322 EXTL_INLINE
323 typename_type_ret_k
324 tuple_element_traits< N
325 , EXTL_NS_DETAIL(tuple2)<T1, T2>
326 >::const_reference
327 get_tuple_element(EXTL_NS_DETAIL(tuple2)<T1, T2> const& t EXTL_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(e_size_t, N))
329 return EXTL_NS_DETAIL(get_tuple_element_impl)<N>::get(t);
331 #else
332 /*!\brief Gets the element of tuple/EXTL_NS_DETAIL(tuple2)
334 * \param N The sequence number of elements
335 * \param T1 The head type of EXTL_NS_DETAIL(tuple2)
336 * \param T2 The tail type of EXTL_NS_DETAIL(tuple2)
337 * \param t EXTL_NS_DETAIL(tuple2)<T1, T2> const&
339 * \code
340 tuple<int, void*, double> t(1, NULL, 1.5);
341 int a = get_tuple_element<0>(t);
342 get_tuple_element<0>(t) = 10;
343 * \endcode
345 * \ingroup extl_group_container
347 template< e_size_t N
348 , typename_param_k T1
349 , typename_param_k T2
351 EXTL_INLINE
352 typename_type_ret_k
353 tuple_element_traits< N
354 , EXTL_NS_DETAIL(tuple2)<T1, T2>
355 >::reference
356 get_tuple_element(EXTL_NS_DETAIL(tuple2)<T1, T2>& t EXTL_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(e_size_t, N))
358 EXTL_STATIC_ASSERT(N < (tuple_elements_size<EXTL_NS_DETAIL(tuple2)<T1, T2> >::value));
359 return EXTL_NS_DETAIL(get_tuple_element_impl)<N>::template_qual_k
360 get < typename_type_k
361 tuple_element_traits< N
362 , EXTL_NS_DETAIL(tuple2)<T1, T2>
363 >::reference
364 , T1
365 , T2
366 >(t);
368 /*!\brief Gets the const element of tuple/EXTL_NS_DETAIL(tuple2)
370 * \param N The sequence number of elements
371 * \param T1 The head type of EXTL_NS_DETAIL(tuple2)
372 * \param T2 The tail type of EXTL_NS_DETAIL(tuple2)
373 * \param t EXTL_NS_DETAIL(tuple2)<T1, T2> const&
375 * \code
376 tuple<int, void*, double> t(1, NULL, 1.5);
377 int a = get_tuple_element<0>(t);
378 * \endcode
380 * \ingroup extl_group_container
382 template< e_size_t N
383 , typename_param_k T1
384 , typename_param_k T2
386 EXTL_INLINE
387 typename_type_ret_k
388 tuple_element_traits< N
389 , EXTL_NS_DETAIL(tuple2)<T1, T2>
390 >::const_reference
391 get_tuple_element(EXTL_NS_DETAIL(tuple2)<T1, T2> const& t EXTL_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(e_size_t, N))
393 EXTL_STATIC_ASSERT(N < (tuple_elements_size<EXTL_NS_DETAIL(tuple2)<T1, T2> >::value));
394 return EXTL_NS_DETAIL(get_tuple_element_impl)<N>::template_qual_k
395 get < typename_type_k
396 tuple_element_traits< N
397 , EXTL_NS_DETAIL(tuple2)<T1, T2>
398 >::const_reference
399 , T1
400 , T2
401 >(t);
403 #endif
405 /*!\brief Sets the element of tuple/EXTL_NS_DETAIL(tuple2)
407 * \param N The sequence number of elements
408 * \param T1 The head type of EXTL_NS_DETAIL(tuple2)
409 * \param T2 The tail type of EXTL_NS_DETAIL(tuple2)
410 * \param t EXTL_NS_DETAIL(tuple2)<T1, T2>&
411 * \param e The new element
413 * \code
414 tuple<int, void*, double> t(1, NULL, 1.5);
415 set_tuple_element<0>(t, 10);
416 * \endcode
418 * \ingroup extl_group_container
420 template< e_size_t N
421 , typename_param_k T1
422 , typename_param_k T2
424 EXTL_INLINE
425 void set_tuple_element( EXTL_NS_DETAIL(tuple2)<T1, T2>& t
426 , typename_type_k tuple_element_traits< N
427 , EXTL_NS_DETAIL(tuple2)<T1, T2>
428 >::param_type e
429 EXTL_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(e_size_t, N)
432 EXTL_STATIC_ASSERT(N < (tuple_elements_size<EXTL_NS_DETAIL(tuple2)<T1, T2> >::value));
433 get_tuple_element<N>(t) = e;
436 /*!\brief Gets the number of the elements of tuple/EXTL_NS_DETAIL(tuple2)
438 * \param T The tuple/EXTL_NS_DETAIL(tuple2) type
440 * \code
441 int num = tuple_elements_size< tuple<int, int> >::value; // num == 2
442 * \endcode
444 * \ingroup extl_group_container
446 template<typename_param_k T>
447 struct tuple_elements_size
449 EXTL_STATIC_MEMBER_CONST(e_size_t, value = 1 + tuple_elements_size< typename_type_k T::tail_type >::value);
452 EXTL_TEMPLATE_SPECIALISATION
453 struct tuple_elements_size<tuple<> >
455 EXTL_STATIC_MEMBER_CONST(e_size_t, value = 0);
458 EXTL_TEMPLATE_SPECIALISATION
459 struct tuple_elements_size<e_null_t>
461 EXTL_STATIC_MEMBER_CONST(e_size_t, value = 0);
464 /*!\brief tuple class
466 * \ingroup extl_group_container
468 template< typename_param_k T0
469 , typename_param_k T1
470 , typename_param_k T2
471 , typename_param_k T3
472 , typename_param_k T4
473 , typename_param_k T5
474 , typename_param_k T6
475 , typename_param_k T7
476 , typename_param_k T8
477 , typename_param_k T9
479 class tuple
480 : public EXTL_NS_DETAIL(tuple2) < T0
481 , typename_type_k tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, e_null_t>::base_type
484 private:
485 typedef typename_type_k call_traits<T0>::param_type param0_type;
486 typedef typename_type_k call_traits<T1>::param_type param1_type;
487 typedef typename_type_k call_traits<T2>::param_type param2_type;
488 typedef typename_type_k call_traits<T3>::param_type param3_type;
489 typedef typename_type_k call_traits<T4>::param_type param4_type;
490 typedef typename_type_k call_traits<T5>::param_type param5_type;
491 typedef typename_type_k call_traits<T6>::param_type param6_type;
492 typedef typename_type_k call_traits<T7>::param_type param7_type;
493 typedef typename_type_k call_traits<T8>::param_type param8_type;
494 typedef typename_type_k call_traits<T9>::param_type param9_type;
496 /// \name Types
497 /// @{
498 public:
499 typedef EXTL_NS_DETAIL(tuple2) < T0
500 , typename_type_k
501 tuple < T1
502 , T2
503 , T3
504 , T4
505 , T5
506 , T6
507 , T7
508 , T8
509 , T9
510 , e_null_t
511 >::base_type
512 > base_type;
513 typedef tuple class_type;
514 typedef e_size_t size_type;
515 /// @}
517 /// \name Constructors
518 /// @{
519 public:
520 tuple()
521 : base_type()
523 tuple(param0_type t0)
524 : base_type(t0, cnull(), cnull(), cnull(), cnull(), cnull(), cnull(), cnull(), cnull(), cnull())
526 tuple(param0_type t0, param1_type t1)
527 : base_type(t0, t1, cnull(), cnull(), cnull(), cnull(), cnull(), cnull(), cnull(), cnull())
529 tuple(param0_type t0, param1_type t1, param2_type t2)
530 : base_type(t0, t1, t2, cnull(), cnull(), cnull(), cnull(), cnull(), cnull(), cnull())
532 tuple(param0_type t0, param1_type t1, param2_type t2, param3_type t3)
533 : base_type(t0, t1, t2, t3, cnull(), cnull(), cnull(), cnull(), cnull(), cnull())
535 tuple(param0_type t0, param1_type t1, param2_type t2, param3_type t3, param4_type t4)
536 : base_type(t0, t1, t2, t3, t4, cnull(), cnull(), cnull(), cnull(), cnull())
538 tuple(param0_type t0, param1_type t1, param2_type t2, param3_type t3, param4_type t4, param5_type t5)
539 : base_type(t0, t1, t2, t3, t4, t5, cnull(), cnull(), cnull(), cnull())
541 tuple(param0_type t0, param1_type t1, param2_type t2, param3_type t3, param4_type t4, param5_type t5, param6_type t6)
542 : base_type(t0, t1, t2, t3, t4, t5, t6, cnull(), cnull(), cnull())
544 tuple(param0_type t0, param1_type t1, param2_type t2, param3_type t3, param4_type t4, param5_type t5, param6_type t6, param7_type t7)
545 : base_type(t0, t1, t2, t3, t4, t5, t6, t7, cnull(), cnull())
547 tuple(param0_type t0, param1_type t1, param2_type t2, param3_type t3, param4_type t4, param5_type t5, param6_type t6, param7_type t7, param8_type t8)
548 : base_type(t0, t1, t2, t3, t4, t5, t6, t7, t8, cnull())
550 tuple(param0_type t0, param1_type t1, param2_type t2, param3_type t3, param4_type t4, param5_type t5, param6_type t6, param7_type t7, param8_type t8, param9_type t9)
551 : base_type(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9)
554 /// @}
556 /// \name Accessors nad Mutators
557 /// @{
558 public:
559 void swap(class_type& rhs)
561 static_cast<base_type&>(*this).swap(rhs);
563 class_type& operator =(class_type const& rhs)
565 static_cast<base_type&>(*this) = rhs;
566 return *this;
569 static size_type size()
571 return (tuple_elements_size<base_type>::value);
574 /* VC6.0 exists some bugs:
575 * bug1: t.get<0>() syntax error ')'
576 * work out bug1:
577 * declaration: get(int); call: t.get<0>(0);
579 * bug2: t.get<0>() and t.set<0>() cannot be called normally.
580 * t.get<0>() will be zero forever
582 #if defined(EXTL_MEMBER_TEMPLATE_FUNCTION_SUPPORT) && \
583 !EXTL_WORKAROUND_MSVC(==, 1200)
584 template <e_size_t N>
585 typename_type_ret_k
586 tuple_element_traits< N
587 , base_type
588 >::reference
589 get(EXTL_EXPLICIT_TEMPLATE_NON_TYPE(e_size_t, N))
591 EXTL_STATIC_ASSERT(N < (tuple_elements_size<base_type>::value));
592 return get_tuple_element<N>(*this);
595 template <e_size_t N>
596 typename_type_ret_k
597 tuple_element_traits< N
598 , base_type
599 >::const_reference
600 get(EXTL_EXPLICIT_TEMPLATE_NON_TYPE(e_size_t, N)) const
602 EXTL_STATIC_ASSERT(N < (tuple_elements_size<base_type>::value));
603 return get_tuple_element<N>(*this);
606 template <e_size_t N>
607 void set(typename_type_ret_k
608 tuple_element_traits< N
609 , base_type
610 >::param_type e
611 EXTL_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(e_size_t, N))
613 EXTL_STATIC_ASSERT(N < (tuple_elements_size<base_type>::value));
614 set_tuple_element<N>(*this, e);
616 #endif
617 /// @}
621 EXTL_TEMPLATE_SPECIALISATION
622 class tuple<e_null_t, e_null_t, e_null_t, e_null_t, e_null_t, e_null_t, e_null_t, e_null_t, e_null_t, e_null_t>
624 /// \name Types
625 /// @{
626 public:
627 typedef e_null_t base_type;
628 typedef tuple class_type;
629 typedef e_size_t size_type;
630 /// @}
633 /* ///////////////////////////////////////////////////////////////////////
634 * Make tuple
636 EXTL_INLINE tuple<> make_tuple()
638 return tuple<>();
641 template<typename_param_k T0>
642 EXTL_INLINE tuple<T0> make_tuple(T0 const& t0)
644 return tuple<T0>(t0);
647 template< typename_param_k T0
648 , typename_param_k T1
650 EXTL_INLINE tuple<T0, T1> make_tuple(T0 const& t0, T1 const& t1)
652 return tuple<T0, T1>(t0, t1);
655 template< typename_param_k T0
656 , typename_param_k T1
657 , typename_param_k T2
659 EXTL_INLINE tuple<T0, T1, T2> make_tuple(T0 const& t0, T1 const& t1, T2 const& t2)
661 return tuple<T0, T1, T2>(t0, t1, t2);
664 template< typename_param_k T0
665 , typename_param_k T1
666 , typename_param_k T2
667 , typename_param_k T3
669 EXTL_INLINE tuple<T0, T1, T2, T3> make_tuple(T0 const& t0, T1 const& t1, T2 const& t2, T3 const& t3)
671 return tuple<T0, T1, T2, T3>(t0, t1, t2, t3);
674 template< typename_param_k T0
675 , typename_param_k T1
676 , typename_param_k T2
677 , typename_param_k T3
678 , typename_param_k T4
680 EXTL_INLINE tuple<T0, T1, T2, T3, T4> make_tuple(T0 const& t0, T1 const& t1, T2 const& t2, T3 const& t3, T4 const& t4)
682 return tuple<T0, T1, T2, T3, T4>(t0, t1, t2, t3, t4);
685 template< typename_param_k T0
686 , typename_param_k T1
687 , typename_param_k T2
688 , typename_param_k T3
689 , typename_param_k T4
690 , typename_param_k T5
692 EXTL_INLINE tuple<T0, T1, T2, T3, T4, T5> make_tuple(T0 const& t0, T1 const& t1, T2 const& t2, T3 const& t3, T4 const& t4, T5 const& t5)
694 return tuple<T0, T1, T2, T3, T4, T5>(t0, t1, t2, t3, t4, t5);
697 template< typename_param_k T0
698 , typename_param_k T1
699 , typename_param_k T2
700 , typename_param_k T3
701 , typename_param_k T4
702 , typename_param_k T5
703 , typename_param_k T6
705 EXTL_INLINE tuple<T0, T1, T2, T3, T4, T5, T6> make_tuple(T0 const& t0, T1 const& t1, T2 const& t2, T3 const& t3, T4 const& t4, T5 const& t5, T6 const& t6)
707 return tuple<T0, T1, T2, T3, T4, T5, T6>(t0, t1, t2, t3, t4, t5, t6);
710 template< typename_param_k T0
711 , typename_param_k T1
712 , typename_param_k T2
713 , typename_param_k T3
714 , typename_param_k T4
715 , typename_param_k T5
716 , typename_param_k T6
717 , typename_param_k T7
719 EXTL_INLINE tuple<T0, T1, T2, T3, T4, T5, T6, T7> make_tuple(T0 const& t0, T1 const& t1, T2 const& t2, T3 const& t3, T4 const& t4, T5 const& t5, T6 const& t6, T7 const& t7)
721 return tuple<T0, T1, T2, T3, T4, T5, T6, T7>(t0, t1, t2, t3, t4, t5, t6, t7);
724 template< typename_param_k T0
725 , typename_param_k T1
726 , typename_param_k T2
727 , typename_param_k T3
728 , typename_param_k T4
729 , typename_param_k T5
730 , typename_param_k T6
731 , typename_param_k T7
732 , typename_param_k T8
734 EXTL_INLINE tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8> make_tuple(T0 const& t0, T1 const& t1, T2 const& t2, T3 const& t3, T4 const& t4, T5 const& t5, T6 const& t6, T7 const& t7, T8 const& t8)
736 return tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8>(t0, t1, t2, t3, t4, t5, t6, t7, t8);
739 template< typename_param_k T0
740 , typename_param_k T1
741 , typename_param_k T2
742 , typename_param_k T3
743 , typename_param_k T4
744 , typename_param_k T5
745 , typename_param_k T6
746 , typename_param_k T7
747 , typename_param_k T8
748 , typename_param_k T9
750 EXTL_INLINE tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> make_tuple(T0 const& t0, T1 const& t1, T2 const& t2, T3 const& t3, T4 const& t4, T5 const& t5, T6 const& t6, T7 const& t7, T8 const& t8, T9 const& t9)
752 return tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9);
755 /* /////////////////////////////////////////////////////////////////////////
756 * swapping
758 template< typename_param_k T1
759 , typename_param_k T2
761 EXTL_INLINE void swap(EXTL_NS_DETAIL(tuple2)<T1, T2> &lhs, EXTL_NS_DETAIL(tuple2)<T1, T2> &rhs)
763 lhs.swap(rhs);
767 /* ///////////////////////////////////////////////////////////////////////
768 * ::extl namespace
770 EXTL_END_NAMESPACE
772 /* ///////////////////////////////////////////////////////////////////////
773 * std::swap
775 #if !defined(EXTL_NO_STL) && \
776 !defined(EXTL_NO_NAMESPACE)
777 /* ::std namespace */
778 EXTL_STD_BEGIN_NAMESPACE
780 template< typename_param_k T1
781 , typename_param_k T2
783 EXTL_INLINE void swap(EXTL_NS(EXTL_NS_DETAIL(tuple2))<T1, T2>& lhs, EXTL_NS(EXTL_NS_DETAIL(tuple2))<T1, T2>& rhs)
785 lhs.swap(rhs);
787 /* ::std namespace */
788 EXTL_STD_END_NAMESPACE
789 #endif
791 /* //////////////////////////////////////////////////////////////////// */
792 #endif /* EXTL_CONTAINER_DETAIL_TUPLE_IMPL_H */
793 /* //////////////////////////////////////////////////////////////////// */