1 /* ///////////////////////////////////////////////////////////////////////
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
17 # error tuple_impl.h need be supported by c++.
20 /* ///////////////////////////////////////////////////////////////////////
25 #ifdef EXTL_MPL_IF_SUPPORT
26 # include "../../mpl/if_.h"
29 #ifdef EXTL_TYPE_TRAITS_ADD_CONST_SUPPORT
30 # include "../../type/traits/add_const.h"
33 #ifdef EXTL_TYPE_TRAITS_IS_CONST_SUPPORT
34 # include "../../type/traits/is_const.h"
36 /* ///////////////////////////////////////////////////////////////////////
41 /* ///////////////////////////////////////////////////////////////////////
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
57 template<typename_param_k T
>
58 struct tuple_elements_size
;
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)
77 struct tuple_element_traits_impl
80 typedef typename_type_k
T::tail_type next_type
;
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
;
92 struct tuple_element_traits_impl_helper
94 template<typename_param_k T
>
98 typedef typename_type_k
T::tail_type next_type
;
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
>
109 typedef typename_type_k
T::head_type type
;
115 struct tuple_element_traits_impl
116 : tuple_element_traits_impl_helper
<N
>::template_qual_k result
<T
>
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
136 struct tuple_element_traits
139 typedef typename_type_k
EXTL_NS_DETAIL(tuple_element_traits_impl
)<N
, T
>::type old_type_
;
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)
149 typedef typename_type_k
EXTL_NS_MPL(if_
)< (is_const
<T
>::value
)
150 , typename_type_k add_const
<old_type_
>::type
154 typedef old_type_ type
;
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
;
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
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
195 get(tuple2
<T1
, T2
> const& t
)
197 return get_tuple_element_impl
<N
- 1>::get(t
.get_tail());
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());
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
233 get(tuple2
<T1
, T2
>& t
)
238 template< typename_param_k T1
239 , typename_param_k T2
241 inline static typename_type_ret_k
242 tuple_element_traits
< 0
245 get(tuple2
<T1
, T2
> const& t
)
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
)
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
)
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&
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;
289 * \ingroup extl_group_container
292 , typename_param_k T1
293 , typename_param_k T2
297 tuple_element_traits
< N
298 , EXTL_NS_DETAIL(tuple2
)<T1
, T2
>
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&
312 tuple<int, void*, double> t(1, NULL, 1.5);
313 int a = get_tuple_element<0>(t);
316 * \ingroup extl_group_container
319 , typename_param_k T1
320 , typename_param_k T2
324 tuple_element_traits
< N
325 , EXTL_NS_DETAIL(tuple2
)<T1
, T2
>
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
);
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&
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;
345 * \ingroup extl_group_container
348 , typename_param_k T1
349 , typename_param_k T2
353 tuple_element_traits
< N
354 , EXTL_NS_DETAIL(tuple2
)<T1
, T2
>
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
>
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&
376 tuple<int, void*, double> t(1, NULL, 1.5);
377 int a = get_tuple_element<0>(t);
380 * \ingroup extl_group_container
383 , typename_param_k T1
384 , typename_param_k T2
388 tuple_element_traits
< N
389 , EXTL_NS_DETAIL(tuple2
)<T1
, T2
>
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
>
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
414 tuple<int, void*, double> t(1, NULL, 1.5);
415 set_tuple_element<0>(t, 10);
418 * \ingroup extl_group_container
421 , typename_param_k T1
422 , typename_param_k T2
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
>
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
441 int num = tuple_elements_size< tuple<int, int> >::value; // num == 2
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
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
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
;
499 typedef EXTL_NS_DETAIL(tuple2
) < T0
513 typedef tuple class_type
;
514 typedef e_size_t size_type
;
517 /// \name Constructors
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
)
556 /// \name Accessors nad Mutators
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
;
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 ')'
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
>
586 tuple_element_traits
< N
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
>
597 tuple_element_traits
< N
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
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
);
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
>
627 typedef e_null_t base_type
;
628 typedef tuple class_type
;
629 typedef e_size_t size_type
;
633 /* ///////////////////////////////////////////////////////////////////////
636 EXTL_INLINE tuple
<> make_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 /* /////////////////////////////////////////////////////////////////////////
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
)
767 /* ///////////////////////////////////////////////////////////////////////
772 /* ///////////////////////////////////////////////////////////////////////
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
)
787 /* ::std namespace */
788 EXTL_STD_END_NAMESPACE
791 /* //////////////////////////////////////////////////////////////////// */
792 #endif /* EXTL_CONTAINER_DETAIL_TUPLE_IMPL_H */
793 /* //////////////////////////////////////////////////////////////////// */