24
explicit tuple(const T&...);
24
explicit tuple(const T&...); // constexpr in C++14
25
25
template <class... U>
26
explicit tuple(U&&...);
26
explicit tuple(U&&...); // constexpr in C++14
27
27
tuple(const tuple&) = default;
28
28
tuple(tuple&&) = default;
29
29
template <class... U>
30
tuple(const tuple<U...>&);
30
tuple(const tuple<U...>&); // constexpr in C++14
31
31
template <class... U>
33
template <class U1, class U2>
34
tuple(const pair<U1, U2>&); // iff sizeof...(T) == 2
35
template <class U1, class U2>
36
tuple(pair<U1, U2>&&); // iff sizeof...(T) == 2
32
tuple(tuple<U...>&&); // constexpr in C++14
33
template <class U1, class U2>
34
tuple(const pair<U1, U2>&); // iff sizeof...(T) == 2 // constexpr in C++14
35
template <class U1, class U2>
36
tuple(pair<U1, U2>&&); // iff sizeof...(T) == 2 // constexpr in C++14
38
38
// allocator-extended constructors
39
39
template <class Alloc>
73
73
const unspecified ignore;
75
template <class... T> tuple<V...> make_tuple(T&&...);
75
template <class... T> tuple<V...> make_tuple(T&&...); // constexpr in C++14
76
76
template <class... T> tuple<ATypes...> forward_as_tuple(T&&...) noexcept;
77
77
template <class... T> tuple<T&...> tie(T&...) noexcept;
78
template <class... Tuples> tuple<CTypes...> tuple_cat(Tuples&&... tpls);
78
template <class... Tuples> tuple<CTypes...> tuple_cat(Tuples&&... tpls); // constexpr in C++14
80
80
// 20.4.1.4, tuple helper classes:
81
81
template <class T> class tuple_size; // undefined
86
86
// 20.4.1.5, element access:
87
87
template <intsize_t I, class... T>
88
88
typename tuple_element<I, tuple<T...>>::type&
89
get(tuple<T...>&) noexcept;
89
get(tuple<T...>&) noexcept; // constexpr in C++14
90
90
template <intsize_t I, class... T>
91
91
typename tuple_element<I, tuple<T...>>::type const&
92
get(const tuple<T...>&) noexcept;
92
get(const tuple<T...>&) noexcept; // constexpr in C++14
93
93
template <intsize_t I, class... T>
94
94
typename tuple_element<I, tuple<T...>>::type&&
95
get(tuple<T...>&&) noexcept;
95
get(tuple<T...>&&) noexcept; // constexpr in C++14
97
template <class T1, class... T>
98
constexpr T1& get(tuple<T...>&) noexcept; // C++14
99
template <class T1, class... T>
100
constexpr T1 const& get(const tuple<T...>&) noexcept; // C++14
101
template <class T1, class... T>
102
constexpr T1&& get(tuple<T...>&&) noexcept; // C++14
97
104
// 20.4.1.6, relational operators:
98
template<class... T, class... U> bool operator==(const tuple<T...>&, const tuple<U...>&);
99
template<class... T, class... U> bool operator<(const tuple<T...>&, const tuple<U...>&);
100
template<class... T, class... U> bool operator!=(const tuple<T...>&, const tuple<U...>&);
101
template<class... T, class... U> bool operator>(const tuple<T...>&, const tuple<U...>&);
102
template<class... T, class... U> bool operator<=(const tuple<T...>&, const tuple<U...>&);
103
template<class... T, class... U> bool operator>=(const tuple<T...>&, const tuple<U...>&);
105
template<class... T, class... U> bool operator==(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14
106
template<class... T, class... U> bool operator<(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14
107
template<class... T, class... U> bool operator!=(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14
108
template<class... T, class... U> bool operator>(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14
109
template<class... T, class... U> bool operator<=(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14
110
template<class... T, class... U> bool operator>=(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14
105
112
template <class... Types, class Alloc>
106
113
struct uses_allocator<tuple<Types...>, Alloc>;
317
324
"Attempted to construct a reference element in a tuple with an rvalue");}
326
_LIBCPP_INLINE_VISIBILITY
327
_LIBCPP_CONSTEXPR_AFTER_CXX11
319
328
__tuple_leaf(const __tuple_leaf& __t) _NOEXCEPT_(is_nothrow_copy_constructible<_Hp>::value)
320
329
: value(__t.get())
321
330
{static_assert(!is_rvalue_reference<_Hp>::value, "Can not copy a tuple with rvalue reference member");}
324
_LIBCPP_INLINE_VISIBILITY
325
explicit __tuple_leaf(const __tuple_leaf<_Ip, _Tp>& __t)
326
_NOEXCEPT_((is_nothrow_constructible<_Hp, const _Tp&>::value))
327
: value(__t.get()) {}
332
_LIBCPP_INLINE_VISIBILITY
333
_LIBCPP_CONSTEXPR_AFTER_CXX11
334
__tuple_leaf(__tuple_leaf&& __t) _NOEXCEPT_(is_nothrow_move_constructible<_Hp>::value)
335
: value(_VSTD::move(__t.get()))
329
338
template <class _Tp>
330
339
_LIBCPP_INLINE_VISIBILITY
451
454
template <size_t ..._Uf, class ..._Tf,
452
455
size_t ..._Ul, class ..._Tl, class ..._Up>
453
_LIBCPP_INLINE_VISIBILITY
456
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
455
458
__tuple_impl(__tuple_indices<_Uf...>, __tuple_types<_Tf...>,
456
459
__tuple_indices<_Ul...>, __tuple_types<_Tl...>,
477
480
template <class _Tuple,
478
481
class = typename enable_if
480
__tuple_convertible<_Tuple, tuple<_Tp...> >::value
483
__tuple_constructible<_Tuple, tuple<_Tp...> >::value
483
_LIBCPP_INLINE_VISIBILITY
486
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
484
487
__tuple_impl(_Tuple&& __t) _NOEXCEPT_((__all<is_nothrow_constructible<_Tp, typename tuple_element<_Indx,
485
488
typename __make_tuple_types<_Tuple>::type>::type>::value...>::value))
486
489
: __tuple_leaf<_Indx, _Tp>(_VSTD::forward<typename tuple_element<_Indx,
542
template <size_t _Jp, class ..._Up> friend
545
template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11
543
546
typename tuple_element<_Jp, tuple<_Up...> >::type& get(tuple<_Up...>&) _NOEXCEPT;
544
template <size_t _Jp, class ..._Up> friend
547
template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11
545
548
const typename tuple_element<_Jp, tuple<_Up...> >::type& get(const tuple<_Up...>&) _NOEXCEPT;
546
template <size_t _Jp, class ..._Up> friend
549
template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11
547
550
typename tuple_element<_Jp, tuple<_Up...> >::type&& get(tuple<_Up...>&&) _NOEXCEPT;
551
554
_LIBCPP_CONSTEXPR tuple()
552
555
_NOEXCEPT_(__all<is_nothrow_default_constructible<_Tp>::value...>::value) {}
554
_LIBCPP_INLINE_VISIBILITY
557
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
555
558
explicit tuple(const _Tp& ... __t) _NOEXCEPT_((__all<is_nothrow_copy_constructible<_Tp>::value...>::value))
556
559
: base_(typename __make_tuple_indices<sizeof...(_Tp)>::type(),
557
560
typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(),
783
786
static_cast<__tuple_leaf<_Ip, type>&&>(__t.base_).get());
789
#if _LIBCPP_STD_VER > 11
791
template <typename _T1, size_t _Idx, typename... _Args>
792
struct __find_exactly_one_t_helper;
794
// -- find exactly one
795
template <typename _T1, size_t _Idx, typename... _Args>
796
struct __find_exactly_one_t_checker {
797
static constexpr size_t value = _Idx;
798
// Check the rest of the list to make sure there's only one
799
static_assert ( __find_exactly_one_t_helper<_T1, 0, _Args...>::value == -1, "type can only occur once in type list" );
803
template <typename _T1, size_t _Idx>
804
struct __find_exactly_one_t_helper <_T1, _Idx> {
805
static constexpr size_t value = -1;
808
template <typename _T1, size_t _Idx, typename _Head, typename... _Args>
809
struct __find_exactly_one_t_helper <_T1, _Idx, _Head, _Args...> {
810
static constexpr size_t value =
812
std::is_same<_T1, _Head>::value,
813
__find_exactly_one_t_checker<_T1, _Idx, _Args...>,
814
__find_exactly_one_t_helper <_T1, _Idx+1, _Args...>
818
template <typename _T1, typename... _Args>
819
struct __find_exactly_one_t {
820
static constexpr size_t value = __find_exactly_one_t_helper<_T1, 0, _Args...>::value;
821
static_assert ( value != -1, "type not found in type list" );
824
template <class _T1, class... _Args>
825
inline _LIBCPP_INLINE_VISIBILITY
826
constexpr _T1& get(tuple<_Args...>& __tup) noexcept
828
return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(__tup);
831
template <class _T1, class... _Args>
832
inline _LIBCPP_INLINE_VISIBILITY
833
constexpr _T1 const& get(tuple<_Args...> const& __tup) noexcept
835
return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(__tup);
838
template <class _T1, class... _Args>
839
inline _LIBCPP_INLINE_VISIBILITY
840
constexpr _T1&& get(tuple<_Args...>&& __tup) noexcept
842
return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(_VSTD::move(__tup));
788
849
template <class ..._Tp>
1030
1099
struct __tuple_cat<tuple<_Types...>, __tuple_indices<_I0...>, __tuple_indices<_J0...> >
1032
1101
template <class _Tuple0>
1033
_LIBCPP_INLINE_VISIBILITY
1102
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
1034
1103
typename __tuple_cat_return_ref<tuple<_Types...>&&, _Tuple0&&>::type
1035
1104
operator()(tuple<_Types...> __t, _Tuple0&& __t0)
1037
return _VSTD::forward_as_tuple(_VSTD::forward<_Types>(get<_I0>(__t))...,
1106
return __forward_as_tuple(_VSTD::forward<_Types>(get<_I0>(__t))...,
1038
1107
get<_J0>(_VSTD::forward<_Tuple0>(__t0))...);
1041
1110
template <class _Tuple0, class _Tuple1, class ..._Tuples>
1042
_LIBCPP_INLINE_VISIBILITY
1111
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
1043
1112
typename __tuple_cat_return_ref<tuple<_Types...>&&, _Tuple0&&, _Tuple1&&, _Tuples&&...>::type
1044
1113
operator()(tuple<_Types...> __t, _Tuple0&& __t0, _Tuple1&& __t1, _Tuples&& ...__tpls)
1049
1118
tuple<_Types..., typename __apply_cv<_Tuple0, typename tuple_element<_J0, _T0>::type>::type&&...>,
1050
1119
typename __make_tuple_indices<sizeof ...(_Types) + tuple_size<_T0>::value>::type,
1051
1120
typename __make_tuple_indices<tuple_size<_T1>::value>::type>()
1052
(_VSTD::forward_as_tuple(
1121
(__forward_as_tuple(
1053
1122
_VSTD::forward<_Types>(get<_I0>(__t))...,
1054
1123
get<_J0>(_VSTD::forward<_Tuple0>(__t0))...