blob: 01c59b3b3ea3a87165479a6f5a15004080733f09 [file] [log] [blame]
Howard Hinnantc51e1022010-05-11 19:42:16 +00001// -*- C++ -*-
Louis Dionne9bd93882021-11-17 16:25:01 -05002//===----------------------------------------------------------------------===//
Howard Hinnantc51e1022010-05-11 19:42:16 +00003//
Chandler Carruth7642bb12019-01-19 08:50:56 +00004// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5// See https://llvm.org/LICENSE.txt for license information.
6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Howard Hinnantc51e1022010-05-11 19:42:16 +00007//
8//===----------------------------------------------------------------------===//
9
10#ifndef _LIBCPP_TUPLE
11#define _LIBCPP_TUPLE
12
13/*
14 tuple synopsis
15
16namespace std
17{
18
19template <class... T>
20class tuple {
21public:
Louis Dionnea7a2beb2019-09-26 14:51:10 +000022 explicit(see-below) constexpr tuple();
Louis Dionne1afad1d2019-07-22 20:45:23 +000023 explicit(see-below) tuple(const T&...); // constexpr in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +000024 template <class... U>
Louis Dionne1afad1d2019-07-22 20:45:23 +000025 explicit(see-below) tuple(U&&...); // constexpr in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +000026 tuple(const tuple&) = default;
Howard Hinnant89ef1212011-05-27 19:08:18 +000027 tuple(tuple&&) = default;
Hui Xied1637a82022-05-12 13:23:11 +010028
29 template<class... UTypes>
30 constexpr explicit(see-below) tuple(tuple<UTypes...>&); // C++23
Howard Hinnantc51e1022010-05-11 19:42:16 +000031 template <class... U>
Louis Dionne1afad1d2019-07-22 20:45:23 +000032 explicit(see-below) tuple(const tuple<U...>&); // constexpr in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +000033 template <class... U>
Louis Dionne1afad1d2019-07-22 20:45:23 +000034 explicit(see-below) tuple(tuple<U...>&&); // constexpr in C++14
Hui Xied1637a82022-05-12 13:23:11 +010035 template<class... UTypes>
36 constexpr explicit(see-below) tuple(const tuple<UTypes...>&&); // C++23
37
38 template<class U1, class U2>
39 constexpr explicit(see-below) tuple(pair<U1, U2>&); // iff sizeof...(Types) == 2 // C++23
Howard Hinnantc51e1022010-05-11 19:42:16 +000040 template <class U1, class U2>
Louis Dionne1afad1d2019-07-22 20:45:23 +000041 explicit(see-below) tuple(const pair<U1, U2>&); // iff sizeof...(T) == 2 // constexpr in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +000042 template <class U1, class U2>
Louis Dionne1afad1d2019-07-22 20:45:23 +000043 explicit(see-below) tuple(pair<U1, U2>&&); // iff sizeof...(T) == 2 // constexpr in C++14
Hui Xied1637a82022-05-12 13:23:11 +010044 template<class U1, class U2>
45 constexpr explicit(see-below) tuple(const pair<U1, U2>&&); // iff sizeof...(Types) == 2 // C++23
Howard Hinnantc51e1022010-05-11 19:42:16 +000046
47 // allocator-extended constructors
48 template <class Alloc>
49 tuple(allocator_arg_t, const Alloc& a);
50 template <class Alloc>
Arthur O'Dwyer20638cc2021-02-09 19:12:16 -050051 explicit(see-below) tuple(allocator_arg_t, const Alloc& a, const T&...); // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000052 template <class Alloc, class... U>
Arthur O'Dwyer20638cc2021-02-09 19:12:16 -050053 explicit(see-below) tuple(allocator_arg_t, const Alloc& a, U&&...); // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000054 template <class Alloc>
Arthur O'Dwyer20638cc2021-02-09 19:12:16 -050055 tuple(allocator_arg_t, const Alloc& a, const tuple&); // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000056 template <class Alloc>
Arthur O'Dwyer20638cc2021-02-09 19:12:16 -050057 tuple(allocator_arg_t, const Alloc& a, tuple&&); // constexpr in C++20
Hui Xied1637a82022-05-12 13:23:11 +010058 template<class Alloc, class... UTypes>
59 constexpr explicit(see-below)
Louis Dionne76450ee2022-06-27 09:36:52 -040060 tuple(allocator_arg_t, const Alloc& a, tuple<UTypes...>&); // C++23
Howard Hinnantc51e1022010-05-11 19:42:16 +000061 template <class Alloc, class... U>
Arthur O'Dwyer20638cc2021-02-09 19:12:16 -050062 explicit(see-below) tuple(allocator_arg_t, const Alloc& a, const tuple<U...>&); // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000063 template <class Alloc, class... U>
Arthur O'Dwyer20638cc2021-02-09 19:12:16 -050064 explicit(see-below) tuple(allocator_arg_t, const Alloc& a, tuple<U...>&&); // constexpr in C++20
Hui Xied1637a82022-05-12 13:23:11 +010065 template<class Alloc, class... UTypes>
66 constexpr explicit(see-below)
67 tuple(allocator_arg_t, const Alloc& a, const tuple<UTypes...>&&); // C++23
68 template<class Alloc, class U1, class U2>
69 constexpr explicit(see-below)
70 tuple(allocator_arg_t, const Alloc& a, pair<U1, U2>&); // C++23
Howard Hinnantc51e1022010-05-11 19:42:16 +000071 template <class Alloc, class U1, class U2>
Arthur O'Dwyer20638cc2021-02-09 19:12:16 -050072 explicit(see-below) tuple(allocator_arg_t, const Alloc& a, const pair<U1, U2>&); // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000073 template <class Alloc, class U1, class U2>
Arthur O'Dwyer20638cc2021-02-09 19:12:16 -050074 explicit(see-below) tuple(allocator_arg_t, const Alloc& a, pair<U1, U2>&&); // constexpr in C++20
Hui Xied1637a82022-05-12 13:23:11 +010075 template<class Alloc, class U1, class U2>
76 constexpr explicit(see-below)
77 tuple(allocator_arg_t, const Alloc& a, const pair<U1, U2>&&); // C++23
Howard Hinnantc51e1022010-05-11 19:42:16 +000078
Arthur O'Dwyer20638cc2021-02-09 19:12:16 -050079 tuple& operator=(const tuple&); // constexpr in C++20
Hui Xied1637a82022-05-12 13:23:11 +010080 constexpr const tuple& operator=(const tuple&) const; // C++23
Arthur O'Dwyer20638cc2021-02-09 19:12:16 -050081 tuple& operator=(tuple&&) noexcept(is_nothrow_move_assignable_v<T> && ...); // constexpr in C++20
Hui Xied1637a82022-05-12 13:23:11 +010082 constexpr const tuple& operator=(tuple&&) const; // C++23
Howard Hinnantc51e1022010-05-11 19:42:16 +000083 template <class... U>
Arthur O'Dwyer20638cc2021-02-09 19:12:16 -050084 tuple& operator=(const tuple<U...>&); // constexpr in C++20
Hui Xied1637a82022-05-12 13:23:11 +010085 template<class... UTypes>
86 constexpr const tuple& operator=(const tuple<UTypes...>&) const; // C++23
Howard Hinnantc51e1022010-05-11 19:42:16 +000087 template <class... U>
Arthur O'Dwyer20638cc2021-02-09 19:12:16 -050088 tuple& operator=(tuple<U...>&&); // constexpr in C++20
Hui Xied1637a82022-05-12 13:23:11 +010089 template<class... UTypes>
90 constexpr const tuple& operator=(tuple<UTypes...>&&) const; // C++23
Howard Hinnantc51e1022010-05-11 19:42:16 +000091 template <class U1, class U2>
Arthur O'Dwyer20638cc2021-02-09 19:12:16 -050092 tuple& operator=(const pair<U1, U2>&); // iff sizeof...(T) == 2 // constexpr in C++20
Hui Xied1637a82022-05-12 13:23:11 +010093 template<class U1, class U2>
94 constexpr const tuple& operator=(const pair<U1, U2>&) const; // iff sizeof...(Types) == 2 // C++23
Howard Hinnantc51e1022010-05-11 19:42:16 +000095 template <class U1, class U2>
Arthur O'Dwyer20638cc2021-02-09 19:12:16 -050096 tuple& operator=(pair<U1, U2>&&); // iff sizeof...(T) == 2 // constexpr in C++20
Hui Xied1637a82022-05-12 13:23:11 +010097 template<class U1, class U2>
98 constexpr const tuple& operator=(pair<U1, U2>&&) const; // iff sizeof...(Types) == 2 // C++23
Howard Hinnantc51e1022010-05-11 19:42:16 +000099
Louis Dionne6c0d5342018-07-31 11:56:20 -0400100 template<class U, size_t N>
101 tuple& operator=(array<U, N> const&) // iff sizeof...(T) == N, EXTENSION
102 template<class U, size_t N>
103 tuple& operator=(array<U, N>&&) // iff sizeof...(T) == N, EXTENSION
104
Arthur O'Dwyer20638cc2021-02-09 19:12:16 -0500105 void swap(tuple&) noexcept(AND(swap(declval<T&>(), declval<T&>())...)); // constexpr in C++20
Hui Xied1637a82022-05-12 13:23:11 +0100106 constexpr void swap(const tuple&) const noexcept(see-below); // C++23
Howard Hinnantc51e1022010-05-11 19:42:16 +0000107};
108
Nikolas Klauserad26ba52022-01-17 19:45:42 +0100109
110template<class... TTypes, class... UTypes, template<class> class TQual, template<class> class UQual> // since C++23
111 requires requires { typename tuple<common_reference_t<TQual<TTypes>, UQual<UTypes>>...>; }
112struct basic_common_reference<tuple<TTypes...>, tuple<UTypes...>, TQual, UQual> {
113 using type = tuple<common_reference_t<TQual<TTypes>, UQual<UTypes>>...>;
114};
115
116template<class... TTypes, class... UTypes> // since C++23
117 requires requires { typename tuple<common_type_t<TTypes, UTypes>...>; }
118struct common_type<tuple<TTypes...>, tuple<UTypes...>> {
119 using type = tuple<common_type_t<TTypes, UTypes>...>;
120};
121
Louis Dionne616da2a2019-08-12 18:30:31 +0000122template <class ...T>
123tuple(T...) -> tuple<T...>; // since C++17
124template <class T1, class T2>
125tuple(pair<T1, T2>) -> tuple<T1, T2>; // since C++17
126template <class Alloc, class ...T>
127tuple(allocator_arg_t, Alloc, T...) -> tuple<T...>; // since C++17
128template <class Alloc, class T1, class T2>
129tuple(allocator_arg_t, Alloc, pair<T1, T2>) -> tuple<T1, T2>; // since C++17
130template <class Alloc, class ...T>
131tuple(allocator_arg_t, Alloc, tuple<T...>) -> tuple<T...>; // since C++17
132
Marshall Clowf1bf62f2018-01-02 17:17:01 +0000133inline constexpr unspecified ignore;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000134
Marshall Clow2229cee2013-07-22 16:02:19 +0000135template <class... T> tuple<V...> make_tuple(T&&...); // constexpr in C++14
Marshall Clowded420b2013-10-05 18:46:37 +0000136template <class... T> tuple<ATypes...> forward_as_tuple(T&&...) noexcept; // constexpr in C++14
Marshall Clowa8892812014-02-25 16:11:46 +0000137template <class... T> tuple<T&...> tie(T&...) noexcept; // constexpr in C++14
Marshall Clow2229cee2013-07-22 16:02:19 +0000138template <class... Tuples> tuple<CTypes...> tuple_cat(Tuples&&... tpls); // constexpr in C++14
Eric Fiselier8e892c52016-07-18 00:35:56 +0000139
140// [tuple.apply], calling a function with a tuple of arguments:
141template <class F, class Tuple>
142 constexpr decltype(auto) apply(F&& f, Tuple&& t); // C++17
143template <class T, class Tuple>
144 constexpr T make_from_tuple(Tuple&& t); // C++17
145
Howard Hinnantc51e1022010-05-11 19:42:16 +0000146// 20.4.1.4, tuple helper classes:
Marshall Clowce62b4d2019-01-11 21:57:12 +0000147template <class T> struct tuple_size; // undefined
148template <class... T> struct tuple_size<tuple<T...>>;
Eric Fiselier8e892c52016-07-18 00:35:56 +0000149template <class T>
Marshall Clowf1bf62f2018-01-02 17:17:01 +0000150 inline constexpr size_t tuple_size_v = tuple_size<T>::value; // C++17
Louis Dionnee684aa62019-04-01 16:39:34 +0000151template <size_t I, class T> struct tuple_element; // undefined
152template <size_t I, class... T> struct tuple_element<I, tuple<T...>>;
Marshall Clow36907512015-11-19 19:45:29 +0000153template <size_t I, class T>
154 using tuple_element_t = typename tuple_element <I, T>::type; // C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000155
156// 20.4.1.5, element access:
Marshall Clow36907512015-11-19 19:45:29 +0000157template <size_t I, class... T>
Howard Hinnant89ef1212011-05-27 19:08:18 +0000158 typename tuple_element<I, tuple<T...>>::type&
Marshall Clow0abb1042013-07-17 18:25:36 +0000159 get(tuple<T...>&) noexcept; // constexpr in C++14
Marshall Clow36907512015-11-19 19:45:29 +0000160template <size_t I, class... T>
161 const typename tuple_element<I, tuple<T...>>::type&
Marshall Clow0abb1042013-07-17 18:25:36 +0000162 get(const tuple<T...>&) noexcept; // constexpr in C++14
Marshall Clow36907512015-11-19 19:45:29 +0000163template <size_t I, class... T>
Howard Hinnant89ef1212011-05-27 19:08:18 +0000164 typename tuple_element<I, tuple<T...>>::type&&
Marshall Clow0abb1042013-07-17 18:25:36 +0000165 get(tuple<T...>&&) noexcept; // constexpr in C++14
Eric Fiselier6dea8092015-12-18 00:36:55 +0000166template <size_t I, class... T>
167 const typename tuple_element<I, tuple<T...>>::type&&
168 get(const tuple<T...>&&) noexcept; // constexpr in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000169
Marshall Clow15b02e02013-07-13 02:54:05 +0000170template <class T1, class... T>
171 constexpr T1& get(tuple<T...>&) noexcept; // C++14
172template <class T1, class... T>
Marshall Clow36907512015-11-19 19:45:29 +0000173 constexpr const T1& get(const tuple<T...>&) noexcept; // C++14
Marshall Clow15b02e02013-07-13 02:54:05 +0000174template <class T1, class... T>
175 constexpr T1&& get(tuple<T...>&&) noexcept; // C++14
Eric Fiselier6dea8092015-12-18 00:36:55 +0000176template <class T1, class... T>
177 constexpr const T1&& get(const tuple<T...>&&) noexcept; // C++14
Marshall Clow15b02e02013-07-13 02:54:05 +0000178
Howard Hinnantc51e1022010-05-11 19:42:16 +0000179// 20.4.1.6, relational operators:
Marshall Clow2229cee2013-07-22 16:02:19 +0000180template<class... T, class... U> bool operator==(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14
Kent Ross0861b0d2021-10-08 14:54:28 -0700181template<class... T, class... U> bool operator<(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14, removed in C++20
182template<class... T, class... U> bool operator!=(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14, removed in C++20
183template<class... T, class... U> bool operator>(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14, removed in C++20
184template<class... T, class... U> bool operator<=(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14, removed in C++20
185template<class... T, class... U> bool operator>=(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14, removed in C++20
186template<class... T, class... U>
187 constexpr common_comparison_category_t<synth-three-way-result<T, U>...>
188 operator<=>(const tuple<T...>&, const tuple<U...>&); // since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000189
190template <class... Types, class Alloc>
191 struct uses_allocator<tuple<Types...>, Alloc>;
192
193template <class... Types>
Howard Hinnant89ef1212011-05-27 19:08:18 +0000194 void
195 swap(tuple<Types...>& x, tuple<Types...>& y) noexcept(noexcept(x.swap(y)));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000196
Hui Xied1637a82022-05-12 13:23:11 +0100197template <class... Types>
198 constexpr void swap(const tuple<Types...>& x, const tuple<Types...>& y) noexcept(see-below); // C++23
199
Howard Hinnantc51e1022010-05-11 19:42:16 +0000200} // std
201
202*/
203
Louis Dionneb4fce352022-03-25 12:55:36 -0400204#include <__assert> // all public C++ headers provide the assertion handler
Kent Ross0861b0d2021-10-08 14:54:28 -0700205#include <__compare/common_comparison_category.h>
206#include <__compare/synth_three_way.h>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000207#include <__config>
Christopher Di Bella599a6c62021-06-09 23:10:17 +0000208#include <__functional/unwrap_ref.h>
Christopher Di Bella55d7a822021-07-01 09:25:35 -0400209#include <__memory/allocator_arg_t.h>
210#include <__memory/uses_allocator.h>
211#include <__tuple>
Nikolas Klauser23713ea2022-08-13 23:10:31 +0200212#include <__type_traits/maybe_const.h>
Christopher Di Bella41f26e82021-06-05 02:47:47 +0000213#include <__utility/forward.h>
Kent Ross0861b0d2021-10-08 14:54:28 -0700214#include <__utility/integer_sequence.h>
Christopher Di Bella41f26e82021-06-05 02:47:47 +0000215#include <__utility/move.h>
Nikolas Klauser8fccd622022-03-05 19:17:07 +0100216#include <__utility/pair.h>
217#include <__utility/piecewise_construct.h>
218#include <__utility/swap.h>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000219#include <cstddef>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000220#include <type_traits>
Marshall Clow0a1e7502018-09-12 19:41:40 +0000221#include <version>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000222
Mark de Weverf6df9e82022-08-20 10:34:26 +0200223#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
Louis Dionne22355cc2022-06-27 15:53:41 -0400224# include <exception>
225# include <iosfwd>
226# include <new>
227# include <typeinfo>
228# include <utility>
229#endif
230
Nikolas Klausera0e0edb2022-06-16 22:43:46 +0200231// standard-mandated includes
232#include <compare>
233
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000234#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Arthur O'Dwyer6eeaa002022-02-01 20:16:40 -0500235# pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000236#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000237
238_LIBCPP_BEGIN_NAMESPACE_STD
239
Eric Fiselierffe4aba2017-04-19 01:23:39 +0000240#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000241
Marshall Clowf50d66f2014-03-03 06:18:11 +0000242
Howard Hinnantc51e1022010-05-11 19:42:16 +0000243// __tuple_leaf
244
Eric Fiselierf7394302015-06-13 07:08:02 +0000245template <size_t _Ip, class _Hp,
246 bool=is_empty<_Hp>::value && !__libcpp_is_final<_Hp>::value
Howard Hinnantd0aabf82011-12-11 20:31:33 +0000247 >
Howard Hinnantc51e1022010-05-11 19:42:16 +0000248class __tuple_leaf;
249
250template <size_t _Ip, class _Hp, bool _Ep>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200251inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000252void swap(__tuple_leaf<_Ip, _Hp, _Ep>& __x, __tuple_leaf<_Ip, _Hp, _Ep>& __y)
Howard Hinnant89ef1212011-05-27 19:08:18 +0000253 _NOEXCEPT_(__is_nothrow_swappable<_Hp>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000254{
255 swap(__x.get(), __y.get());
256}
257
Hui Xied1637a82022-05-12 13:23:11 +0100258template <size_t _Ip, class _Hp, bool _Ep>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200259_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14
Louis Dionne76450ee2022-06-27 09:36:52 -0400260void swap(const __tuple_leaf<_Ip, _Hp, _Ep>& __x, const __tuple_leaf<_Ip, _Hp, _Ep>& __y)
Hui Xied1637a82022-05-12 13:23:11 +0100261 _NOEXCEPT_(__is_nothrow_swappable<const _Hp>::value) {
262 swap(__x.get(), __y.get());
263}
264
Howard Hinnantc51e1022010-05-11 19:42:16 +0000265template <size_t _Ip, class _Hp, bool>
266class __tuple_leaf
267{
Eric Fiselier3e0d4372017-06-01 02:14:21 +0000268 _Hp __value_;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000269
Eric Fiselierca8bba12016-07-20 02:57:39 +0000270 template <class _Tp>
271 static constexpr bool __can_bind_reference() {
Eric Fiselier869187d2018-01-24 22:14:01 +0000272#if __has_keyword(__reference_binds_to_temporary)
273 return !__reference_binds_to_temporary(_Hp, _Tp);
Eric Fiselier81c32cb2018-01-24 23:10:02 +0000274#else
275 return true;
Eric Fiselier869187d2018-01-24 22:14:01 +0000276#endif
Eric Fiselierca8bba12016-07-20 02:57:39 +0000277 }
278
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200279 _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000280 __tuple_leaf& operator=(const __tuple_leaf&);
281public:
Arthur O'Dwyer20638cc2021-02-09 19:12:16 -0500282 _LIBCPP_INLINE_VISIBILITY constexpr __tuple_leaf()
Eric Fiselier3e0d4372017-06-01 02:14:21 +0000283 _NOEXCEPT_(is_nothrow_default_constructible<_Hp>::value) : __value_()
Howard Hinnantc51e1022010-05-11 19:42:16 +0000284 {static_assert(!is_reference<_Hp>::value,
285 "Attempted to default construct a reference element in a tuple");}
286
287 template <class _Alloc>
Arthur O'Dwyer20638cc2021-02-09 19:12:16 -0500288 _LIBCPP_INLINE_VISIBILITY constexpr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000289 __tuple_leaf(integral_constant<int, 0>, const _Alloc&)
Eric Fiselier3e0d4372017-06-01 02:14:21 +0000290 : __value_()
Howard Hinnantc51e1022010-05-11 19:42:16 +0000291 {static_assert(!is_reference<_Hp>::value,
292 "Attempted to default construct a reference element in a tuple");}
293
294 template <class _Alloc>
Arthur O'Dwyer20638cc2021-02-09 19:12:16 -0500295 _LIBCPP_INLINE_VISIBILITY constexpr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000296 __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a)
Eric Fiselier3e0d4372017-06-01 02:14:21 +0000297 : __value_(allocator_arg_t(), __a)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000298 {static_assert(!is_reference<_Hp>::value,
299 "Attempted to default construct a reference element in a tuple");}
300
301 template <class _Alloc>
Arthur O'Dwyer20638cc2021-02-09 19:12:16 -0500302 _LIBCPP_INLINE_VISIBILITY constexpr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000303 __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a)
Eric Fiselier3e0d4372017-06-01 02:14:21 +0000304 : __value_(__a)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000305 {static_assert(!is_reference<_Hp>::value,
306 "Attempted to default construct a reference element in a tuple");}
307
Howard Hinnant693fc212010-09-27 17:54:17 +0000308 template <class _Tp,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400309 class = __enable_if_t<
Eric Fiselier3906a132019-06-23 20:28:29 +0000310 _And<
311 _IsNotSame<__uncvref_t<_Tp>, __tuple_leaf>,
312 is_constructible<_Hp, _Tp>
Eric Fiselier42fa85e2014-07-24 18:48:34 +0000313 >::value
Eric Fiselier3906a132019-06-23 20:28:29 +0000314 >
Eric Fiselier42fa85e2014-07-24 18:48:34 +0000315 >
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200316 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnant62751642012-07-06 21:53:48 +0000317 explicit __tuple_leaf(_Tp&& __t) _NOEXCEPT_((is_nothrow_constructible<_Hp, _Tp>::value))
Eric Fiselier3e0d4372017-06-01 02:14:21 +0000318 : __value_(_VSTD::forward<_Tp>(__t))
Eric Fiselier869187d2018-01-24 22:14:01 +0000319 {static_assert(__can_bind_reference<_Tp&&>(),
320 "Attempted construction of reference element binds to a temporary whose lifetime has ended");}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000321
322 template <class _Tp, class _Alloc>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200323 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000324 explicit __tuple_leaf(integral_constant<int, 0>, const _Alloc&, _Tp&& __t)
Eric Fiselier3e0d4372017-06-01 02:14:21 +0000325 : __value_(_VSTD::forward<_Tp>(__t))
Eric Fiselier869187d2018-01-24 22:14:01 +0000326 {static_assert(__can_bind_reference<_Tp&&>(),
327 "Attempted construction of reference element binds to a temporary whose lifetime has ended");}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000328
329 template <class _Tp, class _Alloc>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200330 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000331 explicit __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a, _Tp&& __t)
Eric Fiselier3e0d4372017-06-01 02:14:21 +0000332 : __value_(allocator_arg_t(), __a, _VSTD::forward<_Tp>(__t))
Eric Fiselierca8bba12016-07-20 02:57:39 +0000333 {static_assert(!is_reference<_Hp>::value,
334 "Attempted to uses-allocator construct a reference element in a tuple");}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000335
336 template <class _Tp, class _Alloc>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200337 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000338 explicit __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a, _Tp&& __t)
Eric Fiselier3e0d4372017-06-01 02:14:21 +0000339 : __value_(_VSTD::forward<_Tp>(__t), __a)
Eric Fiselierca8bba12016-07-20 02:57:39 +0000340 {static_assert(!is_reference<_Hp>::value,
341 "Attempted to uses-allocator construct a reference element in a tuple");}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000342
Marshall Clow47fcee52014-04-21 23:48:09 +0000343 __tuple_leaf(const __tuple_leaf& __t) = default;
344 __tuple_leaf(__tuple_leaf&& __t) = default;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000345
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200346 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnant89ef1212011-05-27 19:08:18 +0000347 int swap(__tuple_leaf& __t) _NOEXCEPT_(__is_nothrow_swappable<__tuple_leaf>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000348 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000349 _VSTD::swap(*this, __t);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000350 return 0;
351 }
352
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200353 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Hui Xied1637a82022-05-12 13:23:11 +0100354 int swap(const __tuple_leaf& __t) const _NOEXCEPT_(__is_nothrow_swappable<const __tuple_leaf>::value) {
355 _VSTD::swap(*this, __t);
356 return 0;
357 }
358
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200359 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 _Hp& get() _NOEXCEPT {return __value_;}
360 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 const _Hp& get() const _NOEXCEPT {return __value_;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000361};
362
363template <size_t _Ip, class _Hp>
364class __tuple_leaf<_Ip, _Hp, true>
365 : private _Hp
366{
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200367 _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000368 __tuple_leaf& operator=(const __tuple_leaf&);
369public:
Arthur O'Dwyer20638cc2021-02-09 19:12:16 -0500370 _LIBCPP_INLINE_VISIBILITY constexpr __tuple_leaf()
Howard Hinnantaabb4202012-07-06 20:50:27 +0000371 _NOEXCEPT_(is_nothrow_default_constructible<_Hp>::value) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000372
373 template <class _Alloc>
Arthur O'Dwyer20638cc2021-02-09 19:12:16 -0500374 _LIBCPP_INLINE_VISIBILITY constexpr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000375 __tuple_leaf(integral_constant<int, 0>, const _Alloc&) {}
376
377 template <class _Alloc>
Arthur O'Dwyer20638cc2021-02-09 19:12:16 -0500378 _LIBCPP_INLINE_VISIBILITY constexpr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000379 __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a)
380 : _Hp(allocator_arg_t(), __a) {}
381
382 template <class _Alloc>
Arthur O'Dwyer20638cc2021-02-09 19:12:16 -0500383 _LIBCPP_INLINE_VISIBILITY constexpr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000384 __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a)
385 : _Hp(__a) {}
386
Howard Hinnant693fc212010-09-27 17:54:17 +0000387 template <class _Tp,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400388 class = __enable_if_t<
Eric Fiselier3906a132019-06-23 20:28:29 +0000389 _And<
390 _IsNotSame<__uncvref_t<_Tp>, __tuple_leaf>,
391 is_constructible<_Hp, _Tp>
392 >::value
393 >
Eric Fiselier42fa85e2014-07-24 18:48:34 +0000394 >
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200395 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnant62751642012-07-06 21:53:48 +0000396 explicit __tuple_leaf(_Tp&& __t) _NOEXCEPT_((is_nothrow_constructible<_Hp, _Tp>::value))
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000397 : _Hp(_VSTD::forward<_Tp>(__t)) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000398
399 template <class _Tp, class _Alloc>
Arthur O'Dwyer20638cc2021-02-09 19:12:16 -0500400 _LIBCPP_INLINE_VISIBILITY constexpr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000401 explicit __tuple_leaf(integral_constant<int, 0>, const _Alloc&, _Tp&& __t)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000402 : _Hp(_VSTD::forward<_Tp>(__t)) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000403
404 template <class _Tp, class _Alloc>
Arthur O'Dwyer20638cc2021-02-09 19:12:16 -0500405 _LIBCPP_INLINE_VISIBILITY constexpr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000406 explicit __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a, _Tp&& __t)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000407 : _Hp(allocator_arg_t(), __a, _VSTD::forward<_Tp>(__t)) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000408
409 template <class _Tp, class _Alloc>
Arthur O'Dwyer20638cc2021-02-09 19:12:16 -0500410 _LIBCPP_INLINE_VISIBILITY constexpr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000411 explicit __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a, _Tp&& __t)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000412 : _Hp(_VSTD::forward<_Tp>(__t), __a) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000413
Eric Fiselier42fa85e2014-07-24 18:48:34 +0000414 __tuple_leaf(__tuple_leaf const &) = default;
415 __tuple_leaf(__tuple_leaf &&) = default;
416
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200417 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnant89ef1212011-05-27 19:08:18 +0000418 int
419 swap(__tuple_leaf& __t) _NOEXCEPT_(__is_nothrow_swappable<__tuple_leaf>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000420 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000421 _VSTD::swap(*this, __t);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000422 return 0;
423 }
424
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200425 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Hui Xied1637a82022-05-12 13:23:11 +0100426 int swap(const __tuple_leaf& __rhs) const _NOEXCEPT_(__is_nothrow_swappable<const __tuple_leaf>::value) {
427 _VSTD::swap(*this, __rhs);
428 return 0;
429 }
430
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200431 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 _Hp& get() _NOEXCEPT {return static_cast<_Hp&>(*this);}
432 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 const _Hp& get() const _NOEXCEPT {return static_cast<const _Hp&>(*this);}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000433};
434
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000435template <class ..._Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200436_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnant62751642012-07-06 21:53:48 +0000437void __swallow(_Tp&&...) _NOEXCEPT {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000438
Marshall Clowc470eae2014-10-15 10:33:02 +0000439template <class _Tp>
440struct __all_default_constructible;
Howard Hinnant89ef1212011-05-27 19:08:18 +0000441
Marshall Clowc470eae2014-10-15 10:33:02 +0000442template <class ..._Tp>
443struct __all_default_constructible<__tuple_types<_Tp...>>
444 : __all<is_default_constructible<_Tp>::value...>
445{ };
Howard Hinnant89ef1212011-05-27 19:08:18 +0000446
Howard Hinnantc51e1022010-05-11 19:42:16 +0000447// __tuple_impl
448
449template<class _Indx, class ..._Tp> struct __tuple_impl;
450
451template<size_t ..._Indx, class ..._Tp>
Eric Fiseliere3cec5f2017-01-16 21:15:08 +0000452struct _LIBCPP_DECLSPEC_EMPTY_BASES __tuple_impl<__tuple_indices<_Indx...>, _Tp...>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000453 : public __tuple_leaf<_Indx, _Tp>...
454{
Howard Hinnant38469632012-07-06 20:39:45 +0000455 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer20638cc2021-02-09 19:12:16 -0500456 constexpr __tuple_impl()
Howard Hinnantaabb4202012-07-06 20:50:27 +0000457 _NOEXCEPT_(__all<is_nothrow_default_constructible<_Tp>::value...>::value) {}
Howard Hinnant38469632012-07-06 20:39:45 +0000458
Howard Hinnantc51e1022010-05-11 19:42:16 +0000459 template <size_t ..._Uf, class ..._Tf,
460 size_t ..._Ul, class ..._Tl, class ..._Up>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200461 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000462 explicit
463 __tuple_impl(__tuple_indices<_Uf...>, __tuple_types<_Tf...>,
464 __tuple_indices<_Ul...>, __tuple_types<_Tl...>,
Howard Hinnant62751642012-07-06 21:53:48 +0000465 _Up&&... __u)
466 _NOEXCEPT_((__all<is_nothrow_constructible<_Tf, _Up>::value...>::value &&
467 __all<is_nothrow_default_constructible<_Tl>::value...>::value)) :
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000468 __tuple_leaf<_Uf, _Tf>(_VSTD::forward<_Up>(__u))...,
Howard Hinnantc51e1022010-05-11 19:42:16 +0000469 __tuple_leaf<_Ul, _Tl>()...
470 {}
471
472 template <class _Alloc, size_t ..._Uf, class ..._Tf,
473 size_t ..._Ul, class ..._Tl, class ..._Up>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200474 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000475 explicit
476 __tuple_impl(allocator_arg_t, const _Alloc& __a,
477 __tuple_indices<_Uf...>, __tuple_types<_Tf...>,
478 __tuple_indices<_Ul...>, __tuple_types<_Tl...>,
479 _Up&&... __u) :
480 __tuple_leaf<_Uf, _Tf>(__uses_alloc_ctor<_Tf, _Alloc, _Up>(), __a,
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000481 _VSTD::forward<_Up>(__u))...,
Howard Hinnantc51e1022010-05-11 19:42:16 +0000482 __tuple_leaf<_Ul, _Tl>(__uses_alloc_ctor<_Tl, _Alloc>(), __a)...
483 {}
484
485 template <class _Tuple,
Nikolas Klauser7537c9c2022-07-04 01:21:44 +0200486 class = __enable_if_t<__tuple_constructible<_Tuple, tuple<_Tp...> >::value>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000487 >
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200488 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnant62751642012-07-06 21:53:48 +0000489 __tuple_impl(_Tuple&& __t) _NOEXCEPT_((__all<is_nothrow_constructible<_Tp, typename tuple_element<_Indx,
490 typename __make_tuple_types<_Tuple>::type>::type>::value...>::value))
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000491 : __tuple_leaf<_Indx, _Tp>(_VSTD::forward<typename tuple_element<_Indx,
492 typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<_Indx>(__t)))...
Howard Hinnantc51e1022010-05-11 19:42:16 +0000493 {}
494
495 template <class _Alloc, class _Tuple,
Nikolas Klauser7537c9c2022-07-04 01:21:44 +0200496 class = __enable_if_t<__tuple_constructible<_Tuple, tuple<_Tp...> >::value>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000497 >
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200498 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000499 __tuple_impl(allocator_arg_t, const _Alloc& __a, _Tuple&& __t)
500 : __tuple_leaf<_Indx, _Tp>(__uses_alloc_ctor<_Tp, _Alloc, typename tuple_element<_Indx,
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000501 typename __make_tuple_types<_Tuple>::type>::type>(), __a,
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000502 _VSTD::forward<typename tuple_element<_Indx,
503 typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<_Indx>(__t)))...
Howard Hinnantc51e1022010-05-11 19:42:16 +0000504 {}
505
Howard Hinnant0d032d12013-11-06 17:45:43 +0000506 __tuple_impl(const __tuple_impl&) = default;
507 __tuple_impl(__tuple_impl&&) = default;
508
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200509 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000510 void swap(__tuple_impl& __t)
Howard Hinnant89ef1212011-05-27 19:08:18 +0000511 _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000512 {
Louis Dionne6c0d5342018-07-31 11:56:20 -0400513 _VSTD::__swallow(__tuple_leaf<_Indx, _Tp>::swap(static_cast<__tuple_leaf<_Indx, _Tp>&>(__t))...);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000514 }
Hui Xied1637a82022-05-12 13:23:11 +0100515
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200516 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Hui Xied1637a82022-05-12 13:23:11 +0100517 void swap(const __tuple_impl& __t) const
518 _NOEXCEPT_(__all<__is_nothrow_swappable<const _Tp>::value...>::value)
519 {
520 _VSTD::__swallow(__tuple_leaf<_Indx, _Tp>::swap(static_cast<const __tuple_leaf<_Indx, _Tp>&>(__t))...);
521 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000522};
523
Louis Dionne6c0d5342018-07-31 11:56:20 -0400524template<class _Dest, class _Source, size_t ..._Np>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200525_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Louis Dionne6c0d5342018-07-31 11:56:20 -0400526void __memberwise_copy_assign(_Dest& __dest, _Source const& __source, __tuple_indices<_Np...>) {
527 _VSTD::__swallow(((_VSTD::get<_Np>(__dest) = _VSTD::get<_Np>(__source)), void(), 0)...);
528}
Eric Fiselier264d04a2016-04-15 18:05:59 +0000529
Louis Dionne6c0d5342018-07-31 11:56:20 -0400530template<class _Dest, class _Source, class ..._Up, size_t ..._Np>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200531_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Louis Dionne6c0d5342018-07-31 11:56:20 -0400532void __memberwise_forward_assign(_Dest& __dest, _Source&& __source, __tuple_types<_Up...>, __tuple_indices<_Np...>) {
533 _VSTD::__swallow(((
Louis Dionne3b8af4d2021-02-24 14:53:21 -0500534 _VSTD::get<_Np>(__dest) = _VSTD::forward<_Up>(_VSTD::get<_Np>(__source))
Louis Dionne6c0d5342018-07-31 11:56:20 -0400535 ), void(), 0)...);
536}
Eric Fiselier264d04a2016-04-15 18:05:59 +0000537
Howard Hinnantc51e1022010-05-11 19:42:16 +0000538template <class ..._Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000539class _LIBCPP_TEMPLATE_VIS tuple
Howard Hinnantc51e1022010-05-11 19:42:16 +0000540{
Eric Fiselier3e0d4372017-06-01 02:14:21 +0000541 typedef __tuple_impl<typename __make_tuple_indices<sizeof...(_Tp)>::type, _Tp...> _BaseT;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000542
Eric Fiselier3e0d4372017-06-01 02:14:21 +0000543 _BaseT __base_;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000544
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200545 template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnant28b24882011-12-01 20:21:04 +0000546 typename tuple_element<_Jp, tuple<_Up...> >::type& get(tuple<_Up...>&) _NOEXCEPT;
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200547 template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnant28b24882011-12-01 20:21:04 +0000548 const typename tuple_element<_Jp, tuple<_Up...> >::type& get(const tuple<_Up...>&) _NOEXCEPT;
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200549 template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnant28b24882011-12-01 20:21:04 +0000550 typename tuple_element<_Jp, tuple<_Up...> >::type&& get(tuple<_Up...>&&) _NOEXCEPT;
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200551 template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_SINCE_CXX14
Eric Fiselier6dea8092015-12-18 00:36:55 +0000552 const typename tuple_element<_Jp, tuple<_Up...> >::type&& get(const tuple<_Up...>&&) _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000553public:
Louis Dionne574e2e32021-02-10 16:19:50 -0500554 // [tuple.cnstr]
Howard Hinnantc51e1022010-05-11 19:42:16 +0000555
Louis Dionne574e2e32021-02-10 16:19:50 -0500556 // tuple() constructors (including allocator_arg_t variants)
Louis Dionne9ce598d2021-09-08 09:14:43 -0400557 template <template<class...> class _IsImpDefault = __is_implicitly_default_constructible, __enable_if_t<
Louis Dionne574e2e32021-02-10 16:19:50 -0500558 _And<
559 _IsImpDefault<_Tp>... // explicit check
560 >::value
561 , int> = 0>
Louis Dionne58bca852021-04-30 15:52:26 -0400562 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Louis Dionnea7a2beb2019-09-26 14:51:10 +0000563 tuple()
Louis Dionne574e2e32021-02-10 16:19:50 -0500564 _NOEXCEPT_(_And<is_nothrow_default_constructible<_Tp>...>::value)
565 { }
Louis Dionnea7a2beb2019-09-26 14:51:10 +0000566
Louis Dionne574e2e32021-02-10 16:19:50 -0500567 template <template<class...> class _IsImpDefault = __is_implicitly_default_constructible,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400568 template<class...> class _IsDefault = is_default_constructible, __enable_if_t<
Louis Dionne574e2e32021-02-10 16:19:50 -0500569 _And<
570 _IsDefault<_Tp>...,
571 _Not<_Lazy<_And, _IsImpDefault<_Tp>...> > // explicit check
572 >::value
573 , int> = 0>
574 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
575 explicit tuple()
576 _NOEXCEPT_(_And<is_nothrow_default_constructible<_Tp>...>::value)
577 { }
Howard Hinnant38469632012-07-06 20:39:45 +0000578
Louis Dionne9ce598d2021-09-08 09:14:43 -0400579 template <class _Alloc, template<class...> class _IsImpDefault = __is_implicitly_default_constructible, __enable_if_t<
Louis Dionne574e2e32021-02-10 16:19:50 -0500580 _And<
581 _IsImpDefault<_Tp>... // explicit check
582 >::value
583 , int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200584 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne574e2e32021-02-10 16:19:50 -0500585 tuple(allocator_arg_t, _Alloc const& __a)
586 : __base_(allocator_arg_t(), __a,
587 __tuple_indices<>(), __tuple_types<>(),
588 typename __make_tuple_indices<sizeof...(_Tp), 0>::type(),
589 __tuple_types<_Tp...>()) {}
590
591 template <class _Alloc,
592 template<class...> class _IsImpDefault = __is_implicitly_default_constructible,
Louis Dionne9ce598d2021-09-08 09:14:43 -0400593 template<class...> class _IsDefault = is_default_constructible, __enable_if_t<
Louis Dionne574e2e32021-02-10 16:19:50 -0500594 _And<
595 _IsDefault<_Tp>...,
596 _Not<_Lazy<_And, _IsImpDefault<_Tp>...> > // explicit check
597 >::value
598 , int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200599 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne574e2e32021-02-10 16:19:50 -0500600 explicit tuple(allocator_arg_t, _Alloc const& __a)
601 : __base_(allocator_arg_t(), __a,
602 __tuple_indices<>(), __tuple_types<>(),
603 typename __make_tuple_indices<sizeof...(_Tp), 0>::type(),
604 __tuple_types<_Tp...>()) {}
605
606 // tuple(const T&...) constructors (including allocator_arg_t variants)
Louis Dionne9ce598d2021-09-08 09:14:43 -0400607 template <template<class...> class _And = _And, __enable_if_t<
Louis Dionne574e2e32021-02-10 16:19:50 -0500608 _And<
609 _BoolConstant<sizeof...(_Tp) >= 1>,
610 is_copy_constructible<_Tp>...,
611 is_convertible<const _Tp&, _Tp>... // explicit check
612 >::value
613 , int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200614 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Louis Dionne574e2e32021-02-10 16:19:50 -0500615 tuple(const _Tp& ... __t)
616 _NOEXCEPT_(_And<is_nothrow_copy_constructible<_Tp>...>::value)
617 : __base_(typename __make_tuple_indices<sizeof...(_Tp)>::type(),
618 typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(),
619 typename __make_tuple_indices<0>::type(),
620 typename __make_tuple_types<tuple, 0>::type(),
621 __t...
622 ) {}
623
Louis Dionne9ce598d2021-09-08 09:14:43 -0400624 template <template<class...> class _And = _And, __enable_if_t<
Louis Dionne574e2e32021-02-10 16:19:50 -0500625 _And<
626 _BoolConstant<sizeof...(_Tp) >= 1>,
627 is_copy_constructible<_Tp>...,
628 _Not<_Lazy<_And, is_convertible<const _Tp&, _Tp>...> > // explicit check
629 >::value
630 , int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200631 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Louis Dionne574e2e32021-02-10 16:19:50 -0500632 explicit tuple(const _Tp& ... __t)
633 _NOEXCEPT_(_And<is_nothrow_copy_constructible<_Tp>...>::value)
634 : __base_(typename __make_tuple_indices<sizeof...(_Tp)>::type(),
635 typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(),
636 typename __make_tuple_indices<0>::type(),
637 typename __make_tuple_types<tuple, 0>::type(),
638 __t...
639 ) {}
640
Louis Dionne9ce598d2021-09-08 09:14:43 -0400641 template <class _Alloc, template<class...> class _And = _And, __enable_if_t<
Louis Dionne574e2e32021-02-10 16:19:50 -0500642 _And<
643 _BoolConstant<sizeof...(_Tp) >= 1>,
644 is_copy_constructible<_Tp>...,
645 is_convertible<const _Tp&, _Tp>... // explicit check
646 >::value
647 , int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200648 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne574e2e32021-02-10 16:19:50 -0500649 tuple(allocator_arg_t, const _Alloc& __a, const _Tp& ... __t)
650 : __base_(allocator_arg_t(), __a,
651 typename __make_tuple_indices<sizeof...(_Tp)>::type(),
652 typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(),
653 typename __make_tuple_indices<0>::type(),
654 typename __make_tuple_types<tuple, 0>::type(),
655 __t...
656 ) {}
657
Louis Dionne9ce598d2021-09-08 09:14:43 -0400658 template <class _Alloc, template<class...> class _And = _And, __enable_if_t<
Louis Dionne574e2e32021-02-10 16:19:50 -0500659 _And<
660 _BoolConstant<sizeof...(_Tp) >= 1>,
661 is_copy_constructible<_Tp>...,
662 _Not<_Lazy<_And, is_convertible<const _Tp&, _Tp>...> > // explicit check
663 >::value
664 , int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200665 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne574e2e32021-02-10 16:19:50 -0500666 explicit tuple(allocator_arg_t, const _Alloc& __a, const _Tp& ... __t)
667 : __base_(allocator_arg_t(), __a,
668 typename __make_tuple_indices<sizeof...(_Tp)>::type(),
669 typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(),
670 typename __make_tuple_indices<0>::type(),
671 typename __make_tuple_types<tuple, 0>::type(),
672 __t...
673 ) {}
674
675 // tuple(U&& ...) constructors (including allocator_arg_t variants)
676 template <class ..._Up> struct _IsThisTuple : false_type { };
677 template <class _Up> struct _IsThisTuple<_Up> : is_same<__uncvref_t<_Up>, tuple> { };
678
679 template <class ..._Up>
680 struct _EnableUTypesCtor : _And<
681 _BoolConstant<sizeof...(_Tp) >= 1>,
682 _Not<_IsThisTuple<_Up...> >, // extension to allow mis-behaved user constructors
683 is_constructible<_Tp, _Up>...
684 > { };
685
Louis Dionne9ce598d2021-09-08 09:14:43 -0400686 template <class ..._Up, __enable_if_t<
Louis Dionne574e2e32021-02-10 16:19:50 -0500687 _And<
688 _BoolConstant<sizeof...(_Up) == sizeof...(_Tp)>,
689 _EnableUTypesCtor<_Up...>,
690 is_convertible<_Up, _Tp>... // explicit check
691 >::value
692 , int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200693 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Louis Dionne574e2e32021-02-10 16:19:50 -0500694 tuple(_Up&&... __u)
695 _NOEXCEPT_((_And<is_nothrow_constructible<_Tp, _Up>...>::value))
696 : __base_(typename __make_tuple_indices<sizeof...(_Up)>::type(),
697 typename __make_tuple_types<tuple, sizeof...(_Up)>::type(),
698 typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(),
699 typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(),
700 _VSTD::forward<_Up>(__u)...) {}
701
Louis Dionne9ce598d2021-09-08 09:14:43 -0400702 template <class ..._Up, __enable_if_t<
Louis Dionne574e2e32021-02-10 16:19:50 -0500703 _And<
704 _BoolConstant<sizeof...(_Up) == sizeof...(_Tp)>,
705 _EnableUTypesCtor<_Up...>,
706 _Not<_Lazy<_And, is_convertible<_Up, _Tp>...> > // explicit check
707 >::value
708 , int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200709 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Louis Dionne574e2e32021-02-10 16:19:50 -0500710 explicit tuple(_Up&&... __u)
711 _NOEXCEPT_((_And<is_nothrow_constructible<_Tp, _Up>...>::value))
712 : __base_(typename __make_tuple_indices<sizeof...(_Up)>::type(),
713 typename __make_tuple_types<tuple, sizeof...(_Up)>::type(),
714 typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(),
715 typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(),
716 _VSTD::forward<_Up>(__u)...) {}
717
Louis Dionne9ce598d2021-09-08 09:14:43 -0400718 template <class _Alloc, class ..._Up, __enable_if_t<
Louis Dionne574e2e32021-02-10 16:19:50 -0500719 _And<
720 _BoolConstant<sizeof...(_Up) == sizeof...(_Tp)>,
721 _EnableUTypesCtor<_Up...>,
722 is_convertible<_Up, _Tp>... // explicit check
723 >::value
724 , int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200725 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne574e2e32021-02-10 16:19:50 -0500726 tuple(allocator_arg_t, const _Alloc& __a, _Up&&... __u)
727 : __base_(allocator_arg_t(), __a,
728 typename __make_tuple_indices<sizeof...(_Up)>::type(),
729 typename __make_tuple_types<tuple, sizeof...(_Up)>::type(),
730 typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(),
731 typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(),
732 _VSTD::forward<_Up>(__u)...) {}
733
Louis Dionne9ce598d2021-09-08 09:14:43 -0400734 template <class _Alloc, class ..._Up, __enable_if_t<
Louis Dionne574e2e32021-02-10 16:19:50 -0500735 _And<
736 _BoolConstant<sizeof...(_Up) == sizeof...(_Tp)>,
737 _EnableUTypesCtor<_Up...>,
738 _Not<_Lazy<_And, is_convertible<_Up, _Tp>...> > // explicit check
739 >::value
740 , int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200741 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne574e2e32021-02-10 16:19:50 -0500742 explicit tuple(allocator_arg_t, const _Alloc& __a, _Up&&... __u)
743 : __base_(allocator_arg_t(), __a,
744 typename __make_tuple_indices<sizeof...(_Up)>::type(),
745 typename __make_tuple_types<tuple, sizeof...(_Up)>::type(),
746 typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(),
747 typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(),
748 _VSTD::forward<_Up>(__u)...) {}
749
750 // Copy and move constructors (including the allocator_arg_t variants)
751 tuple(const tuple&) = default;
Eric Fiselier737a16d2016-07-25 02:36:42 +0000752 tuple(tuple&&) = default;
753
Louis Dionne9ce598d2021-09-08 09:14:43 -0400754 template <class _Alloc, template<class...> class _And = _And, __enable_if_t<
Louis Dionne574e2e32021-02-10 16:19:50 -0500755 _And<is_copy_constructible<_Tp>...>::value
756 , int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200757 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne574e2e32021-02-10 16:19:50 -0500758 tuple(allocator_arg_t, const _Alloc& __alloc, const tuple& __t)
759 : __base_(allocator_arg_t(), __alloc, __t)
760 { }
761
Louis Dionne9ce598d2021-09-08 09:14:43 -0400762 template <class _Alloc, template<class...> class _And = _And, __enable_if_t<
Louis Dionne574e2e32021-02-10 16:19:50 -0500763 _And<is_move_constructible<_Tp>...>::value
764 , int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200765 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne574e2e32021-02-10 16:19:50 -0500766 tuple(allocator_arg_t, const _Alloc& __alloc, tuple&& __t)
767 : __base_(allocator_arg_t(), __alloc, _VSTD::move(__t))
768 { }
769
770 // tuple(const tuple<U...>&) constructors (including allocator_arg_t variants)
Louis Dionne76450ee2022-06-27 09:36:52 -0400771
Hui Xied1637a82022-05-12 13:23:11 +0100772 template <class _OtherTuple, class _DecayedOtherTuple = __uncvref_t<_OtherTuple>, class = void>
773 struct _EnableCtorFromUTypesTuple : false_type {};
774
775 template <class _OtherTuple, class... _Up>
Louis Dionne76450ee2022-06-27 09:36:52 -0400776 struct _EnableCtorFromUTypesTuple<_OtherTuple, tuple<_Up...>,
Hui Xied1637a82022-05-12 13:23:11 +0100777 // the length of the packs needs to checked first otherwise the 2 packs cannot be expanded simultaneously below
778 __enable_if_t<sizeof...(_Up) == sizeof...(_Tp)>> : _And<
779 // the two conditions below are not in spec. The purpose is to disable the UTypes Ctor when copy/move Ctor can work.
780 // Otherwise, is_constructible can trigger hard error in those cases https://godbolt.org/z/M94cGdKcE
781 _Not<is_same<_OtherTuple, const tuple&> >,
782 _Not<is_same<_OtherTuple, tuple&&> >,
783 is_constructible<_Tp, __copy_cvref_t<_OtherTuple, _Up> >...,
784 _Lazy<_Or, _BoolConstant<sizeof...(_Tp) != 1>,
Louis Dionne574e2e32021-02-10 16:19:50 -0500785 // _Tp and _Up are 1-element packs - the pack expansions look
786 // weird to avoid tripping up the type traits in degenerate cases
787 _Lazy<_And,
Hui Xied1637a82022-05-12 13:23:11 +0100788 _Not<is_same<_Tp, _Up> >...,
789 _Not<is_convertible<_OtherTuple, _Tp> >...,
790 _Not<is_constructible<_Tp, _OtherTuple> >...
Louis Dionne574e2e32021-02-10 16:19:50 -0500791 >
Hui Xied1637a82022-05-12 13:23:11 +0100792 >
793 > {};
Louis Dionne574e2e32021-02-10 16:19:50 -0500794
Louis Dionne9ce598d2021-09-08 09:14:43 -0400795 template <class ..._Up, __enable_if_t<
Louis Dionne574e2e32021-02-10 16:19:50 -0500796 _And<
Hui Xied1637a82022-05-12 13:23:11 +0100797 _EnableCtorFromUTypesTuple<const tuple<_Up...>&>,
Louis Dionne574e2e32021-02-10 16:19:50 -0500798 is_convertible<const _Up&, _Tp>... // explicit check
799 >::value
800 , int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200801 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Louis Dionne574e2e32021-02-10 16:19:50 -0500802 tuple(const tuple<_Up...>& __t)
803 _NOEXCEPT_((_And<is_nothrow_constructible<_Tp, const _Up&>...>::value))
804 : __base_(__t)
805 { }
806
Louis Dionne9ce598d2021-09-08 09:14:43 -0400807 template <class ..._Up, __enable_if_t<
Louis Dionne574e2e32021-02-10 16:19:50 -0500808 _And<
Hui Xied1637a82022-05-12 13:23:11 +0100809 _EnableCtorFromUTypesTuple<const tuple<_Up...>&>,
Louis Dionne574e2e32021-02-10 16:19:50 -0500810 _Not<_Lazy<_And, is_convertible<const _Up&, _Tp>...> > // explicit check
811 >::value
812 , int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200813 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Louis Dionne574e2e32021-02-10 16:19:50 -0500814 explicit tuple(const tuple<_Up...>& __t)
815 _NOEXCEPT_((_And<is_nothrow_constructible<_Tp, const _Up&>...>::value))
816 : __base_(__t)
817 { }
818
Louis Dionne9ce598d2021-09-08 09:14:43 -0400819 template <class ..._Up, class _Alloc, __enable_if_t<
Louis Dionne574e2e32021-02-10 16:19:50 -0500820 _And<
Hui Xied1637a82022-05-12 13:23:11 +0100821 _EnableCtorFromUTypesTuple<const tuple<_Up...>&>,
Louis Dionne574e2e32021-02-10 16:19:50 -0500822 is_convertible<const _Up&, _Tp>... // explicit check
823 >::value
824 , int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200825 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne574e2e32021-02-10 16:19:50 -0500826 tuple(allocator_arg_t, const _Alloc& __a, const tuple<_Up...>& __t)
827 : __base_(allocator_arg_t(), __a, __t)
828 { }
Eric Fiselierc170df52016-04-15 03:29:40 +0000829
Louis Dionne9ce598d2021-09-08 09:14:43 -0400830 template <class ..._Up, class _Alloc, __enable_if_t<
Louis Dionne574e2e32021-02-10 16:19:50 -0500831 _And<
Hui Xied1637a82022-05-12 13:23:11 +0100832 _EnableCtorFromUTypesTuple<const tuple<_Up...>&>,
Louis Dionne574e2e32021-02-10 16:19:50 -0500833 _Not<_Lazy<_And, is_convertible<const _Up&, _Tp>...> > // explicit check
834 >::value
835 , int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200836 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne574e2e32021-02-10 16:19:50 -0500837 explicit tuple(allocator_arg_t, const _Alloc& __a, const tuple<_Up...>& __t)
838 : __base_(allocator_arg_t(), __a, __t)
839 { }
Louis Dionne668a50c2019-09-27 15:06:52 +0000840
Hui Xied1637a82022-05-12 13:23:11 +0100841#if _LIBCPP_STD_VER > 20
842 // tuple(tuple<U...>&) constructors (including allocator_arg_t variants)
843
844 template <class... _Up, enable_if_t<
845 _EnableCtorFromUTypesTuple<tuple<_Up...>&>::value>* = nullptr>
846 _LIBCPP_HIDE_FROM_ABI constexpr
847 explicit(!(is_convertible_v<_Up&, _Tp> && ...))
848 tuple(tuple<_Up...>& __t) : __base_(__t) {}
849
850 template <class _Alloc, class... _Up, enable_if_t<
851 _EnableCtorFromUTypesTuple<tuple<_Up...>&>::value>* = nullptr>
852 _LIBCPP_HIDE_FROM_ABI constexpr
853 explicit(!(is_convertible_v<_Up&, _Tp> && ...))
854 tuple(allocator_arg_t, const _Alloc& __alloc, tuple<_Up...>& __t) : __base_(allocator_arg_t(), __alloc, __t) {}
855#endif // _LIBCPP_STD_VER > 20
856
Louis Dionne574e2e32021-02-10 16:19:50 -0500857 // tuple(tuple<U...>&&) constructors (including allocator_arg_t variants)
Louis Dionne574e2e32021-02-10 16:19:50 -0500858
Louis Dionne9ce598d2021-09-08 09:14:43 -0400859 template <class ..._Up, __enable_if_t<
Louis Dionne574e2e32021-02-10 16:19:50 -0500860 _And<
Hui Xied1637a82022-05-12 13:23:11 +0100861 _EnableCtorFromUTypesTuple<tuple<_Up...>&&>,
Louis Dionne574e2e32021-02-10 16:19:50 -0500862 is_convertible<_Up, _Tp>... // explicit check
863 >::value
864 , int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200865 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Louis Dionne574e2e32021-02-10 16:19:50 -0500866 tuple(tuple<_Up...>&& __t)
867 _NOEXCEPT_((_And<is_nothrow_constructible<_Tp, _Up>...>::value))
868 : __base_(_VSTD::move(__t))
869 { }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000870
Louis Dionne9ce598d2021-09-08 09:14:43 -0400871 template <class ..._Up, __enable_if_t<
Louis Dionne574e2e32021-02-10 16:19:50 -0500872 _And<
Hui Xied1637a82022-05-12 13:23:11 +0100873 _EnableCtorFromUTypesTuple<tuple<_Up...>&&>,
Louis Dionne574e2e32021-02-10 16:19:50 -0500874 _Not<_Lazy<_And, is_convertible<_Up, _Tp>...> > // explicit check
875 >::value
876 , int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200877 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Louis Dionne574e2e32021-02-10 16:19:50 -0500878 explicit tuple(tuple<_Up...>&& __t)
879 _NOEXCEPT_((_And<is_nothrow_constructible<_Tp, _Up>...>::value))
880 : __base_(_VSTD::move(__t))
881 { }
Eric Fiselier8e6a5f02016-04-19 01:19:25 +0000882
Louis Dionne9ce598d2021-09-08 09:14:43 -0400883 template <class _Alloc, class ..._Up, __enable_if_t<
Louis Dionne574e2e32021-02-10 16:19:50 -0500884 _And<
Hui Xied1637a82022-05-12 13:23:11 +0100885 _EnableCtorFromUTypesTuple<tuple<_Up...>&&>,
Louis Dionne574e2e32021-02-10 16:19:50 -0500886 is_convertible<_Up, _Tp>... // explicit check
887 >::value
888 , int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200889 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne574e2e32021-02-10 16:19:50 -0500890 tuple(allocator_arg_t, const _Alloc& __a, tuple<_Up...>&& __t)
891 : __base_(allocator_arg_t(), __a, _VSTD::move(__t))
892 { }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000893
Louis Dionne9ce598d2021-09-08 09:14:43 -0400894 template <class _Alloc, class ..._Up, __enable_if_t<
Louis Dionne574e2e32021-02-10 16:19:50 -0500895 _And<
Hui Xied1637a82022-05-12 13:23:11 +0100896 _EnableCtorFromUTypesTuple<tuple<_Up...>&&>,
Louis Dionne574e2e32021-02-10 16:19:50 -0500897 _Not<_Lazy<_And, is_convertible<_Up, _Tp>...> > // explicit check
898 >::value
899 , int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200900 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne574e2e32021-02-10 16:19:50 -0500901 explicit tuple(allocator_arg_t, const _Alloc& __a, tuple<_Up...>&& __t)
902 : __base_(allocator_arg_t(), __a, _VSTD::move(__t))
903 { }
Eric Fiselier8e6a5f02016-04-19 01:19:25 +0000904
Hui Xied1637a82022-05-12 13:23:11 +0100905#if _LIBCPP_STD_VER > 20
906 // tuple(const tuple<U...>&&) constructors (including allocator_arg_t variants)
Hui Xiea3ac9222022-05-12 13:23:11 +0100907
Hui Xied1637a82022-05-12 13:23:11 +0100908 template <class... _Up, enable_if_t<
909 _EnableCtorFromUTypesTuple<const tuple<_Up...>&&>::value>* = nullptr>
910 _LIBCPP_HIDE_FROM_ABI constexpr
911 explicit(!(is_convertible_v<const _Up&&, _Tp> && ...))
912 tuple(const tuple<_Up...>&& __t) : __base_(std::move(__t)) {}
913
914 template <class _Alloc, class... _Up, enable_if_t<
915 _EnableCtorFromUTypesTuple<const tuple<_Up...>&&>::value>* = nullptr>
916 _LIBCPP_HIDE_FROM_ABI constexpr
917 explicit(!(is_convertible_v<const _Up&&, _Tp> && ...))
918 tuple(allocator_arg_t, const _Alloc& __alloc, const tuple<_Up...>&& __t)
919 : __base_(allocator_arg_t(), __alloc, std::move(__t)) {}
920#endif // _LIBCPP_STD_VER > 20
921
922 // tuple(const pair<U1, U2>&) constructors (including allocator_arg_t variants)
923
924 template <template <class...> class Pred, class _Pair, class _DecayedPair = __uncvref_t<_Pair>, class _Tuple = tuple>
925 struct _CtorPredicateFromPair : false_type{};
926
927 template <template <class...> class Pred, class _Pair, class _Up1, class _Up2, class _Tp1, class _Tp2>
928 struct _CtorPredicateFromPair<Pred, _Pair, pair<_Up1, _Up2>, tuple<_Tp1, _Tp2> > : _And<
929 Pred<_Tp1, __copy_cvref_t<_Pair, _Up1> >,
930 Pred<_Tp2, __copy_cvref_t<_Pair, _Up2> >
931 > {};
932
933 template <class _Pair>
934 struct _EnableCtorFromPair : _CtorPredicateFromPair<is_constructible, _Pair>{};
935
936 template <class _Pair>
937 struct _NothrowConstructibleFromPair : _CtorPredicateFromPair<is_nothrow_constructible, _Pair>{};
938
939 template <class _Pair, class _DecayedPair = __uncvref_t<_Pair>, class _Tuple = tuple>
940 struct _BothImplicitlyConvertible : false_type{};
941
942 template <class _Pair, class _Up1, class _Up2, class _Tp1, class _Tp2>
943 struct _BothImplicitlyConvertible<_Pair, pair<_Up1, _Up2>, tuple<_Tp1, _Tp2> > : _And<
944 is_convertible<__copy_cvref_t<_Pair, _Up1>, _Tp1>,
945 is_convertible<__copy_cvref_t<_Pair, _Up2>, _Tp2>
946 > {};
Howard Hinnantc51e1022010-05-11 19:42:16 +0000947
Louis Dionne9ce598d2021-09-08 09:14:43 -0400948 template <class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t<
Louis Dionne574e2e32021-02-10 16:19:50 -0500949 _And<
Hui Xied1637a82022-05-12 13:23:11 +0100950 _EnableCtorFromPair<const pair<_Up1, _Up2>&>,
951 _BothImplicitlyConvertible<const pair<_Up1, _Up2>&> // explicit check
Louis Dionne574e2e32021-02-10 16:19:50 -0500952 >::value
953 , int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200954 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Louis Dionne574e2e32021-02-10 16:19:50 -0500955 tuple(const pair<_Up1, _Up2>& __p)
Hui Xied1637a82022-05-12 13:23:11 +0100956 _NOEXCEPT_((_NothrowConstructibleFromPair<const pair<_Up1, _Up2>&>::value))
Louis Dionne574e2e32021-02-10 16:19:50 -0500957 : __base_(__p)
958 { }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000959
Louis Dionne9ce598d2021-09-08 09:14:43 -0400960 template <class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t<
Louis Dionne574e2e32021-02-10 16:19:50 -0500961 _And<
Hui Xied1637a82022-05-12 13:23:11 +0100962 _EnableCtorFromPair<const pair<_Up1, _Up2>&>,
963 _Not<_BothImplicitlyConvertible<const pair<_Up1, _Up2>&> > // explicit check
Louis Dionne574e2e32021-02-10 16:19:50 -0500964 >::value
965 , int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200966 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Louis Dionne574e2e32021-02-10 16:19:50 -0500967 explicit tuple(const pair<_Up1, _Up2>& __p)
Hui Xied1637a82022-05-12 13:23:11 +0100968 _NOEXCEPT_((_NothrowConstructibleFromPair<const pair<_Up1, _Up2>&>::value))
Louis Dionne574e2e32021-02-10 16:19:50 -0500969 : __base_(__p)
970 { }
Eric Fiselier8e6a5f02016-04-19 01:19:25 +0000971
Louis Dionne9ce598d2021-09-08 09:14:43 -0400972 template <class _Alloc, class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t<
Louis Dionne574e2e32021-02-10 16:19:50 -0500973 _And<
Hui Xied1637a82022-05-12 13:23:11 +0100974 _EnableCtorFromPair<const pair<_Up1, _Up2>&>,
975 _BothImplicitlyConvertible<const pair<_Up1, _Up2>&> // explicit check
Louis Dionne574e2e32021-02-10 16:19:50 -0500976 >::value
977 , int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200978 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne574e2e32021-02-10 16:19:50 -0500979 tuple(allocator_arg_t, const _Alloc& __a, const pair<_Up1, _Up2>& __p)
980 : __base_(allocator_arg_t(), __a, __p)
981 { }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000982
Louis Dionne9ce598d2021-09-08 09:14:43 -0400983 template <class _Alloc, class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t<
Louis Dionne574e2e32021-02-10 16:19:50 -0500984 _And<
Hui Xied1637a82022-05-12 13:23:11 +0100985 _EnableCtorFromPair<const pair<_Up1, _Up2>&>,
986 _Not<_BothImplicitlyConvertible<const pair<_Up1, _Up2>&> > // explicit check
Louis Dionne574e2e32021-02-10 16:19:50 -0500987 >::value
988 , int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200989 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne574e2e32021-02-10 16:19:50 -0500990 explicit tuple(allocator_arg_t, const _Alloc& __a, const pair<_Up1, _Up2>& __p)
991 : __base_(allocator_arg_t(), __a, __p)
992 { }
Howard Hinnant65704d02012-04-01 23:10:42 +0000993
Hui Xied1637a82022-05-12 13:23:11 +0100994#if _LIBCPP_STD_VER > 20
995 // tuple(pair<U1, U2>&) constructors (including allocator_arg_t variants)
Hui Xie39360e22022-06-23 21:54:23 +0100996
Hui Xied1637a82022-05-12 13:23:11 +0100997 template <class _U1, class _U2, enable_if_t<
998 _EnableCtorFromPair<pair<_U1, _U2>&>::value>* = nullptr>
999 _LIBCPP_HIDE_FROM_ABI constexpr
1000 explicit(!_BothImplicitlyConvertible<pair<_U1, _U2>&>::value)
1001 tuple(pair<_U1, _U2>& __p) : __base_(__p) {}
1002
1003 template <class _Alloc, class _U1, class _U2, enable_if_t<
1004 _EnableCtorFromPair<std::pair<_U1, _U2>&>::value>* = nullptr>
1005 _LIBCPP_HIDE_FROM_ABI constexpr
1006 explicit(!_BothImplicitlyConvertible<pair<_U1, _U2>&>::value)
1007 tuple(allocator_arg_t, const _Alloc& __alloc, pair<_U1, _U2>& __p) : __base_(allocator_arg_t(), __alloc, __p) {}
1008#endif
1009
1010 // tuple(pair<U1, U2>&&) constructors (including allocator_arg_t variants)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001011
Louis Dionne9ce598d2021-09-08 09:14:43 -04001012 template <class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t<
Louis Dionne574e2e32021-02-10 16:19:50 -05001013 _And<
Hui Xied1637a82022-05-12 13:23:11 +01001014 _EnableCtorFromPair<pair<_Up1, _Up2>&&>,
1015 _BothImplicitlyConvertible<pair<_Up1, _Up2>&&> // explicit check
Louis Dionne574e2e32021-02-10 16:19:50 -05001016 >::value
1017 , int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001018 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Louis Dionne574e2e32021-02-10 16:19:50 -05001019 tuple(pair<_Up1, _Up2>&& __p)
Hui Xied1637a82022-05-12 13:23:11 +01001020 _NOEXCEPT_((_NothrowConstructibleFromPair<pair<_Up1, _Up2>&&>::value))
Louis Dionne574e2e32021-02-10 16:19:50 -05001021 : __base_(_VSTD::move(__p))
1022 { }
1023
Louis Dionne9ce598d2021-09-08 09:14:43 -04001024 template <class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t<
Louis Dionne574e2e32021-02-10 16:19:50 -05001025 _And<
Hui Xied1637a82022-05-12 13:23:11 +01001026 _EnableCtorFromPair<pair<_Up1, _Up2>&&>,
1027 _Not<_BothImplicitlyConvertible<pair<_Up1, _Up2>&&> > // explicit check
Louis Dionne574e2e32021-02-10 16:19:50 -05001028 >::value
1029 , int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001030 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Louis Dionne574e2e32021-02-10 16:19:50 -05001031 explicit tuple(pair<_Up1, _Up2>&& __p)
Hui Xied1637a82022-05-12 13:23:11 +01001032 _NOEXCEPT_((_NothrowConstructibleFromPair<pair<_Up1, _Up2>&&>::value))
Louis Dionne574e2e32021-02-10 16:19:50 -05001033 : __base_(_VSTD::move(__p))
1034 { }
1035
Louis Dionne9ce598d2021-09-08 09:14:43 -04001036 template <class _Alloc, class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t<
Louis Dionne574e2e32021-02-10 16:19:50 -05001037 _And<
Hui Xied1637a82022-05-12 13:23:11 +01001038 _EnableCtorFromPair<pair<_Up1, _Up2>&&>,
1039 _BothImplicitlyConvertible<pair<_Up1, _Up2>&&> // explicit check
Louis Dionne574e2e32021-02-10 16:19:50 -05001040 >::value
1041 , int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001042 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne574e2e32021-02-10 16:19:50 -05001043 tuple(allocator_arg_t, const _Alloc& __a, pair<_Up1, _Up2>&& __p)
1044 : __base_(allocator_arg_t(), __a, _VSTD::move(__p))
1045 { }
1046
Louis Dionne9ce598d2021-09-08 09:14:43 -04001047 template <class _Alloc, class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t<
Louis Dionne574e2e32021-02-10 16:19:50 -05001048 _And<
Hui Xied1637a82022-05-12 13:23:11 +01001049 _EnableCtorFromPair<pair<_Up1, _Up2>&&>,
1050 _Not<_BothImplicitlyConvertible<pair<_Up1, _Up2>&&> > // explicit check
Louis Dionne574e2e32021-02-10 16:19:50 -05001051 >::value
1052 , int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001053 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne574e2e32021-02-10 16:19:50 -05001054 explicit tuple(allocator_arg_t, const _Alloc& __a, pair<_Up1, _Up2>&& __p)
1055 : __base_(allocator_arg_t(), __a, _VSTD::move(__p))
1056 { }
Eric Fiselier8e6a5f02016-04-19 01:19:25 +00001057
Hui Xied1637a82022-05-12 13:23:11 +01001058#if _LIBCPP_STD_VER > 20
1059 // tuple(const pair<U1, U2>&&) constructors (including allocator_arg_t variants)
1060
1061 template <class _U1, class _U2, enable_if_t<
1062 _EnableCtorFromPair<const pair<_U1, _U2>&&>::value>* = nullptr>
1063 _LIBCPP_HIDE_FROM_ABI constexpr
1064 explicit(!_BothImplicitlyConvertible<const pair<_U1, _U2>&&>::value)
1065 tuple(const pair<_U1, _U2>&& __p) : __base_(std::move(__p)) {}
1066
1067 template <class _Alloc, class _U1, class _U2, enable_if_t<
1068 _EnableCtorFromPair<const pair<_U1, _U2>&&>::value>* = nullptr>
1069 _LIBCPP_HIDE_FROM_ABI constexpr
1070 explicit(!_BothImplicitlyConvertible<const pair<_U1, _U2>&&>::value)
1071 tuple(allocator_arg_t, const _Alloc& __alloc, const pair<_U1, _U2>&& __p)
1072 : __base_(allocator_arg_t(), __alloc, std::move(__p)) {}
1073#endif // _LIBCPP_STD_VER > 20
1074
Louis Dionne6c0d5342018-07-31 11:56:20 -04001075 // [tuple.assign]
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001076 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne6c0d5342018-07-31 11:56:20 -04001077 tuple& operator=(_If<_And<is_copy_assignable<_Tp>...>::value, tuple, __nat> const& __tuple)
1078 _NOEXCEPT_((_And<is_nothrow_copy_assignable<_Tp>...>::value))
Eric Fiselier737a16d2016-07-25 02:36:42 +00001079 {
Louis Dionne6c0d5342018-07-31 11:56:20 -04001080 _VSTD::__memberwise_copy_assign(*this, __tuple,
1081 typename __make_tuple_indices<sizeof...(_Tp)>::type());
Eric Fiselier737a16d2016-07-25 02:36:42 +00001082 return *this;
1083 }
1084
Hui Xied1637a82022-05-12 13:23:11 +01001085#if _LIBCPP_STD_VER > 20
1086 _LIBCPP_HIDE_FROM_ABI constexpr
1087 const tuple& operator=(tuple const& __tuple) const
1088 requires (_And<is_copy_assignable<const _Tp>...>::value) {
1089 std::__memberwise_copy_assign(*this, __tuple, typename __make_tuple_indices<sizeof...(_Tp)>::type());
1090 return *this;
1091 }
1092
1093 _LIBCPP_HIDE_FROM_ABI constexpr
1094 const tuple& operator=(tuple&& __tuple) const
1095 requires (_And<is_assignable<const _Tp&, _Tp>...>::value) {
1096 std::__memberwise_forward_assign(*this,
1097 std::move(__tuple),
1098 __tuple_types<_Tp...>(),
1099 typename __make_tuple_indices<sizeof...(_Tp)>::type());
1100 return *this;
1101 }
1102#endif // _LIBCPP_STD_VER > 20
1103
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001104 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne6c0d5342018-07-31 11:56:20 -04001105 tuple& operator=(_If<_And<is_move_assignable<_Tp>...>::value, tuple, __nat>&& __tuple)
1106 _NOEXCEPT_((_And<is_nothrow_move_assignable<_Tp>...>::value))
Eric Fiselier737a16d2016-07-25 02:36:42 +00001107 {
Louis Dionne6c0d5342018-07-31 11:56:20 -04001108 _VSTD::__memberwise_forward_assign(*this, _VSTD::move(__tuple),
1109 __tuple_types<_Tp...>(),
1110 typename __make_tuple_indices<sizeof...(_Tp)>::type());
Eric Fiselier737a16d2016-07-25 02:36:42 +00001111 return *this;
1112 }
1113
Louis Dionne9ce598d2021-09-08 09:14:43 -04001114 template<class... _Up, __enable_if_t<
Louis Dionne6c0d5342018-07-31 11:56:20 -04001115 _And<
1116 _BoolConstant<sizeof...(_Tp) == sizeof...(_Up)>,
1117 is_assignable<_Tp&, _Up const&>...
1118 >::value
1119 ,int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001120 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne6c0d5342018-07-31 11:56:20 -04001121 tuple& operator=(tuple<_Up...> const& __tuple)
1122 _NOEXCEPT_((_And<is_nothrow_assignable<_Tp&, _Up const&>...>::value))
1123 {
1124 _VSTD::__memberwise_copy_assign(*this, __tuple,
1125 typename __make_tuple_indices<sizeof...(_Tp)>::type());
1126 return *this;
1127 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001128
Louis Dionne9ce598d2021-09-08 09:14:43 -04001129 template<class... _Up, __enable_if_t<
Louis Dionne6c0d5342018-07-31 11:56:20 -04001130 _And<
1131 _BoolConstant<sizeof...(_Tp) == sizeof...(_Up)>,
1132 is_assignable<_Tp&, _Up>...
1133 >::value
1134 ,int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001135 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne6c0d5342018-07-31 11:56:20 -04001136 tuple& operator=(tuple<_Up...>&& __tuple)
1137 _NOEXCEPT_((_And<is_nothrow_assignable<_Tp&, _Up>...>::value))
1138 {
1139 _VSTD::__memberwise_forward_assign(*this, _VSTD::move(__tuple),
1140 __tuple_types<_Up...>(),
1141 typename __make_tuple_indices<sizeof...(_Tp)>::type());
1142 return *this;
1143 }
1144
Hui Xied1637a82022-05-12 13:23:11 +01001145
1146#if _LIBCPP_STD_VER > 20
1147 template <class... _UTypes, enable_if_t<
1148 _And<_BoolConstant<sizeof...(_Tp) == sizeof...(_UTypes)>,
1149 is_assignable<const _Tp&, const _UTypes&>...>::value>* = nullptr>
1150 _LIBCPP_HIDE_FROM_ABI constexpr
1151 const tuple& operator=(const tuple<_UTypes...>& __u) const {
1152 std::__memberwise_copy_assign(*this,
1153 __u,
1154 typename __make_tuple_indices<sizeof...(_Tp)>::type());
1155 return *this;
1156 }
1157
1158 template <class... _UTypes, enable_if_t<
1159 _And<_BoolConstant<sizeof...(_Tp) == sizeof...(_UTypes)>,
1160 is_assignable<const _Tp&, _UTypes>...>::value>* = nullptr>
1161 _LIBCPP_HIDE_FROM_ABI constexpr
1162 const tuple& operator=(tuple<_UTypes...>&& __u) const {
1163 std::__memberwise_forward_assign(*this,
1164 __u,
1165 __tuple_types<_UTypes...>(),
1166 typename __make_tuple_indices<sizeof...(_Tp)>::type());
1167 return *this;
1168 }
1169#endif // _LIBCPP_STD_VER > 20
1170
Louis Dionne76450ee2022-06-27 09:36:52 -04001171 template <template<class...> class Pred, bool _Const,
Hui Xied1637a82022-05-12 13:23:11 +01001172 class _Pair, class _DecayedPair = __uncvref_t<_Pair>, class _Tuple = tuple>
1173 struct _AssignPredicateFromPair : false_type {};
1174
Louis Dionne76450ee2022-06-27 09:36:52 -04001175 template <template<class...> class Pred, bool _Const,
Hui Xied1637a82022-05-12 13:23:11 +01001176 class _Pair, class _Up1, class _Up2, class _Tp1, class _Tp2>
Louis Dionne76450ee2022-06-27 09:36:52 -04001177 struct _AssignPredicateFromPair<Pred, _Const, _Pair, pair<_Up1, _Up2>, tuple<_Tp1, _Tp2> > :
Hui Xied1637a82022-05-12 13:23:11 +01001178 _And<Pred<__maybe_const<_Const, _Tp1>&, __copy_cvref_t<_Pair, _Up1> >,
1179 Pred<__maybe_const<_Const, _Tp2>&, __copy_cvref_t<_Pair, _Up2> >
1180 > {};
1181
1182 template <bool _Const, class _Pair>
1183 struct _EnableAssignFromPair : _AssignPredicateFromPair<is_assignable, _Const, _Pair> {};
1184
1185 template <bool _Const, class _Pair>
1186 struct _NothrowAssignFromPair : _AssignPredicateFromPair<is_nothrow_assignable, _Const, _Pair> {};
1187
1188#if _LIBCPP_STD_VER > 20
1189 template <class _U1, class _U2, enable_if_t<
1190 _EnableAssignFromPair<true, const pair<_U1, _U2>&>::value>* = nullptr>
1191 _LIBCPP_HIDE_FROM_ABI constexpr
1192 const tuple& operator=(const pair<_U1, _U2>& __pair) const
1193 noexcept(_NothrowAssignFromPair<true, const pair<_U1, _U2>&>::value) {
1194 std::get<0>(*this) = __pair.first;
1195 std::get<1>(*this) = __pair.second;
1196 return *this;
1197 }
1198
1199 template <class _U1, class _U2, enable_if_t<
1200 _EnableAssignFromPair<true, pair<_U1, _U2>&&>::value>* = nullptr>
1201 _LIBCPP_HIDE_FROM_ABI constexpr
1202 const tuple& operator=(pair<_U1, _U2>&& __pair) const
1203 noexcept(_NothrowAssignFromPair<true, pair<_U1, _U2>&&>::value) {
1204 std::get<0>(*this) = std::move(__pair.first);
1205 std::get<1>(*this) = std::move(__pair.second);
1206 return *this;
1207 }
1208#endif // _LIBCPP_STD_VER > 20
1209
1210 template<class _Up1, class _Up2, __enable_if_t<
1211 _EnableAssignFromPair<false, pair<_Up1, _Up2> const&>::value
Louis Dionne6c0d5342018-07-31 11:56:20 -04001212 ,int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001213 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne6c0d5342018-07-31 11:56:20 -04001214 tuple& operator=(pair<_Up1, _Up2> const& __pair)
Hui Xied1637a82022-05-12 13:23:11 +01001215 _NOEXCEPT_((_NothrowAssignFromPair<false, pair<_Up1, _Up2> const&>::value))
Louis Dionne6c0d5342018-07-31 11:56:20 -04001216 {
1217 _VSTD::get<0>(*this) = __pair.first;
1218 _VSTD::get<1>(*this) = __pair.second;
1219 return *this;
1220 }
1221
Hui Xied1637a82022-05-12 13:23:11 +01001222 template<class _Up1, class _Up2, __enable_if_t<
1223 _EnableAssignFromPair<false, pair<_Up1, _Up2>&&>::value
Louis Dionne6c0d5342018-07-31 11:56:20 -04001224 ,int> = 0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001225 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne6c0d5342018-07-31 11:56:20 -04001226 tuple& operator=(pair<_Up1, _Up2>&& __pair)
Hui Xied1637a82022-05-12 13:23:11 +01001227 _NOEXCEPT_((_NothrowAssignFromPair<false, pair<_Up1, _Up2>&&>::value))
Louis Dionne6c0d5342018-07-31 11:56:20 -04001228 {
Louis Dionne3b8af4d2021-02-24 14:53:21 -05001229 _VSTD::get<0>(*this) = _VSTD::forward<_Up1>(__pair.first);
1230 _VSTD::get<1>(*this) = _VSTD::forward<_Up2>(__pair.second);
Louis Dionne6c0d5342018-07-31 11:56:20 -04001231 return *this;
1232 }
1233
1234 // EXTENSION
Louis Dionne9ce598d2021-09-08 09:14:43 -04001235 template<class _Up, size_t _Np, class = __enable_if_t<
Louis Dionne6c0d5342018-07-31 11:56:20 -04001236 _And<
1237 _BoolConstant<_Np == sizeof...(_Tp)>,
1238 is_assignable<_Tp&, _Up const&>...
1239 >::value
1240 > >
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001241 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne6c0d5342018-07-31 11:56:20 -04001242 tuple& operator=(array<_Up, _Np> const& __array)
1243 _NOEXCEPT_((_And<is_nothrow_assignable<_Tp&, _Up const&>...>::value))
1244 {
1245 _VSTD::__memberwise_copy_assign(*this, __array,
1246 typename __make_tuple_indices<sizeof...(_Tp)>::type());
1247 return *this;
1248 }
1249
1250 // EXTENSION
Louis Dionne9ce598d2021-09-08 09:14:43 -04001251 template<class _Up, size_t _Np, class = void, class = __enable_if_t<
Louis Dionne6c0d5342018-07-31 11:56:20 -04001252 _And<
1253 _BoolConstant<_Np == sizeof...(_Tp)>,
1254 is_assignable<_Tp&, _Up>...
1255 >::value
1256 > >
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001257 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne6c0d5342018-07-31 11:56:20 -04001258 tuple& operator=(array<_Up, _Np>&& __array)
1259 _NOEXCEPT_((_And<is_nothrow_assignable<_Tp&, _Up>...>::value))
1260 {
1261 _VSTD::__memberwise_forward_assign(*this, _VSTD::move(__array),
1262 __tuple_types<_If<true, _Up, _Tp>...>(),
1263 typename __make_tuple_indices<sizeof...(_Tp)>::type());
1264 return *this;
1265 }
1266
1267 // [tuple.swap]
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001268 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnant89ef1212011-05-27 19:08:18 +00001269 void swap(tuple& __t) _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value)
Eric Fiselier3e0d4372017-06-01 02:14:21 +00001270 {__base_.swap(__t.__base_);}
Hui Xied1637a82022-05-12 13:23:11 +01001271
1272#if _LIBCPP_STD_VER > 20
1273 _LIBCPP_HIDE_FROM_ABI constexpr
1274 void swap(const tuple& __t) const noexcept(__all<is_nothrow_swappable_v<const _Tp&>...>::value) {
1275 __base_.swap(__t.__base_);
1276 }
1277#endif // _LIBCPP_STD_VER > 20
Howard Hinnantc51e1022010-05-11 19:42:16 +00001278};
1279
1280template <>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001281class _LIBCPP_TEMPLATE_VIS tuple<>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001282{
1283public:
Arthur O'Dwyer20638cc2021-02-09 19:12:16 -05001284 _LIBCPP_INLINE_VISIBILITY constexpr
1285 tuple() _NOEXCEPT = default;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001286 template <class _Alloc>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001287 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnant62751642012-07-06 21:53:48 +00001288 tuple(allocator_arg_t, const _Alloc&) _NOEXCEPT {}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001289 template <class _Alloc>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001290 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnant62751642012-07-06 21:53:48 +00001291 tuple(allocator_arg_t, const _Alloc&, const tuple&) _NOEXCEPT {}
Howard Hinnantc834c512011-11-29 18:15:50 +00001292 template <class _Up>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001293 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnant62751642012-07-06 21:53:48 +00001294 tuple(array<_Up, 0>) _NOEXCEPT {}
Howard Hinnantc834c512011-11-29 18:15:50 +00001295 template <class _Alloc, class _Up>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001296 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnant62751642012-07-06 21:53:48 +00001297 tuple(allocator_arg_t, const _Alloc&, array<_Up, 0>) _NOEXCEPT {}
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001298 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnant89ef1212011-05-27 19:08:18 +00001299 void swap(tuple&) _NOEXCEPT {}
Hui Xied1637a82022-05-12 13:23:11 +01001300#if _LIBCPP_STD_VER > 20
1301 _LIBCPP_HIDE_FROM_ABI constexpr void swap(const tuple&) const noexcept {}
1302#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001303};
1304
Joe Loserd9b3d972022-03-12 10:46:57 -05001305#if _LIBCPP_STD_VER > 20
Nikolas Klauserad26ba52022-01-17 19:45:42 +01001306template <class... _TTypes, class... _UTypes, template<class> class _TQual, template<class> class _UQual>
1307 requires requires { typename tuple<common_reference_t<_TQual<_TTypes>, _UQual<_UTypes>>...>; }
1308struct basic_common_reference<tuple<_TTypes...>, tuple<_UTypes...>, _TQual, _UQual> {
1309 using type = tuple<common_reference_t<_TQual<_TTypes>, _UQual<_UTypes>>...>;
1310};
1311
1312template <class... _TTypes, class... _UTypes>
1313 requires requires { typename tuple<common_type_t<_TTypes, _UTypes>...>; }
1314struct common_type<tuple<_TTypes...>, tuple<_UTypes...>> {
1315 using type = tuple<common_type_t<_TTypes, _UTypes>...>;
1316};
Joe Loserd9b3d972022-03-12 10:46:57 -05001317#endif // _LIBCPP_STD_VER > 20
Nikolas Klauserad26ba52022-01-17 19:45:42 +01001318
1319#if _LIBCPP_STD_VER > 14
Louis Dionne616da2a2019-08-12 18:30:31 +00001320template <class ..._Tp>
1321tuple(_Tp...) -> tuple<_Tp...>;
1322template <class _Tp1, class _Tp2>
1323tuple(pair<_Tp1, _Tp2>) -> tuple<_Tp1, _Tp2>;
1324template <class _Alloc, class ..._Tp>
1325tuple(allocator_arg_t, _Alloc, _Tp...) -> tuple<_Tp...>;
1326template <class _Alloc, class _Tp1, class _Tp2>
1327tuple(allocator_arg_t, _Alloc, pair<_Tp1, _Tp2>) -> tuple<_Tp1, _Tp2>;
1328template <class _Alloc, class ..._Tp>
1329tuple(allocator_arg_t, _Alloc, tuple<_Tp...>) -> tuple<_Tp...>;
Eric Fiselier9a5075c2017-06-08 07:18:17 +00001330#endif
1331
Howard Hinnantc51e1022010-05-11 19:42:16 +00001332template <class ..._Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001333inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Nikolas Klauser7537c9c2022-07-04 01:21:44 +02001334__enable_if_t<__all<__is_swappable<_Tp>::value...>::value, void>
Howard Hinnant89ef1212011-05-27 19:08:18 +00001335swap(tuple<_Tp...>& __t, tuple<_Tp...>& __u)
1336 _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value)
1337 {__t.swap(__u);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001338
Hui Xied1637a82022-05-12 13:23:11 +01001339#if _LIBCPP_STD_VER > 20
1340template <class... _Tp>
1341_LIBCPP_HIDE_FROM_ABI constexpr
1342enable_if_t<__all<is_swappable_v<const _Tp>...>::value, void>
1343swap(const tuple<_Tp...>& __lhs, const tuple<_Tp...>& __rhs)
1344 noexcept(__all<is_nothrow_swappable_v<const _Tp>...>::value) {
1345 __lhs.swap(__rhs);
1346}
1347#endif
1348
Howard Hinnantc51e1022010-05-11 19:42:16 +00001349// get
1350
1351template <size_t _Ip, class ..._Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001352inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnant3a47c3d2011-01-24 16:07:25 +00001353typename tuple_element<_Ip, tuple<_Tp...> >::type&
Howard Hinnant28b24882011-12-01 20:21:04 +00001354get(tuple<_Tp...>& __t) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001355{
Louis Dionnea6c4ace2021-08-31 10:32:11 -04001356 typedef _LIBCPP_NODEBUG typename tuple_element<_Ip, tuple<_Tp...> >::type type;
Eric Fiselier3e0d4372017-06-01 02:14:21 +00001357 return static_cast<__tuple_leaf<_Ip, type>&>(__t.__base_).get();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001358}
1359
1360template <size_t _Ip, class ..._Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001361inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnant3a47c3d2011-01-24 16:07:25 +00001362const typename tuple_element<_Ip, tuple<_Tp...> >::type&
Howard Hinnant28b24882011-12-01 20:21:04 +00001363get(const tuple<_Tp...>& __t) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001364{
Louis Dionnea6c4ace2021-08-31 10:32:11 -04001365 typedef _LIBCPP_NODEBUG typename tuple_element<_Ip, tuple<_Tp...> >::type type;
Eric Fiselier3e0d4372017-06-01 02:14:21 +00001366 return static_cast<const __tuple_leaf<_Ip, type>&>(__t.__base_).get();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001367}
1368
Howard Hinnant22e97242010-11-17 19:52:17 +00001369template <size_t _Ip, class ..._Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001370inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnant3a47c3d2011-01-24 16:07:25 +00001371typename tuple_element<_Ip, tuple<_Tp...> >::type&&
Howard Hinnant28b24882011-12-01 20:21:04 +00001372get(tuple<_Tp...>&& __t) _NOEXCEPT
Howard Hinnant22e97242010-11-17 19:52:17 +00001373{
Louis Dionnea6c4ace2021-08-31 10:32:11 -04001374 typedef _LIBCPP_NODEBUG typename tuple_element<_Ip, tuple<_Tp...> >::type type;
Howard Hinnantb574f9a2011-01-25 16:31:30 +00001375 return static_cast<type&&>(
Eric Fiselier3e0d4372017-06-01 02:14:21 +00001376 static_cast<__tuple_leaf<_Ip, type>&&>(__t.__base_).get());
Howard Hinnant22e97242010-11-17 19:52:17 +00001377}
1378
Eric Fiselier6dea8092015-12-18 00:36:55 +00001379template <size_t _Ip, class ..._Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001380inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Eric Fiselier6dea8092015-12-18 00:36:55 +00001381const typename tuple_element<_Ip, tuple<_Tp...> >::type&&
1382get(const tuple<_Tp...>&& __t) _NOEXCEPT
1383{
Louis Dionnea6c4ace2021-08-31 10:32:11 -04001384 typedef _LIBCPP_NODEBUG typename tuple_element<_Ip, tuple<_Tp...> >::type type;
Eric Fiselier6dea8092015-12-18 00:36:55 +00001385 return static_cast<const type&&>(
Eric Fiselier3e0d4372017-06-01 02:14:21 +00001386 static_cast<const __tuple_leaf<_Ip, type>&&>(__t.__base_).get());
Eric Fiselier6dea8092015-12-18 00:36:55 +00001387}
1388
Marshall Clow15b02e02013-07-13 02:54:05 +00001389#if _LIBCPP_STD_VER > 11
Marshall Clow15b02e02013-07-13 02:54:05 +00001390
Eric Fiselier2d0e2042016-07-02 03:18:30 +00001391namespace __find_detail {
Marshall Clow15b02e02013-07-13 02:54:05 +00001392
Louis Dionne7dd28aa2021-07-20 11:46:05 -04001393static constexpr size_t __not_found = static_cast<size_t>(-1);
Eric Fiselier2d0e2042016-07-02 03:18:30 +00001394static constexpr size_t __ambiguous = __not_found - 1;
Marshall Clow15b02e02013-07-13 02:54:05 +00001395
Eric Fiselier2d0e2042016-07-02 03:18:30 +00001396inline _LIBCPP_INLINE_VISIBILITY
1397constexpr size_t __find_idx_return(size_t __curr_i, size_t __res, bool __matches) {
1398 return !__matches ? __res :
1399 (__res == __not_found ? __curr_i : __ambiguous);
1400}
Marshall Clow15b02e02013-07-13 02:54:05 +00001401
Eric Fiselier2d0e2042016-07-02 03:18:30 +00001402template <size_t _Nx>
1403inline _LIBCPP_INLINE_VISIBILITY
1404constexpr size_t __find_idx(size_t __i, const bool (&__matches)[_Nx]) {
1405 return __i == _Nx ? __not_found :
1406 __find_idx_return(__i, __find_idx(__i + 1, __matches), __matches[__i]);
1407}
1408
1409template <class _T1, class ..._Args>
1410struct __find_exactly_one_checked {
Casey Carter7b5a7482017-12-12 17:22:24 +00001411 static constexpr bool __matches[sizeof...(_Args)] = {is_same<_T1, _Args>::value...};
Eric Fiselier2d0e2042016-07-02 03:18:30 +00001412 static constexpr size_t value = __find_detail::__find_idx(0, __matches);
Casey Carter7b5a7482017-12-12 17:22:24 +00001413 static_assert(value != __not_found, "type not found in type list" );
1414 static_assert(value != __ambiguous, "type occurs more than once in type list");
Eric Fiselier2d0e2042016-07-02 03:18:30 +00001415};
1416
Eric Fiselier8087d302016-07-02 03:46:08 +00001417template <class _T1>
1418struct __find_exactly_one_checked<_T1> {
1419 static_assert(!is_same<_T1, _T1>::value, "type not in empty type list");
1420};
1421
Nikolas Klauserd26407a2021-12-02 14:12:51 +01001422} // namespace __find_detail
Marshall Clow15b02e02013-07-13 02:54:05 +00001423
1424template <typename _T1, typename... _Args>
Eric Fiselier2d0e2042016-07-02 03:18:30 +00001425struct __find_exactly_one_t
1426 : public __find_detail::__find_exactly_one_checked<_T1, _Args...> {
1427};
Marshall Clow15b02e02013-07-13 02:54:05 +00001428
1429template <class _T1, class... _Args>
1430inline _LIBCPP_INLINE_VISIBILITY
1431constexpr _T1& get(tuple<_Args...>& __tup) noexcept
1432{
1433 return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(__tup);
1434}
1435
1436template <class _T1, class... _Args>
1437inline _LIBCPP_INLINE_VISIBILITY
1438constexpr _T1 const& get(tuple<_Args...> const& __tup) noexcept
1439{
1440 return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(__tup);
1441}
1442
1443template <class _T1, class... _Args>
1444inline _LIBCPP_INLINE_VISIBILITY
1445constexpr _T1&& get(tuple<_Args...>&& __tup) noexcept
1446{
Marshall Clowfe9aa372013-07-15 20:46:11 +00001447 return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(_VSTD::move(__tup));
Marshall Clow15b02e02013-07-13 02:54:05 +00001448}
1449
Eric Fiselier6dea8092015-12-18 00:36:55 +00001450template <class _T1, class... _Args>
1451inline _LIBCPP_INLINE_VISIBILITY
1452constexpr _T1 const&& get(tuple<_Args...> const&& __tup) noexcept
1453{
1454 return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(_VSTD::move(__tup));
1455}
1456
Marshall Clow15b02e02013-07-13 02:54:05 +00001457#endif
1458
Howard Hinnantc51e1022010-05-11 19:42:16 +00001459// tie
1460
1461template <class ..._Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001462inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnantc51e1022010-05-11 19:42:16 +00001463tuple<_Tp&...>
Howard Hinnant62751642012-07-06 21:53:48 +00001464tie(_Tp&... __t) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001465{
1466 return tuple<_Tp&...>(__t...);
1467}
1468
1469template <class _Up>
1470struct __ignore_t
1471{
Howard Hinnantc51e1022010-05-11 19:42:16 +00001472 template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001473 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Eric Fiselier24e70262017-02-06 01:25:31 +00001474 const __ignore_t& operator=(_Tp&&) const {return *this;}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001475};
1476
Eric Fiselier24e70262017-02-06 01:25:31 +00001477namespace {
Louis Dionne559be102021-09-22 09:35:32 -04001478 constexpr __ignore_t<unsigned char> ignore = __ignore_t<unsigned char>();
Nikolas Klauserd26407a2021-12-02 14:12:51 +01001479} // namespace
Howard Hinnantc51e1022010-05-11 19:42:16 +00001480
Howard Hinnantc51e1022010-05-11 19:42:16 +00001481template <class... _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001482inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Louis Dionnedb1892a2018-12-03 14:03:27 +00001483tuple<typename __unwrap_ref_decay<_Tp>::type...>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001484make_tuple(_Tp&&... __t)
1485{
Louis Dionnedb1892a2018-12-03 14:03:27 +00001486 return tuple<typename __unwrap_ref_decay<_Tp>::type...>(_VSTD::forward<_Tp>(__t)...);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001487}
1488
Howard Hinnant3d203a32010-08-19 18:59:38 +00001489template <class... _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001490inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Marshall Clow2229cee2013-07-22 16:02:19 +00001491tuple<_Tp&&...>
Howard Hinnant62751642012-07-06 21:53:48 +00001492forward_as_tuple(_Tp&&... __t) _NOEXCEPT
Howard Hinnant3d203a32010-08-19 18:59:38 +00001493{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001494 return tuple<_Tp&&...>(_VSTD::forward<_Tp>(__t)...);
Howard Hinnant3d203a32010-08-19 18:59:38 +00001495}
1496
Howard Hinnantc834c512011-11-29 18:15:50 +00001497template <size_t _Ip>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001498struct __tuple_equal
1499{
1500 template <class _Tp, class _Up>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001501 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnantc51e1022010-05-11 19:42:16 +00001502 bool operator()(const _Tp& __x, const _Up& __y)
1503 {
Marshall Clow60e4aa72014-06-24 00:46:19 +00001504 return __tuple_equal<_Ip - 1>()(__x, __y) && _VSTD::get<_Ip-1>(__x) == _VSTD::get<_Ip-1>(__y);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001505 }
1506};
1507
1508template <>
1509struct __tuple_equal<0>
1510{
1511 template <class _Tp, class _Up>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001512 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnantc51e1022010-05-11 19:42:16 +00001513 bool operator()(const _Tp&, const _Up&)
1514 {
1515 return true;
1516 }
1517};
1518
1519template <class ..._Tp, class ..._Up>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001520inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnantc51e1022010-05-11 19:42:16 +00001521bool
1522operator==(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
1523{
Marshall Clow8ee1ddd2019-02-07 19:03:48 +00001524 static_assert (sizeof...(_Tp) == sizeof...(_Up), "Can't compare tuples of different sizes");
Howard Hinnantc51e1022010-05-11 19:42:16 +00001525 return __tuple_equal<sizeof...(_Tp)>()(__x, __y);
1526}
1527
Joe Loserd9b3d972022-03-12 10:46:57 -05001528#if _LIBCPP_STD_VER > 17
Kent Ross0861b0d2021-10-08 14:54:28 -07001529
1530// operator<=>
1531
1532template <class ..._Tp, class ..._Up, size_t ..._Is>
1533_LIBCPP_HIDE_FROM_ABI constexpr
1534auto
1535__tuple_compare_three_way(const tuple<_Tp...>& __x, const tuple<_Up...>& __y, index_sequence<_Is...>) {
1536 common_comparison_category_t<__synth_three_way_result<_Tp, _Up>...> __result = strong_ordering::equal;
1537 static_cast<void>(((__result = _VSTD::__synth_three_way(_VSTD::get<_Is>(__x), _VSTD::get<_Is>(__y)), __result != 0) || ...));
1538 return __result;
1539}
1540
1541template <class ..._Tp, class ..._Up>
1542requires (sizeof...(_Tp) == sizeof...(_Up))
1543_LIBCPP_HIDE_FROM_ABI constexpr
1544common_comparison_category_t<__synth_three_way_result<_Tp, _Up>...>
1545operator<=>(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
1546{
1547 return _VSTD::__tuple_compare_three_way(__x, __y, index_sequence_for<_Tp...>{});
1548}
1549
Joe Loserd9b3d972022-03-12 10:46:57 -05001550#else // _LIBCPP_STD_VER > 17
Kent Ross0861b0d2021-10-08 14:54:28 -07001551
Howard Hinnantc51e1022010-05-11 19:42:16 +00001552template <class ..._Tp, class ..._Up>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001553inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnantc51e1022010-05-11 19:42:16 +00001554bool
1555operator!=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
1556{
1557 return !(__x == __y);
1558}
1559
Howard Hinnantc834c512011-11-29 18:15:50 +00001560template <size_t _Ip>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001561struct __tuple_less
1562{
1563 template <class _Tp, class _Up>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001564 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnantc51e1022010-05-11 19:42:16 +00001565 bool operator()(const _Tp& __x, const _Up& __y)
1566 {
Duncan P. N. Exon Smith6d3ec092015-01-21 02:51:17 +00001567 const size_t __idx = tuple_size<_Tp>::value - _Ip;
1568 if (_VSTD::get<__idx>(__x) < _VSTD::get<__idx>(__y))
1569 return true;
1570 if (_VSTD::get<__idx>(__y) < _VSTD::get<__idx>(__x))
1571 return false;
1572 return __tuple_less<_Ip-1>()(__x, __y);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001573 }
1574};
1575
1576template <>
1577struct __tuple_less<0>
1578{
1579 template <class _Tp, class _Up>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001580 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnantc51e1022010-05-11 19:42:16 +00001581 bool operator()(const _Tp&, const _Up&)
1582 {
1583 return false;
1584 }
1585};
1586
1587template <class ..._Tp, class ..._Up>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001588inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnantc51e1022010-05-11 19:42:16 +00001589bool
1590operator<(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
1591{
Marshall Clow8ee1ddd2019-02-07 19:03:48 +00001592 static_assert (sizeof...(_Tp) == sizeof...(_Up), "Can't compare tuples of different sizes");
Howard Hinnantc51e1022010-05-11 19:42:16 +00001593 return __tuple_less<sizeof...(_Tp)>()(__x, __y);
1594}
1595
1596template <class ..._Tp, class ..._Up>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001597inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnantc51e1022010-05-11 19:42:16 +00001598bool
1599operator>(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
1600{
1601 return __y < __x;
1602}
1603
1604template <class ..._Tp, class ..._Up>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001605inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnantc51e1022010-05-11 19:42:16 +00001606bool
1607operator>=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
1608{
1609 return !(__x < __y);
1610}
1611
1612template <class ..._Tp, class ..._Up>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001613inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnantc51e1022010-05-11 19:42:16 +00001614bool
1615operator<=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
1616{
1617 return !(__y < __x);
1618}
1619
Joe Loserd9b3d972022-03-12 10:46:57 -05001620#endif // _LIBCPP_STD_VER > 17
Kent Ross0861b0d2021-10-08 14:54:28 -07001621
Howard Hinnantc51e1022010-05-11 19:42:16 +00001622// tuple_cat
1623
Howard Hinnant6256ee72010-12-11 20:47:50 +00001624template <class _Tp, class _Up> struct __tuple_cat_type;
1625
1626template <class ..._Ttypes, class ..._Utypes>
Howard Hinnant3a47c3d2011-01-24 16:07:25 +00001627struct __tuple_cat_type<tuple<_Ttypes...>, __tuple_types<_Utypes...> >
Howard Hinnantc51e1022010-05-11 19:42:16 +00001628{
Louis Dionnea6c4ace2021-08-31 10:32:11 -04001629 typedef _LIBCPP_NODEBUG tuple<_Ttypes..., _Utypes...> type;
Howard Hinnant6256ee72010-12-11 20:47:50 +00001630};
1631
1632template <class _ResultTuple, bool _Is_Tuple0TupleLike, class ..._Tuples>
1633struct __tuple_cat_return_1
1634{
1635};
1636
1637template <class ..._Types, class _Tuple0>
1638struct __tuple_cat_return_1<tuple<_Types...>, true, _Tuple0>
1639{
Nikolas Klauser669b4452022-02-17 22:53:20 +01001640 using type _LIBCPP_NODEBUG = typename __tuple_cat_type<
1641 tuple<_Types...>,
1642 typename __make_tuple_types<__uncvref_t<_Tuple0> >::type
1643 >::type;
Howard Hinnant6256ee72010-12-11 20:47:50 +00001644};
1645
1646template <class ..._Types, class _Tuple0, class _Tuple1, class ..._Tuples>
1647struct __tuple_cat_return_1<tuple<_Types...>, true, _Tuple0, _Tuple1, _Tuples...>
1648 : public __tuple_cat_return_1<
1649 typename __tuple_cat_type<
1650 tuple<_Types...>,
Nikolas Klauser669b4452022-02-17 22:53:20 +01001651 typename __make_tuple_types<__uncvref_t<_Tuple0> >::type
Howard Hinnant6256ee72010-12-11 20:47:50 +00001652 >::type,
1653 __tuple_like<typename remove_reference<_Tuple1>::type>::value,
1654 _Tuple1, _Tuples...>
1655{
1656};
1657
1658template <class ..._Tuples> struct __tuple_cat_return;
1659
1660template <class _Tuple0, class ..._Tuples>
1661struct __tuple_cat_return<_Tuple0, _Tuples...>
1662 : public __tuple_cat_return_1<tuple<>,
1663 __tuple_like<typename remove_reference<_Tuple0>::type>::value, _Tuple0,
1664 _Tuples...>
1665{
1666};
1667
1668template <>
1669struct __tuple_cat_return<>
1670{
Louis Dionnea6c4ace2021-08-31 10:32:11 -04001671 typedef _LIBCPP_NODEBUG tuple<> type;
Howard Hinnant6256ee72010-12-11 20:47:50 +00001672};
1673
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001674inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnant6256ee72010-12-11 20:47:50 +00001675tuple<>
1676tuple_cat()
1677{
1678 return tuple<>();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001679}
1680
Howard Hinnantc834c512011-11-29 18:15:50 +00001681template <class _Rp, class _Indices, class _Tuple0, class ..._Tuples>
Howard Hinnant21376f62010-12-12 23:04:37 +00001682struct __tuple_cat_return_ref_imp;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001683
Howard Hinnant21376f62010-12-12 23:04:37 +00001684template <class ..._Types, size_t ..._I0, class _Tuple0>
1685struct __tuple_cat_return_ref_imp<tuple<_Types...>, __tuple_indices<_I0...>, _Tuple0>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001686{
Louis Dionnea6c4ace2021-08-31 10:32:11 -04001687 typedef _LIBCPP_NODEBUG typename remove_reference<_Tuple0>::type _T0;
Howard Hinnant21376f62010-12-12 23:04:37 +00001688 typedef tuple<_Types..., typename __apply_cv<_Tuple0,
1689 typename tuple_element<_I0, _T0>::type>::type&&...> type;
1690};
Howard Hinnantc51e1022010-05-11 19:42:16 +00001691
Howard Hinnant21376f62010-12-12 23:04:37 +00001692template <class ..._Types, size_t ..._I0, class _Tuple0, class _Tuple1, class ..._Tuples>
1693struct __tuple_cat_return_ref_imp<tuple<_Types...>, __tuple_indices<_I0...>,
1694 _Tuple0, _Tuple1, _Tuples...>
1695 : public __tuple_cat_return_ref_imp<
1696 tuple<_Types..., typename __apply_cv<_Tuple0,
1697 typename tuple_element<_I0,
1698 typename remove_reference<_Tuple0>::type>::type>::type&&...>,
1699 typename __make_tuple_indices<tuple_size<typename
1700 remove_reference<_Tuple1>::type>::value>::type,
1701 _Tuple1, _Tuples...>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001702{
Howard Hinnant21376f62010-12-12 23:04:37 +00001703};
1704
1705template <class _Tuple0, class ..._Tuples>
1706struct __tuple_cat_return_ref
1707 : public __tuple_cat_return_ref_imp<tuple<>,
1708 typename __make_tuple_indices<
1709 tuple_size<typename remove_reference<_Tuple0>::type>::value
1710 >::type, _Tuple0, _Tuples...>
1711{
1712};
1713
1714template <class _Types, class _I0, class _J0>
1715struct __tuple_cat;
1716
1717template <class ..._Types, size_t ..._I0, size_t ..._J0>
Howard Hinnant3a47c3d2011-01-24 16:07:25 +00001718struct __tuple_cat<tuple<_Types...>, __tuple_indices<_I0...>, __tuple_indices<_J0...> >
Howard Hinnant21376f62010-12-12 23:04:37 +00001719{
1720 template <class _Tuple0>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001721 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnant21376f62010-12-12 23:04:37 +00001722 typename __tuple_cat_return_ref<tuple<_Types...>&&, _Tuple0&&>::type
1723 operator()(tuple<_Types...> __t, _Tuple0&& __t0)
1724 {
Louis Dionne6209e9f2022-03-03 13:39:12 -05001725 (void)__t; // avoid unused parameter warning on GCC when _I0 is empty
David Blaikie699a5e22019-10-28 18:03:59 -07001726 return _VSTD::forward_as_tuple(
1727 _VSTD::forward<_Types>(_VSTD::get<_I0>(__t))...,
1728 _VSTD::get<_J0>(_VSTD::forward<_Tuple0>(__t0))...);
Howard Hinnant21376f62010-12-12 23:04:37 +00001729 }
1730
1731 template <class _Tuple0, class _Tuple1, class ..._Tuples>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001732 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnant21376f62010-12-12 23:04:37 +00001733 typename __tuple_cat_return_ref<tuple<_Types...>&&, _Tuple0&&, _Tuple1&&, _Tuples&&...>::type
1734 operator()(tuple<_Types...> __t, _Tuple0&& __t0, _Tuple1&& __t1, _Tuples&& ...__tpls)
1735 {
Louis Dionne6209e9f2022-03-03 13:39:12 -05001736 (void)__t; // avoid unused parameter warning on GCC when _I0 is empty
Louis Dionnea6c4ace2021-08-31 10:32:11 -04001737 typedef _LIBCPP_NODEBUG typename remove_reference<_Tuple0>::type _T0;
1738 typedef _LIBCPP_NODEBUG typename remove_reference<_Tuple1>::type _T1;
Howard Hinnant21376f62010-12-12 23:04:37 +00001739 return __tuple_cat<
David Blaikie699a5e22019-10-28 18:03:59 -07001740 tuple<_Types...,
1741 typename __apply_cv<_Tuple0, typename tuple_element<
1742 _J0, _T0>::type>::type&&...>,
1743 typename __make_tuple_indices<sizeof...(_Types) +
1744 tuple_size<_T0>::value>::type,
1745 typename __make_tuple_indices<tuple_size<_T1>::value>::type>()(
1746 _VSTD::forward_as_tuple(
1747 _VSTD::forward<_Types>(_VSTD::get<_I0>(__t))...,
1748 _VSTD::get<_J0>(_VSTD::forward<_Tuple0>(__t0))...),
1749 _VSTD::forward<_Tuple1>(__t1), _VSTD::forward<_Tuples>(__tpls)...);
Howard Hinnant21376f62010-12-12 23:04:37 +00001750 }
1751};
1752
1753template <class _Tuple0, class... _Tuples>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001754inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
Howard Hinnant21376f62010-12-12 23:04:37 +00001755typename __tuple_cat_return<_Tuple0, _Tuples...>::type
1756tuple_cat(_Tuple0&& __t0, _Tuples&&... __tpls)
1757{
Louis Dionnea6c4ace2021-08-31 10:32:11 -04001758 typedef _LIBCPP_NODEBUG typename remove_reference<_Tuple0>::type _T0;
Howard Hinnant21376f62010-12-12 23:04:37 +00001759 return __tuple_cat<tuple<>, __tuple_indices<>,
1760 typename __make_tuple_indices<tuple_size<_T0>::value>::type>()
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001761 (tuple<>(), _VSTD::forward<_Tuple0>(__t0),
1762 _VSTD::forward<_Tuples>(__tpls)...);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001763}
1764
1765template <class ..._Tp, class _Alloc>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001766struct _LIBCPP_TEMPLATE_VIS uses_allocator<tuple<_Tp...>, _Alloc>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001767 : true_type {};
1768
Howard Hinnantc51e1022010-05-11 19:42:16 +00001769template <class _T1, class _T2>
1770template <class... _Args1, class... _Args2, size_t ..._I1, size_t ..._I2>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001771inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00001772pair<_T1, _T2>::pair(piecewise_construct_t,
1773 tuple<_Args1...>& __first_args, tuple<_Args2...>& __second_args,
1774 __tuple_indices<_I1...>, __tuple_indices<_I2...>)
Marshall Clow60e4aa72014-06-24 00:46:19 +00001775 : first(_VSTD::forward<_Args1>(_VSTD::get<_I1>( __first_args))...),
1776 second(_VSTD::forward<_Args2>(_VSTD::get<_I2>(__second_args))...)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001777{
1778}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001779
Eric Fiselier8e892c52016-07-18 00:35:56 +00001780#if _LIBCPP_STD_VER > 14
1781template <class _Tp>
Louis Dionne559be102021-09-22 09:35:32 -04001782inline constexpr size_t tuple_size_v = tuple_size<_Tp>::value;
Eric Fiselier8e892c52016-07-18 00:35:56 +00001783
1784#define _LIBCPP_NOEXCEPT_RETURN(...) noexcept(noexcept(__VA_ARGS__)) { return __VA_ARGS__; }
1785
1786template <class _Fn, class _Tuple, size_t ..._Id>
1787inline _LIBCPP_INLINE_VISIBILITY
1788constexpr decltype(auto) __apply_tuple_impl(_Fn && __f, _Tuple && __t,
1789 __tuple_indices<_Id...>)
1790_LIBCPP_NOEXCEPT_RETURN(
Nikolas Klausera28f48e2022-04-06 23:10:21 +02001791 _VSTD::__invoke(
Eric Fiselier8e892c52016-07-18 00:35:56 +00001792 _VSTD::forward<_Fn>(__f),
1793 _VSTD::get<_Id>(_VSTD::forward<_Tuple>(__t))...)
1794)
1795
1796template <class _Fn, class _Tuple>
1797inline _LIBCPP_INLINE_VISIBILITY
1798constexpr decltype(auto) apply(_Fn && __f, _Tuple && __t)
1799_LIBCPP_NOEXCEPT_RETURN(
1800 _VSTD::__apply_tuple_impl(
1801 _VSTD::forward<_Fn>(__f), _VSTD::forward<_Tuple>(__t),
Marshall Clowd5bbc242018-02-06 20:56:55 +00001802 typename __make_tuple_indices<tuple_size_v<remove_reference_t<_Tuple>>>::type{})
Eric Fiselier8e892c52016-07-18 00:35:56 +00001803)
1804
1805template <class _Tp, class _Tuple, size_t... _Idx>
1806inline _LIBCPP_INLINE_VISIBILITY
1807constexpr _Tp __make_from_tuple_impl(_Tuple&& __t, __tuple_indices<_Idx...>)
1808_LIBCPP_NOEXCEPT_RETURN(
1809 _Tp(_VSTD::get<_Idx>(_VSTD::forward<_Tuple>(__t))...)
1810)
1811
1812template <class _Tp, class _Tuple>
1813inline _LIBCPP_INLINE_VISIBILITY
1814constexpr _Tp make_from_tuple(_Tuple&& __t)
1815_LIBCPP_NOEXCEPT_RETURN(
1816 _VSTD::__make_from_tuple_impl<_Tp>(_VSTD::forward<_Tuple>(__t),
Marshall Clowd5bbc242018-02-06 20:56:55 +00001817 typename __make_tuple_indices<tuple_size_v<remove_reference_t<_Tuple>>>::type{})
Eric Fiselier8e892c52016-07-18 00:35:56 +00001818)
1819
1820#undef _LIBCPP_NOEXCEPT_RETURN
1821
1822#endif // _LIBCPP_STD_VER > 14
1823
Eric Fiselierffe4aba2017-04-19 01:23:39 +00001824#endif // !defined(_LIBCPP_CXX03_LANG)
1825
Howard Hinnantc51e1022010-05-11 19:42:16 +00001826_LIBCPP_END_NAMESPACE_STD
1827
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001828#endif // _LIBCPP_TUPLE