146035553Spatrick// -*- C++ -*- 2*4bdff4beSrobert//===----------------------------------------------------------------------===// 346035553Spatrick// 446035553Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 546035553Spatrick// See https://llvm.org/LICENSE.txt for license information. 646035553Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 746035553Spatrick// 846035553Spatrick//===----------------------------------------------------------------------===// 946035553Spatrick 1046035553Spatrick#ifndef _LIBCPP_TUPLE 1146035553Spatrick#define _LIBCPP_TUPLE 1246035553Spatrick 1346035553Spatrick/* 1446035553Spatrick tuple synopsis 1546035553Spatrick 1646035553Spatricknamespace std 1746035553Spatrick{ 1846035553Spatrick 1946035553Spatricktemplate <class... T> 2046035553Spatrickclass tuple { 2146035553Spatrickpublic: 2246035553Spatrick explicit(see-below) constexpr tuple(); 2346035553Spatrick explicit(see-below) tuple(const T&...); // constexpr in C++14 2446035553Spatrick template <class... U> 2546035553Spatrick explicit(see-below) tuple(U&&...); // constexpr in C++14 2646035553Spatrick tuple(const tuple&) = default; 2746035553Spatrick tuple(tuple&&) = default; 28*4bdff4beSrobert 29*4bdff4beSrobert template<class... UTypes> 30*4bdff4beSrobert constexpr explicit(see-below) tuple(tuple<UTypes...>&); // C++23 3146035553Spatrick template <class... U> 3246035553Spatrick explicit(see-below) tuple(const tuple<U...>&); // constexpr in C++14 3346035553Spatrick template <class... U> 3446035553Spatrick explicit(see-below) tuple(tuple<U...>&&); // constexpr in C++14 35*4bdff4beSrobert template<class... UTypes> 36*4bdff4beSrobert constexpr explicit(see-below) tuple(const tuple<UTypes...>&&); // C++23 37*4bdff4beSrobert 38*4bdff4beSrobert template<class U1, class U2> 39*4bdff4beSrobert constexpr explicit(see-below) tuple(pair<U1, U2>&); // iff sizeof...(Types) == 2 // C++23 4046035553Spatrick template <class U1, class U2> 4146035553Spatrick explicit(see-below) tuple(const pair<U1, U2>&); // iff sizeof...(T) == 2 // constexpr in C++14 4246035553Spatrick template <class U1, class U2> 4346035553Spatrick explicit(see-below) tuple(pair<U1, U2>&&); // iff sizeof...(T) == 2 // constexpr in C++14 44*4bdff4beSrobert template<class U1, class U2> 45*4bdff4beSrobert constexpr explicit(see-below) tuple(const pair<U1, U2>&&); // iff sizeof...(Types) == 2 // C++23 4646035553Spatrick 4746035553Spatrick // allocator-extended constructors 4846035553Spatrick template <class Alloc> 4946035553Spatrick tuple(allocator_arg_t, const Alloc& a); 5046035553Spatrick template <class Alloc> 5176d0caaeSpatrick explicit(see-below) tuple(allocator_arg_t, const Alloc& a, const T&...); // constexpr in C++20 5246035553Spatrick template <class Alloc, class... U> 5376d0caaeSpatrick explicit(see-below) tuple(allocator_arg_t, const Alloc& a, U&&...); // constexpr in C++20 5446035553Spatrick template <class Alloc> 5576d0caaeSpatrick tuple(allocator_arg_t, const Alloc& a, const tuple&); // constexpr in C++20 5646035553Spatrick template <class Alloc> 5776d0caaeSpatrick tuple(allocator_arg_t, const Alloc& a, tuple&&); // constexpr in C++20 58*4bdff4beSrobert template<class Alloc, class... UTypes> 59*4bdff4beSrobert constexpr explicit(see-below) 60*4bdff4beSrobert tuple(allocator_arg_t, const Alloc& a, tuple<UTypes...>&); // C++23 6146035553Spatrick template <class Alloc, class... U> 6276d0caaeSpatrick explicit(see-below) tuple(allocator_arg_t, const Alloc& a, const tuple<U...>&); // constexpr in C++20 6346035553Spatrick template <class Alloc, class... U> 6476d0caaeSpatrick explicit(see-below) tuple(allocator_arg_t, const Alloc& a, tuple<U...>&&); // constexpr in C++20 65*4bdff4beSrobert template<class Alloc, class... UTypes> 66*4bdff4beSrobert constexpr explicit(see-below) 67*4bdff4beSrobert tuple(allocator_arg_t, const Alloc& a, const tuple<UTypes...>&&); // C++23 68*4bdff4beSrobert template<class Alloc, class U1, class U2> 69*4bdff4beSrobert constexpr explicit(see-below) 70*4bdff4beSrobert tuple(allocator_arg_t, const Alloc& a, pair<U1, U2>&); // C++23 7146035553Spatrick template <class Alloc, class U1, class U2> 7276d0caaeSpatrick explicit(see-below) tuple(allocator_arg_t, const Alloc& a, const pair<U1, U2>&); // constexpr in C++20 7346035553Spatrick template <class Alloc, class U1, class U2> 7476d0caaeSpatrick explicit(see-below) tuple(allocator_arg_t, const Alloc& a, pair<U1, U2>&&); // constexpr in C++20 75*4bdff4beSrobert template<class Alloc, class U1, class U2> 76*4bdff4beSrobert constexpr explicit(see-below) 77*4bdff4beSrobert tuple(allocator_arg_t, const Alloc& a, const pair<U1, U2>&&); // C++23 7846035553Spatrick 7976d0caaeSpatrick tuple& operator=(const tuple&); // constexpr in C++20 80*4bdff4beSrobert constexpr const tuple& operator=(const tuple&) const; // C++23 8176d0caaeSpatrick tuple& operator=(tuple&&) noexcept(is_nothrow_move_assignable_v<T> && ...); // constexpr in C++20 82*4bdff4beSrobert constexpr const tuple& operator=(tuple&&) const; // C++23 8346035553Spatrick template <class... U> 8476d0caaeSpatrick tuple& operator=(const tuple<U...>&); // constexpr in C++20 85*4bdff4beSrobert template<class... UTypes> 86*4bdff4beSrobert constexpr const tuple& operator=(const tuple<UTypes...>&) const; // C++23 8746035553Spatrick template <class... U> 8876d0caaeSpatrick tuple& operator=(tuple<U...>&&); // constexpr in C++20 89*4bdff4beSrobert template<class... UTypes> 90*4bdff4beSrobert constexpr const tuple& operator=(tuple<UTypes...>&&) const; // C++23 9146035553Spatrick template <class U1, class U2> 9276d0caaeSpatrick tuple& operator=(const pair<U1, U2>&); // iff sizeof...(T) == 2 // constexpr in C++20 9346035553Spatrick template<class U1, class U2> 94*4bdff4beSrobert constexpr const tuple& operator=(const pair<U1, U2>&) const; // iff sizeof...(Types) == 2 // C++23 95*4bdff4beSrobert template <class U1, class U2> 9676d0caaeSpatrick tuple& operator=(pair<U1, U2>&&); // iff sizeof...(T) == 2 // constexpr in C++20 97*4bdff4beSrobert template<class U1, class U2> 98*4bdff4beSrobert constexpr const tuple& operator=(pair<U1, U2>&&) const; // iff sizeof...(Types) == 2 // C++23 9946035553Spatrick 10076d0caaeSpatrick template<class U, size_t N> 10176d0caaeSpatrick tuple& operator=(array<U, N> const&) // iff sizeof...(T) == N, EXTENSION 10276d0caaeSpatrick template<class U, size_t N> 10376d0caaeSpatrick tuple& operator=(array<U, N>&&) // iff sizeof...(T) == N, EXTENSION 10476d0caaeSpatrick 10576d0caaeSpatrick void swap(tuple&) noexcept(AND(swap(declval<T&>(), declval<T&>())...)); // constexpr in C++20 106*4bdff4beSrobert constexpr void swap(const tuple&) const noexcept(see-below); // C++23 107*4bdff4beSrobert}; 108*4bdff4beSrobert 109*4bdff4beSrobert 110*4bdff4beSroberttemplate<class... TTypes, class... UTypes, template<class> class TQual, template<class> class UQual> // since C++23 111*4bdff4beSrobert requires requires { typename tuple<common_reference_t<TQual<TTypes>, UQual<UTypes>>...>; } 112*4bdff4beSrobertstruct basic_common_reference<tuple<TTypes...>, tuple<UTypes...>, TQual, UQual> { 113*4bdff4beSrobert using type = tuple<common_reference_t<TQual<TTypes>, UQual<UTypes>>...>; 114*4bdff4beSrobert}; 115*4bdff4beSrobert 116*4bdff4beSroberttemplate<class... TTypes, class... UTypes> // since C++23 117*4bdff4beSrobert requires requires { typename tuple<common_type_t<TTypes, UTypes>...>; } 118*4bdff4beSrobertstruct common_type<tuple<TTypes...>, tuple<UTypes...>> { 119*4bdff4beSrobert using type = tuple<common_type_t<TTypes, UTypes>...>; 12046035553Spatrick}; 12146035553Spatrick 12246035553Spatricktemplate <class ...T> 12346035553Spatricktuple(T...) -> tuple<T...>; // since C++17 12446035553Spatricktemplate <class T1, class T2> 12546035553Spatricktuple(pair<T1, T2>) -> tuple<T1, T2>; // since C++17 12646035553Spatricktemplate <class Alloc, class ...T> 12746035553Spatricktuple(allocator_arg_t, Alloc, T...) -> tuple<T...>; // since C++17 12846035553Spatricktemplate <class Alloc, class T1, class T2> 12946035553Spatricktuple(allocator_arg_t, Alloc, pair<T1, T2>) -> tuple<T1, T2>; // since C++17 13046035553Spatricktemplate <class Alloc, class ...T> 13146035553Spatricktuple(allocator_arg_t, Alloc, tuple<T...>) -> tuple<T...>; // since C++17 13246035553Spatrick 13346035553Spatrickinline constexpr unspecified ignore; 13446035553Spatrick 13546035553Spatricktemplate <class... T> tuple<V...> make_tuple(T&&...); // constexpr in C++14 13646035553Spatricktemplate <class... T> tuple<ATypes...> forward_as_tuple(T&&...) noexcept; // constexpr in C++14 13746035553Spatricktemplate <class... T> tuple<T&...> tie(T&...) noexcept; // constexpr in C++14 13846035553Spatricktemplate <class... Tuples> tuple<CTypes...> tuple_cat(Tuples&&... tpls); // constexpr in C++14 13946035553Spatrick 14046035553Spatrick// [tuple.apply], calling a function with a tuple of arguments: 14146035553Spatricktemplate <class F, class Tuple> 14246035553Spatrick constexpr decltype(auto) apply(F&& f, Tuple&& t); // C++17 14346035553Spatricktemplate <class T, class Tuple> 14446035553Spatrick constexpr T make_from_tuple(Tuple&& t); // C++17 14546035553Spatrick 14646035553Spatrick// 20.4.1.4, tuple helper classes: 14746035553Spatricktemplate <class T> struct tuple_size; // undefined 14846035553Spatricktemplate <class... T> struct tuple_size<tuple<T...>>; 14946035553Spatricktemplate <class T> 15046035553Spatrick inline constexpr size_t tuple_size_v = tuple_size<T>::value; // C++17 15146035553Spatricktemplate <size_t I, class T> struct tuple_element; // undefined 15246035553Spatricktemplate <size_t I, class... T> struct tuple_element<I, tuple<T...>>; 15346035553Spatricktemplate <size_t I, class T> 15446035553Spatrick using tuple_element_t = typename tuple_element <I, T>::type; // C++14 15546035553Spatrick 15646035553Spatrick// 20.4.1.5, element access: 15746035553Spatricktemplate <size_t I, class... T> 15846035553Spatrick typename tuple_element<I, tuple<T...>>::type& 15946035553Spatrick get(tuple<T...>&) noexcept; // constexpr in C++14 16046035553Spatricktemplate <size_t I, class... T> 16146035553Spatrick const typename tuple_element<I, tuple<T...>>::type& 16246035553Spatrick get(const tuple<T...>&) noexcept; // constexpr in C++14 16346035553Spatricktemplate <size_t I, class... T> 16446035553Spatrick typename tuple_element<I, tuple<T...>>::type&& 16546035553Spatrick get(tuple<T...>&&) noexcept; // constexpr in C++14 16646035553Spatricktemplate <size_t I, class... T> 16746035553Spatrick const typename tuple_element<I, tuple<T...>>::type&& 16846035553Spatrick get(const tuple<T...>&&) noexcept; // constexpr in C++14 16946035553Spatrick 17046035553Spatricktemplate <class T1, class... T> 17146035553Spatrick constexpr T1& get(tuple<T...>&) noexcept; // C++14 17246035553Spatricktemplate <class T1, class... T> 17346035553Spatrick constexpr const T1& get(const tuple<T...>&) noexcept; // C++14 17446035553Spatricktemplate <class T1, class... T> 17546035553Spatrick constexpr T1&& get(tuple<T...>&&) noexcept; // C++14 17646035553Spatricktemplate <class T1, class... T> 17746035553Spatrick constexpr const T1&& get(const tuple<T...>&&) noexcept; // C++14 17846035553Spatrick 17946035553Spatrick// 20.4.1.6, relational operators: 18046035553Spatricktemplate<class... T, class... U> bool operator==(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14 181*4bdff4beSroberttemplate<class... T, class... U> bool operator<(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14, removed in C++20 182*4bdff4beSroberttemplate<class... T, class... U> bool operator!=(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14, removed in C++20 183*4bdff4beSroberttemplate<class... T, class... U> bool operator>(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14, removed in C++20 184*4bdff4beSroberttemplate<class... T, class... U> bool operator<=(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14, removed in C++20 185*4bdff4beSroberttemplate<class... T, class... U> bool operator>=(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14, removed in C++20 186*4bdff4beSroberttemplate<class... T, class... U> 187*4bdff4beSrobert constexpr common_comparison_category_t<synth-three-way-result<T, U>...> 188*4bdff4beSrobert operator<=>(const tuple<T...>&, const tuple<U...>&); // since C++20 18946035553Spatrick 19046035553Spatricktemplate <class... Types, class Alloc> 19146035553Spatrick struct uses_allocator<tuple<Types...>, Alloc>; 19246035553Spatrick 19346035553Spatricktemplate <class... Types> 19446035553Spatrick void 19546035553Spatrick swap(tuple<Types...>& x, tuple<Types...>& y) noexcept(noexcept(x.swap(y))); 19646035553Spatrick 197*4bdff4beSroberttemplate <class... Types> 198*4bdff4beSrobert constexpr void swap(const tuple<Types...>& x, const tuple<Types...>& y) noexcept(see-below); // C++23 199*4bdff4beSrobert 20046035553Spatrick} // std 20146035553Spatrick 20246035553Spatrick*/ 20346035553Spatrick 204*4bdff4beSrobert#include <__assert> // all public C++ headers provide the assertion handler 205*4bdff4beSrobert#include <__compare/common_comparison_category.h> 206*4bdff4beSrobert#include <__compare/synth_three_way.h> 20746035553Spatrick#include <__config> 208*4bdff4beSrobert#include <__functional/invoke.h> 20976d0caaeSpatrick#include <__functional/unwrap_ref.h> 210*4bdff4beSrobert#include <__fwd/array.h> 21176d0caaeSpatrick#include <__memory/allocator_arg_t.h> 21276d0caaeSpatrick#include <__memory/uses_allocator.h> 213*4bdff4beSrobert#include <__type_traits/apply_cv.h> 214*4bdff4beSrobert#include <__type_traits/common_reference.h> 215*4bdff4beSrobert#include <__type_traits/common_type.h> 216*4bdff4beSrobert#include <__type_traits/conditional.h> 217*4bdff4beSrobert#include <__type_traits/conjunction.h> 218*4bdff4beSrobert#include <__type_traits/copy_cvref.h> 219*4bdff4beSrobert#include <__type_traits/disjunction.h> 220*4bdff4beSrobert#include <__type_traits/is_arithmetic.h> 221*4bdff4beSrobert#include <__type_traits/is_assignable.h> 222*4bdff4beSrobert#include <__type_traits/is_constructible.h> 223*4bdff4beSrobert#include <__type_traits/is_convertible.h> 224*4bdff4beSrobert#include <__type_traits/is_copy_assignable.h> 225*4bdff4beSrobert#include <__type_traits/is_copy_constructible.h> 226*4bdff4beSrobert#include <__type_traits/is_default_constructible.h> 227*4bdff4beSrobert#include <__type_traits/is_empty.h> 228*4bdff4beSrobert#include <__type_traits/is_final.h> 229*4bdff4beSrobert#include <__type_traits/is_implicitly_default_constructible.h> 230*4bdff4beSrobert#include <__type_traits/is_move_assignable.h> 231*4bdff4beSrobert#include <__type_traits/is_move_constructible.h> 232*4bdff4beSrobert#include <__type_traits/is_nothrow_assignable.h> 233*4bdff4beSrobert#include <__type_traits/is_nothrow_constructible.h> 234*4bdff4beSrobert#include <__type_traits/is_nothrow_copy_assignable.h> 235*4bdff4beSrobert#include <__type_traits/is_nothrow_copy_constructible.h> 236*4bdff4beSrobert#include <__type_traits/is_nothrow_default_constructible.h> 237*4bdff4beSrobert#include <__type_traits/is_nothrow_move_assignable.h> 238*4bdff4beSrobert#include <__type_traits/is_reference.h> 239*4bdff4beSrobert#include <__type_traits/is_same.h> 240*4bdff4beSrobert#include <__type_traits/is_swappable.h> 241*4bdff4beSrobert#include <__type_traits/lazy.h> 242*4bdff4beSrobert#include <__type_traits/maybe_const.h> 243*4bdff4beSrobert#include <__type_traits/nat.h> 244*4bdff4beSrobert#include <__type_traits/negation.h> 245*4bdff4beSrobert#include <__type_traits/remove_cvref.h> 246*4bdff4beSrobert#include <__type_traits/remove_reference.h> 24776d0caaeSpatrick#include <__utility/forward.h> 248*4bdff4beSrobert#include <__utility/integer_sequence.h> 24976d0caaeSpatrick#include <__utility/move.h> 250*4bdff4beSrobert#include <__utility/pair.h> 251*4bdff4beSrobert#include <__utility/piecewise_construct.h> 252*4bdff4beSrobert#include <__utility/swap.h> 25346035553Spatrick#include <cstddef> 25446035553Spatrick#include <version> 25546035553Spatrick 256*4bdff4beSrobert// standard-mandated includes 257*4bdff4beSrobert 258*4bdff4beSrobert// [tuple.syn] 259*4bdff4beSrobert#include <compare> 260*4bdff4beSrobert 26146035553Spatrick#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 26246035553Spatrick# pragma GCC system_header 26346035553Spatrick#endif 26446035553Spatrick 26546035553Spatrick_LIBCPP_BEGIN_NAMESPACE_STD 26646035553Spatrick 26746035553Spatrick#ifndef _LIBCPP_CXX03_LANG 26846035553Spatrick 26946035553Spatrick 27046035553Spatrick// __tuple_leaf 27146035553Spatrick 27246035553Spatricktemplate <size_t _Ip, class _Hp, 27346035553Spatrick bool=is_empty<_Hp>::value && !__libcpp_is_final<_Hp>::value 27446035553Spatrick > 27546035553Spatrickclass __tuple_leaf; 27646035553Spatrick 27746035553Spatricktemplate <size_t _Ip, class _Hp, bool _Ep> 278*4bdff4beSrobertinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 27946035553Spatrickvoid swap(__tuple_leaf<_Ip, _Hp, _Ep>& __x, __tuple_leaf<_Ip, _Hp, _Ep>& __y) 28046035553Spatrick _NOEXCEPT_(__is_nothrow_swappable<_Hp>::value) 28146035553Spatrick{ 28246035553Spatrick swap(__x.get(), __y.get()); 28346035553Spatrick} 28446035553Spatrick 285*4bdff4beSroberttemplate <size_t _Ip, class _Hp, bool _Ep> 286*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 287*4bdff4beSrobertvoid swap(const __tuple_leaf<_Ip, _Hp, _Ep>& __x, const __tuple_leaf<_Ip, _Hp, _Ep>& __y) 288*4bdff4beSrobert _NOEXCEPT_(__is_nothrow_swappable<const _Hp>::value) { 289*4bdff4beSrobert swap(__x.get(), __y.get()); 290*4bdff4beSrobert} 291*4bdff4beSrobert 29246035553Spatricktemplate <size_t _Ip, class _Hp, bool> 29346035553Spatrickclass __tuple_leaf 29446035553Spatrick{ 29546035553Spatrick _Hp __value_; 29646035553Spatrick 29746035553Spatrick template <class _Tp> 29846035553Spatrick static constexpr bool __can_bind_reference() { 29946035553Spatrick#if __has_keyword(__reference_binds_to_temporary) 30046035553Spatrick return !__reference_binds_to_temporary(_Hp, _Tp); 30146035553Spatrick#else 30246035553Spatrick return true; 30346035553Spatrick#endif 30446035553Spatrick } 30546035553Spatrick 306*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX14 30746035553Spatrick __tuple_leaf& operator=(const __tuple_leaf&); 30846035553Spatrickpublic: 30976d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY constexpr __tuple_leaf() 31046035553Spatrick _NOEXCEPT_(is_nothrow_default_constructible<_Hp>::value) : __value_() 31146035553Spatrick {static_assert(!is_reference<_Hp>::value, 31246035553Spatrick "Attempted to default construct a reference element in a tuple");} 31346035553Spatrick 31446035553Spatrick template <class _Alloc> 31576d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY constexpr 31646035553Spatrick __tuple_leaf(integral_constant<int, 0>, const _Alloc&) 31746035553Spatrick : __value_() 31846035553Spatrick {static_assert(!is_reference<_Hp>::value, 31946035553Spatrick "Attempted to default construct a reference element in a tuple");} 32046035553Spatrick 32146035553Spatrick template <class _Alloc> 32276d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY constexpr 32346035553Spatrick __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a) 32446035553Spatrick : __value_(allocator_arg_t(), __a) 32546035553Spatrick {static_assert(!is_reference<_Hp>::value, 32646035553Spatrick "Attempted to default construct a reference element in a tuple");} 32746035553Spatrick 32846035553Spatrick template <class _Alloc> 32976d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY constexpr 33046035553Spatrick __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a) 33146035553Spatrick : __value_(__a) 33246035553Spatrick {static_assert(!is_reference<_Hp>::value, 33346035553Spatrick "Attempted to default construct a reference element in a tuple");} 33446035553Spatrick 33546035553Spatrick template <class _Tp, 336*4bdff4beSrobert class = __enable_if_t< 33746035553Spatrick _And< 338*4bdff4beSrobert _IsNotSame<__remove_cvref_t<_Tp>, __tuple_leaf>, 33946035553Spatrick is_constructible<_Hp, _Tp> 34046035553Spatrick >::value 34146035553Spatrick > 34246035553Spatrick > 343*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 34446035553Spatrick explicit __tuple_leaf(_Tp&& __t) _NOEXCEPT_((is_nothrow_constructible<_Hp, _Tp>::value)) 34546035553Spatrick : __value_(_VSTD::forward<_Tp>(__t)) 34646035553Spatrick {static_assert(__can_bind_reference<_Tp&&>(), 34746035553Spatrick "Attempted construction of reference element binds to a temporary whose lifetime has ended");} 34846035553Spatrick 34946035553Spatrick template <class _Tp, class _Alloc> 350*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 35146035553Spatrick explicit __tuple_leaf(integral_constant<int, 0>, const _Alloc&, _Tp&& __t) 35246035553Spatrick : __value_(_VSTD::forward<_Tp>(__t)) 35346035553Spatrick {static_assert(__can_bind_reference<_Tp&&>(), 35446035553Spatrick "Attempted construction of reference element binds to a temporary whose lifetime has ended");} 35546035553Spatrick 35646035553Spatrick template <class _Tp, class _Alloc> 357*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 35846035553Spatrick explicit __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a, _Tp&& __t) 35946035553Spatrick : __value_(allocator_arg_t(), __a, _VSTD::forward<_Tp>(__t)) 36046035553Spatrick {static_assert(!is_reference<_Hp>::value, 36146035553Spatrick "Attempted to uses-allocator construct a reference element in a tuple");} 36246035553Spatrick 36346035553Spatrick template <class _Tp, class _Alloc> 364*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 36546035553Spatrick explicit __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a, _Tp&& __t) 36646035553Spatrick : __value_(_VSTD::forward<_Tp>(__t), __a) 36746035553Spatrick {static_assert(!is_reference<_Hp>::value, 36846035553Spatrick "Attempted to uses-allocator construct a reference element in a tuple");} 36946035553Spatrick 37046035553Spatrick __tuple_leaf(const __tuple_leaf& __t) = default; 37146035553Spatrick __tuple_leaf(__tuple_leaf&& __t) = default; 37246035553Spatrick 373*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 37446035553Spatrick int swap(__tuple_leaf& __t) _NOEXCEPT_(__is_nothrow_swappable<__tuple_leaf>::value) 37546035553Spatrick { 37646035553Spatrick _VSTD::swap(*this, __t); 37746035553Spatrick return 0; 37846035553Spatrick } 37946035553Spatrick 380*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 381*4bdff4beSrobert int swap(const __tuple_leaf& __t) const _NOEXCEPT_(__is_nothrow_swappable<const __tuple_leaf>::value) { 382*4bdff4beSrobert _VSTD::swap(*this, __t); 383*4bdff4beSrobert return 0; 384*4bdff4beSrobert } 385*4bdff4beSrobert 386*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 _Hp& get() _NOEXCEPT {return __value_;} 387*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 const _Hp& get() const _NOEXCEPT {return __value_;} 38846035553Spatrick}; 38946035553Spatrick 39046035553Spatricktemplate <size_t _Ip, class _Hp> 39146035553Spatrickclass __tuple_leaf<_Ip, _Hp, true> 39246035553Spatrick : private _Hp 39346035553Spatrick{ 394*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX14 39546035553Spatrick __tuple_leaf& operator=(const __tuple_leaf&); 39646035553Spatrickpublic: 39776d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY constexpr __tuple_leaf() 39846035553Spatrick _NOEXCEPT_(is_nothrow_default_constructible<_Hp>::value) {} 39946035553Spatrick 40046035553Spatrick template <class _Alloc> 40176d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY constexpr 40246035553Spatrick __tuple_leaf(integral_constant<int, 0>, const _Alloc&) {} 40346035553Spatrick 40446035553Spatrick template <class _Alloc> 40576d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY constexpr 40646035553Spatrick __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a) 40746035553Spatrick : _Hp(allocator_arg_t(), __a) {} 40846035553Spatrick 40946035553Spatrick template <class _Alloc> 41076d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY constexpr 41146035553Spatrick __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a) 41246035553Spatrick : _Hp(__a) {} 41346035553Spatrick 41446035553Spatrick template <class _Tp, 415*4bdff4beSrobert class = __enable_if_t< 41646035553Spatrick _And< 417*4bdff4beSrobert _IsNotSame<__remove_cvref_t<_Tp>, __tuple_leaf>, 41846035553Spatrick is_constructible<_Hp, _Tp> 41946035553Spatrick >::value 42046035553Spatrick > 42146035553Spatrick > 422*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 42346035553Spatrick explicit __tuple_leaf(_Tp&& __t) _NOEXCEPT_((is_nothrow_constructible<_Hp, _Tp>::value)) 42446035553Spatrick : _Hp(_VSTD::forward<_Tp>(__t)) {} 42546035553Spatrick 42646035553Spatrick template <class _Tp, class _Alloc> 42776d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY constexpr 42846035553Spatrick explicit __tuple_leaf(integral_constant<int, 0>, const _Alloc&, _Tp&& __t) 42946035553Spatrick : _Hp(_VSTD::forward<_Tp>(__t)) {} 43046035553Spatrick 43146035553Spatrick template <class _Tp, class _Alloc> 43276d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY constexpr 43346035553Spatrick explicit __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a, _Tp&& __t) 43446035553Spatrick : _Hp(allocator_arg_t(), __a, _VSTD::forward<_Tp>(__t)) {} 43546035553Spatrick 43646035553Spatrick template <class _Tp, class _Alloc> 43776d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY constexpr 43846035553Spatrick explicit __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a, _Tp&& __t) 43946035553Spatrick : _Hp(_VSTD::forward<_Tp>(__t), __a) {} 44046035553Spatrick 44146035553Spatrick __tuple_leaf(__tuple_leaf const &) = default; 44246035553Spatrick __tuple_leaf(__tuple_leaf &&) = default; 44346035553Spatrick 444*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 44546035553Spatrick int 44646035553Spatrick swap(__tuple_leaf& __t) _NOEXCEPT_(__is_nothrow_swappable<__tuple_leaf>::value) 44746035553Spatrick { 44846035553Spatrick _VSTD::swap(*this, __t); 44946035553Spatrick return 0; 45046035553Spatrick } 45146035553Spatrick 452*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 453*4bdff4beSrobert int swap(const __tuple_leaf& __rhs) const _NOEXCEPT_(__is_nothrow_swappable<const __tuple_leaf>::value) { 454*4bdff4beSrobert _VSTD::swap(*this, __rhs); 455*4bdff4beSrobert return 0; 456*4bdff4beSrobert } 457*4bdff4beSrobert 458*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 _Hp& get() _NOEXCEPT {return static_cast<_Hp&>(*this);} 459*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 const _Hp& get() const _NOEXCEPT {return static_cast<const _Hp&>(*this);} 46046035553Spatrick}; 46146035553Spatrick 46246035553Spatricktemplate <class ..._Tp> 463*4bdff4beSrobert_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 46446035553Spatrickvoid __swallow(_Tp&&...) _NOEXCEPT {} 46546035553Spatrick 46646035553Spatricktemplate <class _Tp> 46746035553Spatrickstruct __all_default_constructible; 46846035553Spatrick 46946035553Spatricktemplate <class ..._Tp> 47046035553Spatrickstruct __all_default_constructible<__tuple_types<_Tp...>> 47146035553Spatrick : __all<is_default_constructible<_Tp>::value...> 47246035553Spatrick{ }; 47346035553Spatrick 47446035553Spatrick// __tuple_impl 47546035553Spatrick 47646035553Spatricktemplate<class _Indx, class ..._Tp> struct __tuple_impl; 47746035553Spatrick 47846035553Spatricktemplate<size_t ..._Indx, class ..._Tp> 47946035553Spatrickstruct _LIBCPP_DECLSPEC_EMPTY_BASES __tuple_impl<__tuple_indices<_Indx...>, _Tp...> 48046035553Spatrick : public __tuple_leaf<_Indx, _Tp>... 48146035553Spatrick{ 48246035553Spatrick _LIBCPP_INLINE_VISIBILITY 48376d0caaeSpatrick constexpr __tuple_impl() 48446035553Spatrick _NOEXCEPT_(__all<is_nothrow_default_constructible<_Tp>::value...>::value) {} 48546035553Spatrick 48646035553Spatrick template <size_t ..._Uf, class ..._Tf, 48746035553Spatrick size_t ..._Ul, class ..._Tl, class ..._Up> 488*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 48946035553Spatrick explicit 49046035553Spatrick __tuple_impl(__tuple_indices<_Uf...>, __tuple_types<_Tf...>, 49146035553Spatrick __tuple_indices<_Ul...>, __tuple_types<_Tl...>, 49246035553Spatrick _Up&&... __u) 49346035553Spatrick _NOEXCEPT_((__all<is_nothrow_constructible<_Tf, _Up>::value...>::value && 49446035553Spatrick __all<is_nothrow_default_constructible<_Tl>::value...>::value)) : 49546035553Spatrick __tuple_leaf<_Uf, _Tf>(_VSTD::forward<_Up>(__u))..., 49646035553Spatrick __tuple_leaf<_Ul, _Tl>()... 49746035553Spatrick {} 49846035553Spatrick 49946035553Spatrick template <class _Alloc, size_t ..._Uf, class ..._Tf, 50046035553Spatrick size_t ..._Ul, class ..._Tl, class ..._Up> 501*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 50246035553Spatrick explicit 50346035553Spatrick __tuple_impl(allocator_arg_t, const _Alloc& __a, 50446035553Spatrick __tuple_indices<_Uf...>, __tuple_types<_Tf...>, 50546035553Spatrick __tuple_indices<_Ul...>, __tuple_types<_Tl...>, 50646035553Spatrick _Up&&... __u) : 50746035553Spatrick __tuple_leaf<_Uf, _Tf>(__uses_alloc_ctor<_Tf, _Alloc, _Up>(), __a, 50846035553Spatrick _VSTD::forward<_Up>(__u))..., 50946035553Spatrick __tuple_leaf<_Ul, _Tl>(__uses_alloc_ctor<_Tl, _Alloc>(), __a)... 51046035553Spatrick {} 51146035553Spatrick 51246035553Spatrick template <class _Tuple, 513*4bdff4beSrobert class = __enable_if_t<__tuple_constructible<_Tuple, tuple<_Tp...> >::value> 51446035553Spatrick > 515*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 51646035553Spatrick __tuple_impl(_Tuple&& __t) _NOEXCEPT_((__all<is_nothrow_constructible<_Tp, typename tuple_element<_Indx, 51746035553Spatrick typename __make_tuple_types<_Tuple>::type>::type>::value...>::value)) 51846035553Spatrick : __tuple_leaf<_Indx, _Tp>(_VSTD::forward<typename tuple_element<_Indx, 51946035553Spatrick typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<_Indx>(__t)))... 52046035553Spatrick {} 52146035553Spatrick 52246035553Spatrick template <class _Alloc, class _Tuple, 523*4bdff4beSrobert class = __enable_if_t<__tuple_constructible<_Tuple, tuple<_Tp...> >::value> 52446035553Spatrick > 525*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 52646035553Spatrick __tuple_impl(allocator_arg_t, const _Alloc& __a, _Tuple&& __t) 52746035553Spatrick : __tuple_leaf<_Indx, _Tp>(__uses_alloc_ctor<_Tp, _Alloc, typename tuple_element<_Indx, 52846035553Spatrick typename __make_tuple_types<_Tuple>::type>::type>(), __a, 52946035553Spatrick _VSTD::forward<typename tuple_element<_Indx, 53046035553Spatrick typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<_Indx>(__t)))... 53146035553Spatrick {} 53246035553Spatrick 53346035553Spatrick __tuple_impl(const __tuple_impl&) = default; 53446035553Spatrick __tuple_impl(__tuple_impl&&) = default; 53546035553Spatrick 536*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 53746035553Spatrick void swap(__tuple_impl& __t) 53846035553Spatrick _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value) 53946035553Spatrick { 54076d0caaeSpatrick _VSTD::__swallow(__tuple_leaf<_Indx, _Tp>::swap(static_cast<__tuple_leaf<_Indx, _Tp>&>(__t))...); 54146035553Spatrick } 542*4bdff4beSrobert 543*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 544*4bdff4beSrobert void swap(const __tuple_impl& __t) const 545*4bdff4beSrobert _NOEXCEPT_(__all<__is_nothrow_swappable<const _Tp>::value...>::value) 546*4bdff4beSrobert { 547*4bdff4beSrobert _VSTD::__swallow(__tuple_leaf<_Indx, _Tp>::swap(static_cast<const __tuple_leaf<_Indx, _Tp>&>(__t))...); 548*4bdff4beSrobert } 54946035553Spatrick}; 55046035553Spatrick 55176d0caaeSpatricktemplate<class _Dest, class _Source, size_t ..._Np> 552*4bdff4beSrobert_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 55376d0caaeSpatrickvoid __memberwise_copy_assign(_Dest& __dest, _Source const& __source, __tuple_indices<_Np...>) { 55476d0caaeSpatrick _VSTD::__swallow(((_VSTD::get<_Np>(__dest) = _VSTD::get<_Np>(__source)), void(), 0)...); 55576d0caaeSpatrick} 55646035553Spatrick 55776d0caaeSpatricktemplate<class _Dest, class _Source, class ..._Up, size_t ..._Np> 558*4bdff4beSrobert_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 55976d0caaeSpatrickvoid __memberwise_forward_assign(_Dest& __dest, _Source&& __source, __tuple_types<_Up...>, __tuple_indices<_Np...>) { 56076d0caaeSpatrick _VSTD::__swallow((( 56176d0caaeSpatrick _VSTD::get<_Np>(__dest) = _VSTD::forward<_Up>(_VSTD::get<_Np>(__source)) 56276d0caaeSpatrick ), void(), 0)...); 56376d0caaeSpatrick} 56446035553Spatrick 56546035553Spatricktemplate <class ..._Tp> 56646035553Spatrickclass _LIBCPP_TEMPLATE_VIS tuple 56746035553Spatrick{ 56846035553Spatrick typedef __tuple_impl<typename __make_tuple_indices<sizeof...(_Tp)>::type, _Tp...> _BaseT; 56946035553Spatrick 57046035553Spatrick _BaseT __base_; 57146035553Spatrick 572*4bdff4beSrobert template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_SINCE_CXX14 57346035553Spatrick typename tuple_element<_Jp, tuple<_Up...> >::type& get(tuple<_Up...>&) _NOEXCEPT; 574*4bdff4beSrobert template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_SINCE_CXX14 57546035553Spatrick const typename tuple_element<_Jp, tuple<_Up...> >::type& get(const tuple<_Up...>&) _NOEXCEPT; 576*4bdff4beSrobert template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_SINCE_CXX14 57746035553Spatrick typename tuple_element<_Jp, tuple<_Up...> >::type&& get(tuple<_Up...>&&) _NOEXCEPT; 578*4bdff4beSrobert template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_SINCE_CXX14 57946035553Spatrick const typename tuple_element<_Jp, tuple<_Up...> >::type&& get(const tuple<_Up...>&&) _NOEXCEPT; 58046035553Spatrickpublic: 58176d0caaeSpatrick // [tuple.cnstr] 58246035553Spatrick 58376d0caaeSpatrick // tuple() constructors (including allocator_arg_t variants) 584*4bdff4beSrobert template <template<class...> class _IsImpDefault = __is_implicitly_default_constructible, __enable_if_t< 58576d0caaeSpatrick _And< 58676d0caaeSpatrick _IsImpDefault<_Tp>... // explicit check 58776d0caaeSpatrick >::value 58876d0caaeSpatrick , int> = 0> 58946035553Spatrick _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 59046035553Spatrick tuple() 59176d0caaeSpatrick _NOEXCEPT_(_And<is_nothrow_default_constructible<_Tp>...>::value) 59276d0caaeSpatrick { } 59346035553Spatrick 59476d0caaeSpatrick template <template<class...> class _IsImpDefault = __is_implicitly_default_constructible, 595*4bdff4beSrobert template<class...> class _IsDefault = is_default_constructible, __enable_if_t< 59676d0caaeSpatrick _And< 59776d0caaeSpatrick _IsDefault<_Tp>..., 59876d0caaeSpatrick _Not<_Lazy<_And, _IsImpDefault<_Tp>...> > // explicit check 59976d0caaeSpatrick >::value 60076d0caaeSpatrick , int> = 0> 60176d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 60276d0caaeSpatrick explicit tuple() 60376d0caaeSpatrick _NOEXCEPT_(_And<is_nothrow_default_constructible<_Tp>...>::value) 60476d0caaeSpatrick { } 60546035553Spatrick 606*4bdff4beSrobert template <class _Alloc, template<class...> class _IsImpDefault = __is_implicitly_default_constructible, __enable_if_t< 60776d0caaeSpatrick _And< 60876d0caaeSpatrick _IsImpDefault<_Tp>... // explicit check 60976d0caaeSpatrick >::value 61076d0caaeSpatrick , int> = 0> 611*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 61276d0caaeSpatrick tuple(allocator_arg_t, _Alloc const& __a) 61376d0caaeSpatrick : __base_(allocator_arg_t(), __a, 61476d0caaeSpatrick __tuple_indices<>(), __tuple_types<>(), 61576d0caaeSpatrick typename __make_tuple_indices<sizeof...(_Tp), 0>::type(), 61676d0caaeSpatrick __tuple_types<_Tp...>()) {} 61776d0caaeSpatrick 61876d0caaeSpatrick template <class _Alloc, 61976d0caaeSpatrick template<class...> class _IsImpDefault = __is_implicitly_default_constructible, 620*4bdff4beSrobert template<class...> class _IsDefault = is_default_constructible, __enable_if_t< 62176d0caaeSpatrick _And< 62276d0caaeSpatrick _IsDefault<_Tp>..., 62376d0caaeSpatrick _Not<_Lazy<_And, _IsImpDefault<_Tp>...> > // explicit check 62476d0caaeSpatrick >::value 62576d0caaeSpatrick , int> = 0> 626*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 62776d0caaeSpatrick explicit tuple(allocator_arg_t, _Alloc const& __a) 62876d0caaeSpatrick : __base_(allocator_arg_t(), __a, 62976d0caaeSpatrick __tuple_indices<>(), __tuple_types<>(), 63076d0caaeSpatrick typename __make_tuple_indices<sizeof...(_Tp), 0>::type(), 63176d0caaeSpatrick __tuple_types<_Tp...>()) {} 63276d0caaeSpatrick 63376d0caaeSpatrick // tuple(const T&...) constructors (including allocator_arg_t variants) 634*4bdff4beSrobert template <template<class...> class _And = _And, __enable_if_t< 63576d0caaeSpatrick _And< 63676d0caaeSpatrick _BoolConstant<sizeof...(_Tp) >= 1>, 63776d0caaeSpatrick is_copy_constructible<_Tp>..., 63876d0caaeSpatrick is_convertible<const _Tp&, _Tp>... // explicit check 63976d0caaeSpatrick >::value 64076d0caaeSpatrick , int> = 0> 641*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 64276d0caaeSpatrick tuple(const _Tp& ... __t) 64376d0caaeSpatrick _NOEXCEPT_(_And<is_nothrow_copy_constructible<_Tp>...>::value) 64476d0caaeSpatrick : __base_(typename __make_tuple_indices<sizeof...(_Tp)>::type(), 64576d0caaeSpatrick typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(), 64676d0caaeSpatrick typename __make_tuple_indices<0>::type(), 64776d0caaeSpatrick typename __make_tuple_types<tuple, 0>::type(), 64876d0caaeSpatrick __t... 64976d0caaeSpatrick ) {} 65076d0caaeSpatrick 651*4bdff4beSrobert template <template<class...> class _And = _And, __enable_if_t< 65276d0caaeSpatrick _And< 65376d0caaeSpatrick _BoolConstant<sizeof...(_Tp) >= 1>, 65476d0caaeSpatrick is_copy_constructible<_Tp>..., 65576d0caaeSpatrick _Not<_Lazy<_And, is_convertible<const _Tp&, _Tp>...> > // explicit check 65676d0caaeSpatrick >::value 65776d0caaeSpatrick , int> = 0> 658*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 65976d0caaeSpatrick explicit tuple(const _Tp& ... __t) 66076d0caaeSpatrick _NOEXCEPT_(_And<is_nothrow_copy_constructible<_Tp>...>::value) 66176d0caaeSpatrick : __base_(typename __make_tuple_indices<sizeof...(_Tp)>::type(), 66276d0caaeSpatrick typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(), 66376d0caaeSpatrick typename __make_tuple_indices<0>::type(), 66476d0caaeSpatrick typename __make_tuple_types<tuple, 0>::type(), 66576d0caaeSpatrick __t... 66676d0caaeSpatrick ) {} 66776d0caaeSpatrick 668*4bdff4beSrobert template <class _Alloc, template<class...> class _And = _And, __enable_if_t< 66976d0caaeSpatrick _And< 67076d0caaeSpatrick _BoolConstant<sizeof...(_Tp) >= 1>, 67176d0caaeSpatrick is_copy_constructible<_Tp>..., 67276d0caaeSpatrick is_convertible<const _Tp&, _Tp>... // explicit check 67376d0caaeSpatrick >::value 67476d0caaeSpatrick , int> = 0> 675*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 67676d0caaeSpatrick tuple(allocator_arg_t, const _Alloc& __a, const _Tp& ... __t) 67776d0caaeSpatrick : __base_(allocator_arg_t(), __a, 67876d0caaeSpatrick typename __make_tuple_indices<sizeof...(_Tp)>::type(), 67976d0caaeSpatrick typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(), 68076d0caaeSpatrick typename __make_tuple_indices<0>::type(), 68176d0caaeSpatrick typename __make_tuple_types<tuple, 0>::type(), 68276d0caaeSpatrick __t... 68376d0caaeSpatrick ) {} 68476d0caaeSpatrick 685*4bdff4beSrobert template <class _Alloc, template<class...> class _And = _And, __enable_if_t< 68676d0caaeSpatrick _And< 68776d0caaeSpatrick _BoolConstant<sizeof...(_Tp) >= 1>, 68876d0caaeSpatrick is_copy_constructible<_Tp>..., 68976d0caaeSpatrick _Not<_Lazy<_And, is_convertible<const _Tp&, _Tp>...> > // explicit check 69076d0caaeSpatrick >::value 69176d0caaeSpatrick , int> = 0> 692*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 69376d0caaeSpatrick explicit tuple(allocator_arg_t, const _Alloc& __a, const _Tp& ... __t) 69476d0caaeSpatrick : __base_(allocator_arg_t(), __a, 69576d0caaeSpatrick typename __make_tuple_indices<sizeof...(_Tp)>::type(), 69676d0caaeSpatrick typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(), 69776d0caaeSpatrick typename __make_tuple_indices<0>::type(), 69876d0caaeSpatrick typename __make_tuple_types<tuple, 0>::type(), 69976d0caaeSpatrick __t... 70076d0caaeSpatrick ) {} 70176d0caaeSpatrick 70276d0caaeSpatrick // tuple(U&& ...) constructors (including allocator_arg_t variants) 70376d0caaeSpatrick template <class ..._Up> struct _IsThisTuple : false_type { }; 704*4bdff4beSrobert template <class _Up> struct _IsThisTuple<_Up> : is_same<__remove_cvref_t<_Up>, tuple> { }; 70576d0caaeSpatrick 70676d0caaeSpatrick template <class ..._Up> 70776d0caaeSpatrick struct _EnableUTypesCtor : _And< 70876d0caaeSpatrick _BoolConstant<sizeof...(_Tp) >= 1>, 70976d0caaeSpatrick _Not<_IsThisTuple<_Up...> >, // extension to allow mis-behaved user constructors 71076d0caaeSpatrick is_constructible<_Tp, _Up>... 71176d0caaeSpatrick > { }; 71276d0caaeSpatrick 713*4bdff4beSrobert template <class ..._Up, __enable_if_t< 71476d0caaeSpatrick _And< 71576d0caaeSpatrick _BoolConstant<sizeof...(_Up) == sizeof...(_Tp)>, 71676d0caaeSpatrick _EnableUTypesCtor<_Up...>, 71776d0caaeSpatrick is_convertible<_Up, _Tp>... // explicit check 71876d0caaeSpatrick >::value 71976d0caaeSpatrick , int> = 0> 720*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 72176d0caaeSpatrick tuple(_Up&&... __u) 72276d0caaeSpatrick _NOEXCEPT_((_And<is_nothrow_constructible<_Tp, _Up>...>::value)) 72376d0caaeSpatrick : __base_(typename __make_tuple_indices<sizeof...(_Up)>::type(), 72476d0caaeSpatrick typename __make_tuple_types<tuple, sizeof...(_Up)>::type(), 72576d0caaeSpatrick typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(), 72676d0caaeSpatrick typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(), 72776d0caaeSpatrick _VSTD::forward<_Up>(__u)...) {} 72876d0caaeSpatrick 729*4bdff4beSrobert template <class ..._Up, __enable_if_t< 73076d0caaeSpatrick _And< 73176d0caaeSpatrick _BoolConstant<sizeof...(_Up) == sizeof...(_Tp)>, 73276d0caaeSpatrick _EnableUTypesCtor<_Up...>, 73376d0caaeSpatrick _Not<_Lazy<_And, is_convertible<_Up, _Tp>...> > // explicit check 73476d0caaeSpatrick >::value 73576d0caaeSpatrick , int> = 0> 736*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 73776d0caaeSpatrick explicit tuple(_Up&&... __u) 73876d0caaeSpatrick _NOEXCEPT_((_And<is_nothrow_constructible<_Tp, _Up>...>::value)) 73976d0caaeSpatrick : __base_(typename __make_tuple_indices<sizeof...(_Up)>::type(), 74076d0caaeSpatrick typename __make_tuple_types<tuple, sizeof...(_Up)>::type(), 74176d0caaeSpatrick typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(), 74276d0caaeSpatrick typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(), 74376d0caaeSpatrick _VSTD::forward<_Up>(__u)...) {} 74476d0caaeSpatrick 745*4bdff4beSrobert template <class _Alloc, class ..._Up, __enable_if_t< 74676d0caaeSpatrick _And< 74776d0caaeSpatrick _BoolConstant<sizeof...(_Up) == sizeof...(_Tp)>, 74876d0caaeSpatrick _EnableUTypesCtor<_Up...>, 74976d0caaeSpatrick is_convertible<_Up, _Tp>... // explicit check 75076d0caaeSpatrick >::value 75176d0caaeSpatrick , int> = 0> 752*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 75376d0caaeSpatrick tuple(allocator_arg_t, const _Alloc& __a, _Up&&... __u) 75476d0caaeSpatrick : __base_(allocator_arg_t(), __a, 75576d0caaeSpatrick typename __make_tuple_indices<sizeof...(_Up)>::type(), 75676d0caaeSpatrick typename __make_tuple_types<tuple, sizeof...(_Up)>::type(), 75776d0caaeSpatrick typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(), 75876d0caaeSpatrick typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(), 75976d0caaeSpatrick _VSTD::forward<_Up>(__u)...) {} 76076d0caaeSpatrick 761*4bdff4beSrobert template <class _Alloc, class ..._Up, __enable_if_t< 76276d0caaeSpatrick _And< 76376d0caaeSpatrick _BoolConstant<sizeof...(_Up) == sizeof...(_Tp)>, 76476d0caaeSpatrick _EnableUTypesCtor<_Up...>, 76576d0caaeSpatrick _Not<_Lazy<_And, is_convertible<_Up, _Tp>...> > // explicit check 76676d0caaeSpatrick >::value 76776d0caaeSpatrick , int> = 0> 768*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 76976d0caaeSpatrick explicit tuple(allocator_arg_t, const _Alloc& __a, _Up&&... __u) 77076d0caaeSpatrick : __base_(allocator_arg_t(), __a, 77176d0caaeSpatrick typename __make_tuple_indices<sizeof...(_Up)>::type(), 77276d0caaeSpatrick typename __make_tuple_types<tuple, sizeof...(_Up)>::type(), 77376d0caaeSpatrick typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(), 77476d0caaeSpatrick typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(), 77576d0caaeSpatrick _VSTD::forward<_Up>(__u)...) {} 77676d0caaeSpatrick 77776d0caaeSpatrick // Copy and move constructors (including the allocator_arg_t variants) 77876d0caaeSpatrick tuple(const tuple&) = default; 77946035553Spatrick tuple(tuple&&) = default; 78046035553Spatrick 781*4bdff4beSrobert template <class _Alloc, template<class...> class _And = _And, __enable_if_t< 78276d0caaeSpatrick _And<is_copy_constructible<_Tp>...>::value 78376d0caaeSpatrick , int> = 0> 784*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 78576d0caaeSpatrick tuple(allocator_arg_t, const _Alloc& __alloc, const tuple& __t) 78676d0caaeSpatrick : __base_(allocator_arg_t(), __alloc, __t) 78776d0caaeSpatrick { } 78846035553Spatrick 789*4bdff4beSrobert template <class _Alloc, template<class...> class _And = _And, __enable_if_t< 79076d0caaeSpatrick _And<is_move_constructible<_Tp>...>::value 79176d0caaeSpatrick , int> = 0> 792*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 79376d0caaeSpatrick tuple(allocator_arg_t, const _Alloc& __alloc, tuple&& __t) 79476d0caaeSpatrick : __base_(allocator_arg_t(), __alloc, _VSTD::move(__t)) 79576d0caaeSpatrick { } 79646035553Spatrick 79776d0caaeSpatrick // tuple(const tuple<U...>&) constructors (including allocator_arg_t variants) 798*4bdff4beSrobert 799*4bdff4beSrobert template <class _OtherTuple, class _DecayedOtherTuple = __remove_cvref_t<_OtherTuple>, class = void> 800*4bdff4beSrobert struct _EnableCtorFromUTypesTuple : false_type {}; 801*4bdff4beSrobert 802*4bdff4beSrobert template <class _OtherTuple, class... _Up> 803*4bdff4beSrobert struct _EnableCtorFromUTypesTuple<_OtherTuple, tuple<_Up...>, 804*4bdff4beSrobert // the length of the packs needs to checked first otherwise the 2 packs cannot be expanded simultaneously below 805*4bdff4beSrobert __enable_if_t<sizeof...(_Up) == sizeof...(_Tp)>> : _And< 806*4bdff4beSrobert // the two conditions below are not in spec. The purpose is to disable the UTypes Ctor when copy/move Ctor can work. 807*4bdff4beSrobert // Otherwise, is_constructible can trigger hard error in those cases https://godbolt.org/z/M94cGdKcE 808*4bdff4beSrobert _Not<is_same<_OtherTuple, const tuple&> >, 809*4bdff4beSrobert _Not<is_same<_OtherTuple, tuple&&> >, 810*4bdff4beSrobert is_constructible<_Tp, __copy_cvref_t<_OtherTuple, _Up> >..., 811*4bdff4beSrobert _Lazy<_Or, _BoolConstant<sizeof...(_Tp) != 1>, 81276d0caaeSpatrick // _Tp and _Up are 1-element packs - the pack expansions look 81376d0caaeSpatrick // weird to avoid tripping up the type traits in degenerate cases 81476d0caaeSpatrick _Lazy<_And, 815*4bdff4beSrobert _Not<is_same<_Tp, _Up> >..., 816*4bdff4beSrobert _Not<is_convertible<_OtherTuple, _Tp> >..., 817*4bdff4beSrobert _Not<is_constructible<_Tp, _OtherTuple> >... 81846035553Spatrick > 819*4bdff4beSrobert > 82076d0caaeSpatrick > {}; 82146035553Spatrick 822*4bdff4beSrobert template <class ..._Up, __enable_if_t< 82376d0caaeSpatrick _And< 824*4bdff4beSrobert _EnableCtorFromUTypesTuple<const tuple<_Up...>&>, 82576d0caaeSpatrick is_convertible<const _Up&, _Tp>... // explicit check 82646035553Spatrick >::value 82776d0caaeSpatrick , int> = 0> 828*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 82976d0caaeSpatrick tuple(const tuple<_Up...>& __t) 83076d0caaeSpatrick _NOEXCEPT_((_And<is_nothrow_constructible<_Tp, const _Up&>...>::value)) 83176d0caaeSpatrick : __base_(__t) 83276d0caaeSpatrick { } 83376d0caaeSpatrick 834*4bdff4beSrobert template <class ..._Up, __enable_if_t< 83576d0caaeSpatrick _And< 836*4bdff4beSrobert _EnableCtorFromUTypesTuple<const tuple<_Up...>&>, 83776d0caaeSpatrick _Not<_Lazy<_And, is_convertible<const _Up&, _Tp>...> > // explicit check 83846035553Spatrick >::value 83976d0caaeSpatrick , int> = 0> 840*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 84176d0caaeSpatrick explicit tuple(const tuple<_Up...>& __t) 84276d0caaeSpatrick _NOEXCEPT_((_And<is_nothrow_constructible<_Tp, const _Up&>...>::value)) 84376d0caaeSpatrick : __base_(__t) 84476d0caaeSpatrick { } 84546035553Spatrick 846*4bdff4beSrobert template <class ..._Up, class _Alloc, __enable_if_t< 84776d0caaeSpatrick _And< 848*4bdff4beSrobert _EnableCtorFromUTypesTuple<const tuple<_Up...>&>, 84976d0caaeSpatrick is_convertible<const _Up&, _Tp>... // explicit check 85076d0caaeSpatrick >::value 85176d0caaeSpatrick , int> = 0> 852*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 85376d0caaeSpatrick tuple(allocator_arg_t, const _Alloc& __a, const tuple<_Up...>& __t) 85476d0caaeSpatrick : __base_(allocator_arg_t(), __a, __t) 85576d0caaeSpatrick { } 85646035553Spatrick 857*4bdff4beSrobert template <class ..._Up, class _Alloc, __enable_if_t< 85876d0caaeSpatrick _And< 859*4bdff4beSrobert _EnableCtorFromUTypesTuple<const tuple<_Up...>&>, 86076d0caaeSpatrick _Not<_Lazy<_And, is_convertible<const _Up&, _Tp>...> > // explicit check 86176d0caaeSpatrick >::value 86276d0caaeSpatrick , int> = 0> 863*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 86476d0caaeSpatrick explicit tuple(allocator_arg_t, const _Alloc& __a, const tuple<_Up...>& __t) 86576d0caaeSpatrick : __base_(allocator_arg_t(), __a, __t) 86676d0caaeSpatrick { } 86746035553Spatrick 868*4bdff4beSrobert#if _LIBCPP_STD_VER > 20 869*4bdff4beSrobert // tuple(tuple<U...>&) constructors (including allocator_arg_t variants) 87046035553Spatrick 871*4bdff4beSrobert template <class... _Up, enable_if_t< 872*4bdff4beSrobert _EnableCtorFromUTypesTuple<tuple<_Up...>&>::value>* = nullptr> 873*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr 874*4bdff4beSrobert explicit(!(is_convertible_v<_Up&, _Tp> && ...)) 875*4bdff4beSrobert tuple(tuple<_Up...>& __t) : __base_(__t) {} 876*4bdff4beSrobert 877*4bdff4beSrobert template <class _Alloc, class... _Up, enable_if_t< 878*4bdff4beSrobert _EnableCtorFromUTypesTuple<tuple<_Up...>&>::value>* = nullptr> 879*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr 880*4bdff4beSrobert explicit(!(is_convertible_v<_Up&, _Tp> && ...)) 881*4bdff4beSrobert tuple(allocator_arg_t, const _Alloc& __alloc, tuple<_Up...>& __t) : __base_(allocator_arg_t(), __alloc, __t) {} 882*4bdff4beSrobert#endif // _LIBCPP_STD_VER > 20 883*4bdff4beSrobert 884*4bdff4beSrobert // tuple(tuple<U...>&&) constructors (including allocator_arg_t variants) 885*4bdff4beSrobert 886*4bdff4beSrobert template <class ..._Up, __enable_if_t< 88776d0caaeSpatrick _And< 888*4bdff4beSrobert _EnableCtorFromUTypesTuple<tuple<_Up...>&&>, 88976d0caaeSpatrick is_convertible<_Up, _Tp>... // explicit check 89076d0caaeSpatrick >::value 89176d0caaeSpatrick , int> = 0> 892*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 89376d0caaeSpatrick tuple(tuple<_Up...>&& __t) 89476d0caaeSpatrick _NOEXCEPT_((_And<is_nothrow_constructible<_Tp, _Up>...>::value)) 89576d0caaeSpatrick : __base_(_VSTD::move(__t)) 89676d0caaeSpatrick { } 89746035553Spatrick 898*4bdff4beSrobert template <class ..._Up, __enable_if_t< 89976d0caaeSpatrick _And< 900*4bdff4beSrobert _EnableCtorFromUTypesTuple<tuple<_Up...>&&>, 90176d0caaeSpatrick _Not<_Lazy<_And, is_convertible<_Up, _Tp>...> > // explicit check 90276d0caaeSpatrick >::value 90376d0caaeSpatrick , int> = 0> 904*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 90576d0caaeSpatrick explicit tuple(tuple<_Up...>&& __t) 90676d0caaeSpatrick _NOEXCEPT_((_And<is_nothrow_constructible<_Tp, _Up>...>::value)) 90776d0caaeSpatrick : __base_(_VSTD::move(__t)) 90876d0caaeSpatrick { } 90946035553Spatrick 910*4bdff4beSrobert template <class _Alloc, class ..._Up, __enable_if_t< 91176d0caaeSpatrick _And< 912*4bdff4beSrobert _EnableCtorFromUTypesTuple<tuple<_Up...>&&>, 91376d0caaeSpatrick is_convertible<_Up, _Tp>... // explicit check 91476d0caaeSpatrick >::value 91576d0caaeSpatrick , int> = 0> 916*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 91776d0caaeSpatrick tuple(allocator_arg_t, const _Alloc& __a, tuple<_Up...>&& __t) 91876d0caaeSpatrick : __base_(allocator_arg_t(), __a, _VSTD::move(__t)) 91976d0caaeSpatrick { } 92076d0caaeSpatrick 921*4bdff4beSrobert template <class _Alloc, class ..._Up, __enable_if_t< 92276d0caaeSpatrick _And< 923*4bdff4beSrobert _EnableCtorFromUTypesTuple<tuple<_Up...>&&>, 92476d0caaeSpatrick _Not<_Lazy<_And, is_convertible<_Up, _Tp>...> > // explicit check 92576d0caaeSpatrick >::value 92676d0caaeSpatrick , int> = 0> 927*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 92876d0caaeSpatrick explicit tuple(allocator_arg_t, const _Alloc& __a, tuple<_Up...>&& __t) 92976d0caaeSpatrick : __base_(allocator_arg_t(), __a, _VSTD::move(__t)) 93076d0caaeSpatrick { } 93176d0caaeSpatrick 932*4bdff4beSrobert#if _LIBCPP_STD_VER > 20 933*4bdff4beSrobert // tuple(const tuple<U...>&&) constructors (including allocator_arg_t variants) 934*4bdff4beSrobert 935*4bdff4beSrobert template <class... _Up, enable_if_t< 936*4bdff4beSrobert _EnableCtorFromUTypesTuple<const tuple<_Up...>&&>::value>* = nullptr> 937*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr 938*4bdff4beSrobert explicit(!(is_convertible_v<const _Up&&, _Tp> && ...)) 939*4bdff4beSrobert tuple(const tuple<_Up...>&& __t) : __base_(std::move(__t)) {} 940*4bdff4beSrobert 941*4bdff4beSrobert template <class _Alloc, class... _Up, enable_if_t< 942*4bdff4beSrobert _EnableCtorFromUTypesTuple<const tuple<_Up...>&&>::value>* = nullptr> 943*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr 944*4bdff4beSrobert explicit(!(is_convertible_v<const _Up&&, _Tp> && ...)) 945*4bdff4beSrobert tuple(allocator_arg_t, const _Alloc& __alloc, const tuple<_Up...>&& __t) 946*4bdff4beSrobert : __base_(allocator_arg_t(), __alloc, std::move(__t)) {} 947*4bdff4beSrobert#endif // _LIBCPP_STD_VER > 20 948*4bdff4beSrobert 94976d0caaeSpatrick // tuple(const pair<U1, U2>&) constructors (including allocator_arg_t variants) 950*4bdff4beSrobert 951*4bdff4beSrobert template <template <class...> class Pred, class _Pair, class _DecayedPair = __remove_cvref_t<_Pair>, class _Tuple = tuple> 952*4bdff4beSrobert struct _CtorPredicateFromPair : false_type{}; 953*4bdff4beSrobert 954*4bdff4beSrobert template <template <class...> class Pred, class _Pair, class _Up1, class _Up2, class _Tp1, class _Tp2> 955*4bdff4beSrobert struct _CtorPredicateFromPair<Pred, _Pair, pair<_Up1, _Up2>, tuple<_Tp1, _Tp2> > : _And< 956*4bdff4beSrobert Pred<_Tp1, __copy_cvref_t<_Pair, _Up1> >, 957*4bdff4beSrobert Pred<_Tp2, __copy_cvref_t<_Pair, _Up2> > 95876d0caaeSpatrick > {}; 95976d0caaeSpatrick 960*4bdff4beSrobert template <class _Pair> 961*4bdff4beSrobert struct _EnableCtorFromPair : _CtorPredicateFromPair<is_constructible, _Pair>{}; 962*4bdff4beSrobert 963*4bdff4beSrobert template <class _Pair> 964*4bdff4beSrobert struct _NothrowConstructibleFromPair : _CtorPredicateFromPair<is_nothrow_constructible, _Pair>{}; 965*4bdff4beSrobert 966*4bdff4beSrobert template <class _Pair, class _DecayedPair = __remove_cvref_t<_Pair>, class _Tuple = tuple> 967*4bdff4beSrobert struct _BothImplicitlyConvertible : false_type{}; 968*4bdff4beSrobert 969*4bdff4beSrobert template <class _Pair, class _Up1, class _Up2, class _Tp1, class _Tp2> 970*4bdff4beSrobert struct _BothImplicitlyConvertible<_Pair, pair<_Up1, _Up2>, tuple<_Tp1, _Tp2> > : _And< 971*4bdff4beSrobert is_convertible<__copy_cvref_t<_Pair, _Up1>, _Tp1>, 972*4bdff4beSrobert is_convertible<__copy_cvref_t<_Pair, _Up2>, _Tp2> 97376d0caaeSpatrick > {}; 97476d0caaeSpatrick 975*4bdff4beSrobert template <class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t< 97676d0caaeSpatrick _And< 977*4bdff4beSrobert _EnableCtorFromPair<const pair<_Up1, _Up2>&>, 978*4bdff4beSrobert _BothImplicitlyConvertible<const pair<_Up1, _Up2>&> // explicit check 97976d0caaeSpatrick >::value 98076d0caaeSpatrick , int> = 0> 981*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 98276d0caaeSpatrick tuple(const pair<_Up1, _Up2>& __p) 983*4bdff4beSrobert _NOEXCEPT_((_NothrowConstructibleFromPair<const pair<_Up1, _Up2>&>::value)) 98476d0caaeSpatrick : __base_(__p) 98576d0caaeSpatrick { } 98676d0caaeSpatrick 987*4bdff4beSrobert template <class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t< 98876d0caaeSpatrick _And< 989*4bdff4beSrobert _EnableCtorFromPair<const pair<_Up1, _Up2>&>, 990*4bdff4beSrobert _Not<_BothImplicitlyConvertible<const pair<_Up1, _Up2>&> > // explicit check 99176d0caaeSpatrick >::value 99276d0caaeSpatrick , int> = 0> 993*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 99476d0caaeSpatrick explicit tuple(const pair<_Up1, _Up2>& __p) 995*4bdff4beSrobert _NOEXCEPT_((_NothrowConstructibleFromPair<const pair<_Up1, _Up2>&>::value)) 99676d0caaeSpatrick : __base_(__p) 99776d0caaeSpatrick { } 99876d0caaeSpatrick 999*4bdff4beSrobert template <class _Alloc, class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t< 100076d0caaeSpatrick _And< 1001*4bdff4beSrobert _EnableCtorFromPair<const pair<_Up1, _Up2>&>, 1002*4bdff4beSrobert _BothImplicitlyConvertible<const pair<_Up1, _Up2>&> // explicit check 100376d0caaeSpatrick >::value 100476d0caaeSpatrick , int> = 0> 1005*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 100676d0caaeSpatrick tuple(allocator_arg_t, const _Alloc& __a, const pair<_Up1, _Up2>& __p) 100776d0caaeSpatrick : __base_(allocator_arg_t(), __a, __p) 100876d0caaeSpatrick { } 100976d0caaeSpatrick 1010*4bdff4beSrobert template <class _Alloc, class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t< 101176d0caaeSpatrick _And< 1012*4bdff4beSrobert _EnableCtorFromPair<const pair<_Up1, _Up2>&>, 1013*4bdff4beSrobert _Not<_BothImplicitlyConvertible<const pair<_Up1, _Up2>&> > // explicit check 101476d0caaeSpatrick >::value 101576d0caaeSpatrick , int> = 0> 1016*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 101776d0caaeSpatrick explicit tuple(allocator_arg_t, const _Alloc& __a, const pair<_Up1, _Up2>& __p) 101876d0caaeSpatrick : __base_(allocator_arg_t(), __a, __p) 101976d0caaeSpatrick { } 102076d0caaeSpatrick 1021*4bdff4beSrobert#if _LIBCPP_STD_VER > 20 1022*4bdff4beSrobert // tuple(pair<U1, U2>&) constructors (including allocator_arg_t variants) 1023*4bdff4beSrobert 1024*4bdff4beSrobert template <class _U1, class _U2, enable_if_t< 1025*4bdff4beSrobert _EnableCtorFromPair<pair<_U1, _U2>&>::value>* = nullptr> 1026*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr 1027*4bdff4beSrobert explicit(!_BothImplicitlyConvertible<pair<_U1, _U2>&>::value) 1028*4bdff4beSrobert tuple(pair<_U1, _U2>& __p) : __base_(__p) {} 1029*4bdff4beSrobert 1030*4bdff4beSrobert template <class _Alloc, class _U1, class _U2, enable_if_t< 1031*4bdff4beSrobert _EnableCtorFromPair<std::pair<_U1, _U2>&>::value>* = nullptr> 1032*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr 1033*4bdff4beSrobert explicit(!_BothImplicitlyConvertible<pair<_U1, _U2>&>::value) 1034*4bdff4beSrobert tuple(allocator_arg_t, const _Alloc& __alloc, pair<_U1, _U2>& __p) : __base_(allocator_arg_t(), __alloc, __p) {} 1035*4bdff4beSrobert#endif 1036*4bdff4beSrobert 103776d0caaeSpatrick // tuple(pair<U1, U2>&&) constructors (including allocator_arg_t variants) 103876d0caaeSpatrick 1039*4bdff4beSrobert template <class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t< 104076d0caaeSpatrick _And< 1041*4bdff4beSrobert _EnableCtorFromPair<pair<_Up1, _Up2>&&>, 1042*4bdff4beSrobert _BothImplicitlyConvertible<pair<_Up1, _Up2>&&> // explicit check 104376d0caaeSpatrick >::value 104476d0caaeSpatrick , int> = 0> 1045*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 104676d0caaeSpatrick tuple(pair<_Up1, _Up2>&& __p) 1047*4bdff4beSrobert _NOEXCEPT_((_NothrowConstructibleFromPair<pair<_Up1, _Up2>&&>::value)) 104876d0caaeSpatrick : __base_(_VSTD::move(__p)) 104976d0caaeSpatrick { } 105076d0caaeSpatrick 1051*4bdff4beSrobert template <class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t< 105276d0caaeSpatrick _And< 1053*4bdff4beSrobert _EnableCtorFromPair<pair<_Up1, _Up2>&&>, 1054*4bdff4beSrobert _Not<_BothImplicitlyConvertible<pair<_Up1, _Up2>&&> > // explicit check 105576d0caaeSpatrick >::value 105676d0caaeSpatrick , int> = 0> 1057*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 105876d0caaeSpatrick explicit tuple(pair<_Up1, _Up2>&& __p) 1059*4bdff4beSrobert _NOEXCEPT_((_NothrowConstructibleFromPair<pair<_Up1, _Up2>&&>::value)) 106076d0caaeSpatrick : __base_(_VSTD::move(__p)) 106176d0caaeSpatrick { } 106276d0caaeSpatrick 1063*4bdff4beSrobert template <class _Alloc, class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t< 106476d0caaeSpatrick _And< 1065*4bdff4beSrobert _EnableCtorFromPair<pair<_Up1, _Up2>&&>, 1066*4bdff4beSrobert _BothImplicitlyConvertible<pair<_Up1, _Up2>&&> // explicit check 106776d0caaeSpatrick >::value 106876d0caaeSpatrick , int> = 0> 1069*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 107076d0caaeSpatrick tuple(allocator_arg_t, const _Alloc& __a, pair<_Up1, _Up2>&& __p) 107176d0caaeSpatrick : __base_(allocator_arg_t(), __a, _VSTD::move(__p)) 107276d0caaeSpatrick { } 107376d0caaeSpatrick 1074*4bdff4beSrobert template <class _Alloc, class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t< 107576d0caaeSpatrick _And< 1076*4bdff4beSrobert _EnableCtorFromPair<pair<_Up1, _Up2>&&>, 1077*4bdff4beSrobert _Not<_BothImplicitlyConvertible<pair<_Up1, _Up2>&&> > // explicit check 107876d0caaeSpatrick >::value 107976d0caaeSpatrick , int> = 0> 1080*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 108176d0caaeSpatrick explicit tuple(allocator_arg_t, const _Alloc& __a, pair<_Up1, _Up2>&& __p) 108276d0caaeSpatrick : __base_(allocator_arg_t(), __a, _VSTD::move(__p)) 108376d0caaeSpatrick { } 108476d0caaeSpatrick 1085*4bdff4beSrobert#if _LIBCPP_STD_VER > 20 1086*4bdff4beSrobert // tuple(const pair<U1, U2>&&) constructors (including allocator_arg_t variants) 1087*4bdff4beSrobert 1088*4bdff4beSrobert template <class _U1, class _U2, enable_if_t< 1089*4bdff4beSrobert _EnableCtorFromPair<const pair<_U1, _U2>&&>::value>* = nullptr> 1090*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr 1091*4bdff4beSrobert explicit(!_BothImplicitlyConvertible<const pair<_U1, _U2>&&>::value) 1092*4bdff4beSrobert tuple(const pair<_U1, _U2>&& __p) : __base_(std::move(__p)) {} 1093*4bdff4beSrobert 1094*4bdff4beSrobert template <class _Alloc, class _U1, class _U2, enable_if_t< 1095*4bdff4beSrobert _EnableCtorFromPair<const pair<_U1, _U2>&&>::value>* = nullptr> 1096*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr 1097*4bdff4beSrobert explicit(!_BothImplicitlyConvertible<const pair<_U1, _U2>&&>::value) 1098*4bdff4beSrobert tuple(allocator_arg_t, const _Alloc& __alloc, const pair<_U1, _U2>&& __p) 1099*4bdff4beSrobert : __base_(allocator_arg_t(), __alloc, std::move(__p)) {} 1100*4bdff4beSrobert#endif // _LIBCPP_STD_VER > 20 1101*4bdff4beSrobert 110276d0caaeSpatrick // [tuple.assign] 1103*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 110476d0caaeSpatrick tuple& operator=(_If<_And<is_copy_assignable<_Tp>...>::value, tuple, __nat> const& __tuple) 110576d0caaeSpatrick _NOEXCEPT_((_And<is_nothrow_copy_assignable<_Tp>...>::value)) 110646035553Spatrick { 110776d0caaeSpatrick _VSTD::__memberwise_copy_assign(*this, __tuple, 110876d0caaeSpatrick typename __make_tuple_indices<sizeof...(_Tp)>::type()); 110946035553Spatrick return *this; 111046035553Spatrick } 111146035553Spatrick 1112*4bdff4beSrobert#if _LIBCPP_STD_VER > 20 1113*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr 1114*4bdff4beSrobert const tuple& operator=(tuple const& __tuple) const 1115*4bdff4beSrobert requires (_And<is_copy_assignable<const _Tp>...>::value) { 1116*4bdff4beSrobert std::__memberwise_copy_assign(*this, __tuple, typename __make_tuple_indices<sizeof...(_Tp)>::type()); 1117*4bdff4beSrobert return *this; 1118*4bdff4beSrobert } 1119*4bdff4beSrobert 1120*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr 1121*4bdff4beSrobert const tuple& operator=(tuple&& __tuple) const 1122*4bdff4beSrobert requires (_And<is_assignable<const _Tp&, _Tp>...>::value) { 1123*4bdff4beSrobert std::__memberwise_forward_assign(*this, 1124*4bdff4beSrobert std::move(__tuple), 1125*4bdff4beSrobert __tuple_types<_Tp...>(), 1126*4bdff4beSrobert typename __make_tuple_indices<sizeof...(_Tp)>::type()); 1127*4bdff4beSrobert return *this; 1128*4bdff4beSrobert } 1129*4bdff4beSrobert#endif // _LIBCPP_STD_VER > 20 1130*4bdff4beSrobert 1131*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 113276d0caaeSpatrick tuple& operator=(_If<_And<is_move_assignable<_Tp>...>::value, tuple, __nat>&& __tuple) 113376d0caaeSpatrick _NOEXCEPT_((_And<is_nothrow_move_assignable<_Tp>...>::value)) 113446035553Spatrick { 113576d0caaeSpatrick _VSTD::__memberwise_forward_assign(*this, _VSTD::move(__tuple), 113676d0caaeSpatrick __tuple_types<_Tp...>(), 113776d0caaeSpatrick typename __make_tuple_indices<sizeof...(_Tp)>::type()); 113846035553Spatrick return *this; 113946035553Spatrick } 114046035553Spatrick 1141*4bdff4beSrobert template<class... _Up, __enable_if_t< 114276d0caaeSpatrick _And< 114376d0caaeSpatrick _BoolConstant<sizeof...(_Tp) == sizeof...(_Up)>, 114476d0caaeSpatrick is_assignable<_Tp&, _Up const&>... 114576d0caaeSpatrick >::value 114676d0caaeSpatrick ,int> = 0> 1147*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 114876d0caaeSpatrick tuple& operator=(tuple<_Up...> const& __tuple) 114976d0caaeSpatrick _NOEXCEPT_((_And<is_nothrow_assignable<_Tp&, _Up const&>...>::value)) 115046035553Spatrick { 115176d0caaeSpatrick _VSTD::__memberwise_copy_assign(*this, __tuple, 115276d0caaeSpatrick typename __make_tuple_indices<sizeof...(_Tp)>::type()); 115346035553Spatrick return *this; 115446035553Spatrick } 115546035553Spatrick 1156*4bdff4beSrobert template<class... _Up, __enable_if_t< 115776d0caaeSpatrick _And< 115876d0caaeSpatrick _BoolConstant<sizeof...(_Tp) == sizeof...(_Up)>, 115976d0caaeSpatrick is_assignable<_Tp&, _Up>... 116076d0caaeSpatrick >::value 116176d0caaeSpatrick ,int> = 0> 1162*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 116376d0caaeSpatrick tuple& operator=(tuple<_Up...>&& __tuple) 116476d0caaeSpatrick _NOEXCEPT_((_And<is_nothrow_assignable<_Tp&, _Up>...>::value)) 116576d0caaeSpatrick { 116676d0caaeSpatrick _VSTD::__memberwise_forward_assign(*this, _VSTD::move(__tuple), 116776d0caaeSpatrick __tuple_types<_Up...>(), 116876d0caaeSpatrick typename __make_tuple_indices<sizeof...(_Tp)>::type()); 116976d0caaeSpatrick return *this; 117076d0caaeSpatrick } 117176d0caaeSpatrick 1172*4bdff4beSrobert 1173*4bdff4beSrobert#if _LIBCPP_STD_VER > 20 1174*4bdff4beSrobert template <class... _UTypes, enable_if_t< 1175*4bdff4beSrobert _And<_BoolConstant<sizeof...(_Tp) == sizeof...(_UTypes)>, 1176*4bdff4beSrobert is_assignable<const _Tp&, const _UTypes&>...>::value>* = nullptr> 1177*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr 1178*4bdff4beSrobert const tuple& operator=(const tuple<_UTypes...>& __u) const { 1179*4bdff4beSrobert std::__memberwise_copy_assign(*this, 1180*4bdff4beSrobert __u, 1181*4bdff4beSrobert typename __make_tuple_indices<sizeof...(_Tp)>::type()); 1182*4bdff4beSrobert return *this; 1183*4bdff4beSrobert } 1184*4bdff4beSrobert 1185*4bdff4beSrobert template <class... _UTypes, enable_if_t< 1186*4bdff4beSrobert _And<_BoolConstant<sizeof...(_Tp) == sizeof...(_UTypes)>, 1187*4bdff4beSrobert is_assignable<const _Tp&, _UTypes>...>::value>* = nullptr> 1188*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr 1189*4bdff4beSrobert const tuple& operator=(tuple<_UTypes...>&& __u) const { 1190*4bdff4beSrobert std::__memberwise_forward_assign(*this, 1191*4bdff4beSrobert __u, 1192*4bdff4beSrobert __tuple_types<_UTypes...>(), 1193*4bdff4beSrobert typename __make_tuple_indices<sizeof...(_Tp)>::type()); 1194*4bdff4beSrobert return *this; 1195*4bdff4beSrobert } 1196*4bdff4beSrobert#endif // _LIBCPP_STD_VER > 20 1197*4bdff4beSrobert 1198*4bdff4beSrobert template <template<class...> class Pred, bool _Const, 1199*4bdff4beSrobert class _Pair, class _DecayedPair = __remove_cvref_t<_Pair>, class _Tuple = tuple> 1200*4bdff4beSrobert struct _AssignPredicateFromPair : false_type {}; 1201*4bdff4beSrobert 1202*4bdff4beSrobert template <template<class...> class Pred, bool _Const, 1203*4bdff4beSrobert class _Pair, class _Up1, class _Up2, class _Tp1, class _Tp2> 1204*4bdff4beSrobert struct _AssignPredicateFromPair<Pred, _Const, _Pair, pair<_Up1, _Up2>, tuple<_Tp1, _Tp2> > : 1205*4bdff4beSrobert _And<Pred<__maybe_const<_Const, _Tp1>&, __copy_cvref_t<_Pair, _Up1> >, 1206*4bdff4beSrobert Pred<__maybe_const<_Const, _Tp2>&, __copy_cvref_t<_Pair, _Up2> > 1207*4bdff4beSrobert > {}; 1208*4bdff4beSrobert 1209*4bdff4beSrobert template <bool _Const, class _Pair> 1210*4bdff4beSrobert struct _EnableAssignFromPair : _AssignPredicateFromPair<is_assignable, _Const, _Pair> {}; 1211*4bdff4beSrobert 1212*4bdff4beSrobert template <bool _Const, class _Pair> 1213*4bdff4beSrobert struct _NothrowAssignFromPair : _AssignPredicateFromPair<is_nothrow_assignable, _Const, _Pair> {}; 1214*4bdff4beSrobert 1215*4bdff4beSrobert#if _LIBCPP_STD_VER > 20 1216*4bdff4beSrobert template <class _U1, class _U2, enable_if_t< 1217*4bdff4beSrobert _EnableAssignFromPair<true, const pair<_U1, _U2>&>::value>* = nullptr> 1218*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr 1219*4bdff4beSrobert const tuple& operator=(const pair<_U1, _U2>& __pair) const 1220*4bdff4beSrobert noexcept(_NothrowAssignFromPair<true, const pair<_U1, _U2>&>::value) { 1221*4bdff4beSrobert std::get<0>(*this) = __pair.first; 1222*4bdff4beSrobert std::get<1>(*this) = __pair.second; 1223*4bdff4beSrobert return *this; 1224*4bdff4beSrobert } 1225*4bdff4beSrobert 1226*4bdff4beSrobert template <class _U1, class _U2, enable_if_t< 1227*4bdff4beSrobert _EnableAssignFromPair<true, pair<_U1, _U2>&&>::value>* = nullptr> 1228*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr 1229*4bdff4beSrobert const tuple& operator=(pair<_U1, _U2>&& __pair) const 1230*4bdff4beSrobert noexcept(_NothrowAssignFromPair<true, pair<_U1, _U2>&&>::value) { 1231*4bdff4beSrobert std::get<0>(*this) = std::move(__pair.first); 1232*4bdff4beSrobert std::get<1>(*this) = std::move(__pair.second); 1233*4bdff4beSrobert return *this; 1234*4bdff4beSrobert } 1235*4bdff4beSrobert#endif // _LIBCPP_STD_VER > 20 1236*4bdff4beSrobert 1237*4bdff4beSrobert template<class _Up1, class _Up2, __enable_if_t< 1238*4bdff4beSrobert _EnableAssignFromPair<false, pair<_Up1, _Up2> const&>::value 123976d0caaeSpatrick ,int> = 0> 1240*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 124176d0caaeSpatrick tuple& operator=(pair<_Up1, _Up2> const& __pair) 1242*4bdff4beSrobert _NOEXCEPT_((_NothrowAssignFromPair<false, pair<_Up1, _Up2> const&>::value)) 124376d0caaeSpatrick { 124476d0caaeSpatrick _VSTD::get<0>(*this) = __pair.first; 124576d0caaeSpatrick _VSTD::get<1>(*this) = __pair.second; 124676d0caaeSpatrick return *this; 124776d0caaeSpatrick } 124876d0caaeSpatrick 1249*4bdff4beSrobert template<class _Up1, class _Up2, __enable_if_t< 1250*4bdff4beSrobert _EnableAssignFromPair<false, pair<_Up1, _Up2>&&>::value 125176d0caaeSpatrick ,int> = 0> 1252*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 125376d0caaeSpatrick tuple& operator=(pair<_Up1, _Up2>&& __pair) 1254*4bdff4beSrobert _NOEXCEPT_((_NothrowAssignFromPair<false, pair<_Up1, _Up2>&&>::value)) 125576d0caaeSpatrick { 125676d0caaeSpatrick _VSTD::get<0>(*this) = _VSTD::forward<_Up1>(__pair.first); 125776d0caaeSpatrick _VSTD::get<1>(*this) = _VSTD::forward<_Up2>(__pair.second); 125876d0caaeSpatrick return *this; 125976d0caaeSpatrick } 126076d0caaeSpatrick 126176d0caaeSpatrick // EXTENSION 1262*4bdff4beSrobert template<class _Up, size_t _Np, class = __enable_if_t< 126376d0caaeSpatrick _And< 126476d0caaeSpatrick _BoolConstant<_Np == sizeof...(_Tp)>, 126576d0caaeSpatrick is_assignable<_Tp&, _Up const&>... 126676d0caaeSpatrick >::value 126776d0caaeSpatrick > > 1268*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 126976d0caaeSpatrick tuple& operator=(array<_Up, _Np> const& __array) 127076d0caaeSpatrick _NOEXCEPT_((_And<is_nothrow_assignable<_Tp&, _Up const&>...>::value)) 127176d0caaeSpatrick { 127276d0caaeSpatrick _VSTD::__memberwise_copy_assign(*this, __array, 127376d0caaeSpatrick typename __make_tuple_indices<sizeof...(_Tp)>::type()); 127476d0caaeSpatrick return *this; 127576d0caaeSpatrick } 127676d0caaeSpatrick 127776d0caaeSpatrick // EXTENSION 1278*4bdff4beSrobert template<class _Up, size_t _Np, class = void, class = __enable_if_t< 127976d0caaeSpatrick _And< 128076d0caaeSpatrick _BoolConstant<_Np == sizeof...(_Tp)>, 128176d0caaeSpatrick is_assignable<_Tp&, _Up>... 128276d0caaeSpatrick >::value 128376d0caaeSpatrick > > 1284*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 128576d0caaeSpatrick tuple& operator=(array<_Up, _Np>&& __array) 128676d0caaeSpatrick _NOEXCEPT_((_And<is_nothrow_assignable<_Tp&, _Up>...>::value)) 128776d0caaeSpatrick { 128876d0caaeSpatrick _VSTD::__memberwise_forward_assign(*this, _VSTD::move(__array), 128976d0caaeSpatrick __tuple_types<_If<true, _Up, _Tp>...>(), 129076d0caaeSpatrick typename __make_tuple_indices<sizeof...(_Tp)>::type()); 129176d0caaeSpatrick return *this; 129276d0caaeSpatrick } 129376d0caaeSpatrick 129476d0caaeSpatrick // [tuple.swap] 1295*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 129646035553Spatrick void swap(tuple& __t) _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value) 129746035553Spatrick {__base_.swap(__t.__base_);} 1298*4bdff4beSrobert 1299*4bdff4beSrobert#if _LIBCPP_STD_VER > 20 1300*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr 1301*4bdff4beSrobert void swap(const tuple& __t) const noexcept(__all<is_nothrow_swappable_v<const _Tp&>...>::value) { 1302*4bdff4beSrobert __base_.swap(__t.__base_); 1303*4bdff4beSrobert } 1304*4bdff4beSrobert#endif // _LIBCPP_STD_VER > 20 130546035553Spatrick}; 130646035553Spatrick 130746035553Spatricktemplate <> 130846035553Spatrickclass _LIBCPP_TEMPLATE_VIS tuple<> 130946035553Spatrick{ 131046035553Spatrickpublic: 131176d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY constexpr 131276d0caaeSpatrick tuple() _NOEXCEPT = default; 131346035553Spatrick template <class _Alloc> 1314*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 131546035553Spatrick tuple(allocator_arg_t, const _Alloc&) _NOEXCEPT {} 131646035553Spatrick template <class _Alloc> 1317*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 131846035553Spatrick tuple(allocator_arg_t, const _Alloc&, const tuple&) _NOEXCEPT {} 131946035553Spatrick template <class _Up> 1320*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 132146035553Spatrick tuple(array<_Up, 0>) _NOEXCEPT {} 132246035553Spatrick template <class _Alloc, class _Up> 1323*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 132446035553Spatrick tuple(allocator_arg_t, const _Alloc&, array<_Up, 0>) _NOEXCEPT {} 1325*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 132646035553Spatrick void swap(tuple&) _NOEXCEPT {} 1327*4bdff4beSrobert#if _LIBCPP_STD_VER > 20 1328*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr void swap(const tuple&) const noexcept {} 1329*4bdff4beSrobert#endif 133046035553Spatrick}; 133146035553Spatrick 1332*4bdff4beSrobert#if _LIBCPP_STD_VER > 20 1333*4bdff4beSroberttemplate <class... _TTypes, class... _UTypes, template<class> class _TQual, template<class> class _UQual> 1334*4bdff4beSrobert requires requires { typename tuple<common_reference_t<_TQual<_TTypes>, _UQual<_UTypes>>...>; } 1335*4bdff4beSrobertstruct basic_common_reference<tuple<_TTypes...>, tuple<_UTypes...>, _TQual, _UQual> { 1336*4bdff4beSrobert using type = tuple<common_reference_t<_TQual<_TTypes>, _UQual<_UTypes>>...>; 1337*4bdff4beSrobert}; 1338*4bdff4beSrobert 1339*4bdff4beSroberttemplate <class... _TTypes, class... _UTypes> 1340*4bdff4beSrobert requires requires { typename tuple<common_type_t<_TTypes, _UTypes>...>; } 1341*4bdff4beSrobertstruct common_type<tuple<_TTypes...>, tuple<_UTypes...>> { 1342*4bdff4beSrobert using type = tuple<common_type_t<_TTypes, _UTypes>...>; 1343*4bdff4beSrobert}; 1344*4bdff4beSrobert#endif // _LIBCPP_STD_VER > 20 1345*4bdff4beSrobert 1346*4bdff4beSrobert#if _LIBCPP_STD_VER > 14 134746035553Spatricktemplate <class ..._Tp> 134846035553Spatricktuple(_Tp...) -> tuple<_Tp...>; 134946035553Spatricktemplate <class _Tp1, class _Tp2> 135046035553Spatricktuple(pair<_Tp1, _Tp2>) -> tuple<_Tp1, _Tp2>; 135146035553Spatricktemplate <class _Alloc, class ..._Tp> 135246035553Spatricktuple(allocator_arg_t, _Alloc, _Tp...) -> tuple<_Tp...>; 135346035553Spatricktemplate <class _Alloc, class _Tp1, class _Tp2> 135446035553Spatricktuple(allocator_arg_t, _Alloc, pair<_Tp1, _Tp2>) -> tuple<_Tp1, _Tp2>; 135546035553Spatricktemplate <class _Alloc, class ..._Tp> 135646035553Spatricktuple(allocator_arg_t, _Alloc, tuple<_Tp...>) -> tuple<_Tp...>; 135746035553Spatrick#endif 135846035553Spatrick 135946035553Spatricktemplate <class ..._Tp> 1360*4bdff4beSrobertinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 1361*4bdff4beSrobert__enable_if_t<__all<__is_swappable<_Tp>::value...>::value, void> 136246035553Spatrickswap(tuple<_Tp...>& __t, tuple<_Tp...>& __u) 136346035553Spatrick _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value) 136446035553Spatrick {__t.swap(__u);} 136546035553Spatrick 1366*4bdff4beSrobert#if _LIBCPP_STD_VER > 20 1367*4bdff4beSroberttemplate <class... _Tp> 1368*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI constexpr 1369*4bdff4beSrobertenable_if_t<__all<is_swappable_v<const _Tp>...>::value, void> 1370*4bdff4beSrobertswap(const tuple<_Tp...>& __lhs, const tuple<_Tp...>& __rhs) 1371*4bdff4beSrobert noexcept(__all<is_nothrow_swappable_v<const _Tp>...>::value) { 1372*4bdff4beSrobert __lhs.swap(__rhs); 1373*4bdff4beSrobert} 1374*4bdff4beSrobert#endif 1375*4bdff4beSrobert 137646035553Spatrick// get 137746035553Spatrick 137846035553Spatricktemplate <size_t _Ip, class ..._Tp> 1379*4bdff4beSrobertinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 138046035553Spatricktypename tuple_element<_Ip, tuple<_Tp...> >::type& 138146035553Spatrickget(tuple<_Tp...>& __t) _NOEXCEPT 138246035553Spatrick{ 1383*4bdff4beSrobert typedef _LIBCPP_NODEBUG typename tuple_element<_Ip, tuple<_Tp...> >::type type; 138446035553Spatrick return static_cast<__tuple_leaf<_Ip, type>&>(__t.__base_).get(); 138546035553Spatrick} 138646035553Spatrick 138746035553Spatricktemplate <size_t _Ip, class ..._Tp> 1388*4bdff4beSrobertinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 138946035553Spatrickconst typename tuple_element<_Ip, tuple<_Tp...> >::type& 139046035553Spatrickget(const tuple<_Tp...>& __t) _NOEXCEPT 139146035553Spatrick{ 1392*4bdff4beSrobert typedef _LIBCPP_NODEBUG typename tuple_element<_Ip, tuple<_Tp...> >::type type; 139346035553Spatrick return static_cast<const __tuple_leaf<_Ip, type>&>(__t.__base_).get(); 139446035553Spatrick} 139546035553Spatrick 139646035553Spatricktemplate <size_t _Ip, class ..._Tp> 1397*4bdff4beSrobertinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 139846035553Spatricktypename tuple_element<_Ip, tuple<_Tp...> >::type&& 139946035553Spatrickget(tuple<_Tp...>&& __t) _NOEXCEPT 140046035553Spatrick{ 1401*4bdff4beSrobert typedef _LIBCPP_NODEBUG typename tuple_element<_Ip, tuple<_Tp...> >::type type; 140246035553Spatrick return static_cast<type&&>( 140346035553Spatrick static_cast<__tuple_leaf<_Ip, type>&&>(__t.__base_).get()); 140446035553Spatrick} 140546035553Spatrick 140646035553Spatricktemplate <size_t _Ip, class ..._Tp> 1407*4bdff4beSrobertinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 140846035553Spatrickconst typename tuple_element<_Ip, tuple<_Tp...> >::type&& 140946035553Spatrickget(const tuple<_Tp...>&& __t) _NOEXCEPT 141046035553Spatrick{ 1411*4bdff4beSrobert typedef _LIBCPP_NODEBUG typename tuple_element<_Ip, tuple<_Tp...> >::type type; 141246035553Spatrick return static_cast<const type&&>( 141346035553Spatrick static_cast<const __tuple_leaf<_Ip, type>&&>(__t.__base_).get()); 141446035553Spatrick} 141546035553Spatrick 141646035553Spatrick#if _LIBCPP_STD_VER > 11 141746035553Spatrick 141846035553Spatricknamespace __find_detail { 141946035553Spatrick 142076d0caaeSpatrickstatic constexpr size_t __not_found = static_cast<size_t>(-1); 142146035553Spatrickstatic constexpr size_t __ambiguous = __not_found - 1; 142246035553Spatrick 142346035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 142446035553Spatrickconstexpr size_t __find_idx_return(size_t __curr_i, size_t __res, bool __matches) { 142546035553Spatrick return !__matches ? __res : 142646035553Spatrick (__res == __not_found ? __curr_i : __ambiguous); 142746035553Spatrick} 142846035553Spatrick 142946035553Spatricktemplate <size_t _Nx> 143046035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 143146035553Spatrickconstexpr size_t __find_idx(size_t __i, const bool (&__matches)[_Nx]) { 143246035553Spatrick return __i == _Nx ? __not_found : 1433*4bdff4beSrobert __find_detail::__find_idx_return(__i, __find_detail::__find_idx(__i + 1, __matches), __matches[__i]); 143446035553Spatrick} 143546035553Spatrick 143646035553Spatricktemplate <class _T1, class ..._Args> 143746035553Spatrickstruct __find_exactly_one_checked { 143846035553Spatrick static constexpr bool __matches[sizeof...(_Args)] = {is_same<_T1, _Args>::value...}; 143946035553Spatrick static constexpr size_t value = __find_detail::__find_idx(0, __matches); 144046035553Spatrick static_assert(value != __not_found, "type not found in type list" ); 144146035553Spatrick static_assert(value != __ambiguous, "type occurs more than once in type list"); 144246035553Spatrick}; 144346035553Spatrick 144446035553Spatricktemplate <class _T1> 144546035553Spatrickstruct __find_exactly_one_checked<_T1> { 144646035553Spatrick static_assert(!is_same<_T1, _T1>::value, "type not in empty type list"); 144746035553Spatrick}; 144846035553Spatrick 1449*4bdff4beSrobert} // namespace __find_detail 145046035553Spatrick 145146035553Spatricktemplate <typename _T1, typename... _Args> 145246035553Spatrickstruct __find_exactly_one_t 145346035553Spatrick : public __find_detail::__find_exactly_one_checked<_T1, _Args...> { 145446035553Spatrick}; 145546035553Spatrick 145646035553Spatricktemplate <class _T1, class... _Args> 145746035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 145846035553Spatrickconstexpr _T1& get(tuple<_Args...>& __tup) noexcept 145946035553Spatrick{ 146046035553Spatrick return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(__tup); 146146035553Spatrick} 146246035553Spatrick 146346035553Spatricktemplate <class _T1, class... _Args> 146446035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 146546035553Spatrickconstexpr _T1 const& get(tuple<_Args...> const& __tup) noexcept 146646035553Spatrick{ 146746035553Spatrick return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(__tup); 146846035553Spatrick} 146946035553Spatrick 147046035553Spatricktemplate <class _T1, class... _Args> 147146035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 147246035553Spatrickconstexpr _T1&& get(tuple<_Args...>&& __tup) noexcept 147346035553Spatrick{ 147446035553Spatrick return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(_VSTD::move(__tup)); 147546035553Spatrick} 147646035553Spatrick 147746035553Spatricktemplate <class _T1, class... _Args> 147846035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 147946035553Spatrickconstexpr _T1 const&& get(tuple<_Args...> const&& __tup) noexcept 148046035553Spatrick{ 148146035553Spatrick return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(_VSTD::move(__tup)); 148246035553Spatrick} 148346035553Spatrick 148446035553Spatrick#endif 148546035553Spatrick 148646035553Spatrick// tie 148746035553Spatrick 148846035553Spatricktemplate <class ..._Tp> 1489*4bdff4beSrobertinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 149046035553Spatricktuple<_Tp&...> 149146035553Spatricktie(_Tp&... __t) _NOEXCEPT 149246035553Spatrick{ 149346035553Spatrick return tuple<_Tp&...>(__t...); 149446035553Spatrick} 149546035553Spatrick 149646035553Spatricktemplate <class _Up> 149746035553Spatrickstruct __ignore_t 149846035553Spatrick{ 149946035553Spatrick template <class _Tp> 1500*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 150146035553Spatrick const __ignore_t& operator=(_Tp&&) const {return *this;} 150246035553Spatrick}; 150346035553Spatrick 150446035553Spatricknamespace { 1505*4bdff4beSrobert constexpr __ignore_t<unsigned char> ignore = __ignore_t<unsigned char>(); 1506*4bdff4beSrobert} // namespace 150746035553Spatrick 150846035553Spatricktemplate <class... _Tp> 1509*4bdff4beSrobertinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 151046035553Spatricktuple<typename __unwrap_ref_decay<_Tp>::type...> 151146035553Spatrickmake_tuple(_Tp&&... __t) 151246035553Spatrick{ 151346035553Spatrick return tuple<typename __unwrap_ref_decay<_Tp>::type...>(_VSTD::forward<_Tp>(__t)...); 151446035553Spatrick} 151546035553Spatrick 151646035553Spatricktemplate <class... _Tp> 1517*4bdff4beSrobertinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 151846035553Spatricktuple<_Tp&&...> 151946035553Spatrickforward_as_tuple(_Tp&&... __t) _NOEXCEPT 152046035553Spatrick{ 152146035553Spatrick return tuple<_Tp&&...>(_VSTD::forward<_Tp>(__t)...); 152246035553Spatrick} 152346035553Spatrick 152446035553Spatricktemplate <size_t _Ip> 152546035553Spatrickstruct __tuple_equal 152646035553Spatrick{ 152746035553Spatrick template <class _Tp, class _Up> 1528*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 152946035553Spatrick bool operator()(const _Tp& __x, const _Up& __y) 153046035553Spatrick { 153146035553Spatrick return __tuple_equal<_Ip - 1>()(__x, __y) && _VSTD::get<_Ip-1>(__x) == _VSTD::get<_Ip-1>(__y); 153246035553Spatrick } 153346035553Spatrick}; 153446035553Spatrick 153546035553Spatricktemplate <> 153646035553Spatrickstruct __tuple_equal<0> 153746035553Spatrick{ 153846035553Spatrick template <class _Tp, class _Up> 1539*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 154046035553Spatrick bool operator()(const _Tp&, const _Up&) 154146035553Spatrick { 154246035553Spatrick return true; 154346035553Spatrick } 154446035553Spatrick}; 154546035553Spatrick 154646035553Spatricktemplate <class ..._Tp, class ..._Up> 1547*4bdff4beSrobertinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 154846035553Spatrickbool 154946035553Spatrickoperator==(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 155046035553Spatrick{ 155146035553Spatrick static_assert (sizeof...(_Tp) == sizeof...(_Up), "Can't compare tuples of different sizes"); 155246035553Spatrick return __tuple_equal<sizeof...(_Tp)>()(__x, __y); 155346035553Spatrick} 155446035553Spatrick 1555*4bdff4beSrobert#if _LIBCPP_STD_VER > 17 1556*4bdff4beSrobert 1557*4bdff4beSrobert// operator<=> 1558*4bdff4beSrobert 1559*4bdff4beSroberttemplate <class ..._Tp, class ..._Up, size_t ..._Is> 1560*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI constexpr 1561*4bdff4beSrobertauto 1562*4bdff4beSrobert__tuple_compare_three_way(const tuple<_Tp...>& __x, const tuple<_Up...>& __y, index_sequence<_Is...>) { 1563*4bdff4beSrobert common_comparison_category_t<__synth_three_way_result<_Tp, _Up>...> __result = strong_ordering::equal; 1564*4bdff4beSrobert static_cast<void>(((__result = _VSTD::__synth_three_way(_VSTD::get<_Is>(__x), _VSTD::get<_Is>(__y)), __result != 0) || ...)); 1565*4bdff4beSrobert return __result; 1566*4bdff4beSrobert} 1567*4bdff4beSrobert 156846035553Spatricktemplate <class ..._Tp, class ..._Up> 1569*4bdff4beSrobertrequires (sizeof...(_Tp) == sizeof...(_Up)) 1570*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI constexpr 1571*4bdff4beSrobertcommon_comparison_category_t<__synth_three_way_result<_Tp, _Up>...> 1572*4bdff4beSrobertoperator<=>(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 1573*4bdff4beSrobert{ 1574*4bdff4beSrobert return _VSTD::__tuple_compare_three_way(__x, __y, index_sequence_for<_Tp...>{}); 1575*4bdff4beSrobert} 1576*4bdff4beSrobert 1577*4bdff4beSrobert#else // _LIBCPP_STD_VER > 17 1578*4bdff4beSrobert 1579*4bdff4beSroberttemplate <class ..._Tp, class ..._Up> 1580*4bdff4beSrobertinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 158146035553Spatrickbool 158246035553Spatrickoperator!=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 158346035553Spatrick{ 158446035553Spatrick return !(__x == __y); 158546035553Spatrick} 158646035553Spatrick 158746035553Spatricktemplate <size_t _Ip> 158846035553Spatrickstruct __tuple_less 158946035553Spatrick{ 159046035553Spatrick template <class _Tp, class _Up> 1591*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 159246035553Spatrick bool operator()(const _Tp& __x, const _Up& __y) 159346035553Spatrick { 159446035553Spatrick const size_t __idx = tuple_size<_Tp>::value - _Ip; 159546035553Spatrick if (_VSTD::get<__idx>(__x) < _VSTD::get<__idx>(__y)) 159646035553Spatrick return true; 159746035553Spatrick if (_VSTD::get<__idx>(__y) < _VSTD::get<__idx>(__x)) 159846035553Spatrick return false; 159946035553Spatrick return __tuple_less<_Ip-1>()(__x, __y); 160046035553Spatrick } 160146035553Spatrick}; 160246035553Spatrick 160346035553Spatricktemplate <> 160446035553Spatrickstruct __tuple_less<0> 160546035553Spatrick{ 160646035553Spatrick template <class _Tp, class _Up> 1607*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 160846035553Spatrick bool operator()(const _Tp&, const _Up&) 160946035553Spatrick { 161046035553Spatrick return false; 161146035553Spatrick } 161246035553Spatrick}; 161346035553Spatrick 161446035553Spatricktemplate <class ..._Tp, class ..._Up> 1615*4bdff4beSrobertinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 161646035553Spatrickbool 161746035553Spatrickoperator<(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 161846035553Spatrick{ 161946035553Spatrick static_assert (sizeof...(_Tp) == sizeof...(_Up), "Can't compare tuples of different sizes"); 162046035553Spatrick return __tuple_less<sizeof...(_Tp)>()(__x, __y); 162146035553Spatrick} 162246035553Spatrick 162346035553Spatricktemplate <class ..._Tp, class ..._Up> 1624*4bdff4beSrobertinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 162546035553Spatrickbool 162646035553Spatrickoperator>(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 162746035553Spatrick{ 162846035553Spatrick return __y < __x; 162946035553Spatrick} 163046035553Spatrick 163146035553Spatricktemplate <class ..._Tp, class ..._Up> 1632*4bdff4beSrobertinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 163346035553Spatrickbool 163446035553Spatrickoperator>=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 163546035553Spatrick{ 163646035553Spatrick return !(__x < __y); 163746035553Spatrick} 163846035553Spatrick 163946035553Spatricktemplate <class ..._Tp, class ..._Up> 1640*4bdff4beSrobertinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 164146035553Spatrickbool 164246035553Spatrickoperator<=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 164346035553Spatrick{ 164446035553Spatrick return !(__y < __x); 164546035553Spatrick} 164646035553Spatrick 1647*4bdff4beSrobert#endif // _LIBCPP_STD_VER > 17 1648*4bdff4beSrobert 164946035553Spatrick// tuple_cat 165046035553Spatrick 165146035553Spatricktemplate <class _Tp, class _Up> struct __tuple_cat_type; 165246035553Spatrick 165346035553Spatricktemplate <class ..._Ttypes, class ..._Utypes> 165446035553Spatrickstruct __tuple_cat_type<tuple<_Ttypes...>, __tuple_types<_Utypes...> > 165546035553Spatrick{ 1656*4bdff4beSrobert typedef _LIBCPP_NODEBUG tuple<_Ttypes..., _Utypes...> type; 165746035553Spatrick}; 165846035553Spatrick 165946035553Spatricktemplate <class _ResultTuple, bool _Is_Tuple0TupleLike, class ..._Tuples> 166046035553Spatrickstruct __tuple_cat_return_1 166146035553Spatrick{ 166246035553Spatrick}; 166346035553Spatrick 166446035553Spatricktemplate <class ..._Types, class _Tuple0> 166546035553Spatrickstruct __tuple_cat_return_1<tuple<_Types...>, true, _Tuple0> 166646035553Spatrick{ 1667*4bdff4beSrobert using type _LIBCPP_NODEBUG = typename __tuple_cat_type< 1668*4bdff4beSrobert tuple<_Types...>, 1669*4bdff4beSrobert typename __make_tuple_types<__remove_cvref_t<_Tuple0> >::type 1670*4bdff4beSrobert >::type; 167146035553Spatrick}; 167246035553Spatrick 167346035553Spatricktemplate <class ..._Types, class _Tuple0, class _Tuple1, class ..._Tuples> 167446035553Spatrickstruct __tuple_cat_return_1<tuple<_Types...>, true, _Tuple0, _Tuple1, _Tuples...> 167546035553Spatrick : public __tuple_cat_return_1< 167646035553Spatrick typename __tuple_cat_type< 167746035553Spatrick tuple<_Types...>, 1678*4bdff4beSrobert typename __make_tuple_types<__remove_cvref_t<_Tuple0> >::type 167946035553Spatrick >::type, 1680*4bdff4beSrobert __tuple_like_ext<__libcpp_remove_reference_t<_Tuple1> >::value, 168146035553Spatrick _Tuple1, _Tuples...> 168246035553Spatrick{ 168346035553Spatrick}; 168446035553Spatrick 168546035553Spatricktemplate <class ..._Tuples> struct __tuple_cat_return; 168646035553Spatrick 168746035553Spatricktemplate <class _Tuple0, class ..._Tuples> 168846035553Spatrickstruct __tuple_cat_return<_Tuple0, _Tuples...> 168946035553Spatrick : public __tuple_cat_return_1<tuple<>, 1690*4bdff4beSrobert __tuple_like_ext<__libcpp_remove_reference_t<_Tuple0> >::value, _Tuple0, 169146035553Spatrick _Tuples...> 169246035553Spatrick{ 169346035553Spatrick}; 169446035553Spatrick 169546035553Spatricktemplate <> 169646035553Spatrickstruct __tuple_cat_return<> 169746035553Spatrick{ 1698*4bdff4beSrobert typedef _LIBCPP_NODEBUG tuple<> type; 169946035553Spatrick}; 170046035553Spatrick 1701*4bdff4beSrobertinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 170246035553Spatricktuple<> 170346035553Spatricktuple_cat() 170446035553Spatrick{ 170546035553Spatrick return tuple<>(); 170646035553Spatrick} 170746035553Spatrick 170846035553Spatricktemplate <class _Rp, class _Indices, class _Tuple0, class ..._Tuples> 170946035553Spatrickstruct __tuple_cat_return_ref_imp; 171046035553Spatrick 171146035553Spatricktemplate <class ..._Types, size_t ..._I0, class _Tuple0> 171246035553Spatrickstruct __tuple_cat_return_ref_imp<tuple<_Types...>, __tuple_indices<_I0...>, _Tuple0> 171346035553Spatrick{ 1714*4bdff4beSrobert typedef _LIBCPP_NODEBUG __libcpp_remove_reference_t<_Tuple0> _T0; 171546035553Spatrick typedef tuple<_Types..., typename __apply_cv<_Tuple0, 171646035553Spatrick typename tuple_element<_I0, _T0>::type>::type&&...> type; 171746035553Spatrick}; 171846035553Spatrick 171946035553Spatricktemplate <class ..._Types, size_t ..._I0, class _Tuple0, class _Tuple1, class ..._Tuples> 172046035553Spatrickstruct __tuple_cat_return_ref_imp<tuple<_Types...>, __tuple_indices<_I0...>, 172146035553Spatrick _Tuple0, _Tuple1, _Tuples...> 172246035553Spatrick : public __tuple_cat_return_ref_imp< 172346035553Spatrick tuple<_Types..., typename __apply_cv<_Tuple0, 172446035553Spatrick typename tuple_element<_I0, 1725*4bdff4beSrobert __libcpp_remove_reference_t<_Tuple0> >::type>::type&&...>, 1726*4bdff4beSrobert typename __make_tuple_indices<tuple_size<__libcpp_remove_reference_t<_Tuple1> >::value>::type, 172746035553Spatrick _Tuple1, _Tuples...> 172846035553Spatrick{ 172946035553Spatrick}; 173046035553Spatrick 173146035553Spatricktemplate <class _Tuple0, class ..._Tuples> 173246035553Spatrickstruct __tuple_cat_return_ref 173346035553Spatrick : public __tuple_cat_return_ref_imp<tuple<>, 173446035553Spatrick typename __make_tuple_indices< 1735*4bdff4beSrobert tuple_size<__libcpp_remove_reference_t<_Tuple0> >::value 173646035553Spatrick >::type, _Tuple0, _Tuples...> 173746035553Spatrick{ 173846035553Spatrick}; 173946035553Spatrick 174046035553Spatricktemplate <class _Types, class _I0, class _J0> 174146035553Spatrickstruct __tuple_cat; 174246035553Spatrick 174346035553Spatricktemplate <class ..._Types, size_t ..._I0, size_t ..._J0> 174446035553Spatrickstruct __tuple_cat<tuple<_Types...>, __tuple_indices<_I0...>, __tuple_indices<_J0...> > 174546035553Spatrick{ 174646035553Spatrick template <class _Tuple0> 1747*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 174846035553Spatrick typename __tuple_cat_return_ref<tuple<_Types...>&&, _Tuple0&&>::type 174946035553Spatrick operator()(tuple<_Types...> __t, _Tuple0&& __t0) 175046035553Spatrick { 1751*4bdff4beSrobert (void)__t; // avoid unused parameter warning on GCC when _I0 is empty 175246035553Spatrick return _VSTD::forward_as_tuple( 175346035553Spatrick _VSTD::forward<_Types>(_VSTD::get<_I0>(__t))..., 175446035553Spatrick _VSTD::get<_J0>(_VSTD::forward<_Tuple0>(__t0))...); 175546035553Spatrick } 175646035553Spatrick 175746035553Spatrick template <class _Tuple0, class _Tuple1, class ..._Tuples> 1758*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 175946035553Spatrick typename __tuple_cat_return_ref<tuple<_Types...>&&, _Tuple0&&, _Tuple1&&, _Tuples&&...>::type 176046035553Spatrick operator()(tuple<_Types...> __t, _Tuple0&& __t0, _Tuple1&& __t1, _Tuples&& ...__tpls) 176146035553Spatrick { 1762*4bdff4beSrobert (void)__t; // avoid unused parameter warning on GCC when _I0 is empty 1763*4bdff4beSrobert typedef _LIBCPP_NODEBUG __libcpp_remove_reference_t<_Tuple0> _T0; 1764*4bdff4beSrobert typedef _LIBCPP_NODEBUG __libcpp_remove_reference_t<_Tuple1> _T1; 176546035553Spatrick return __tuple_cat< 176646035553Spatrick tuple<_Types..., 176746035553Spatrick typename __apply_cv<_Tuple0, typename tuple_element< 176846035553Spatrick _J0, _T0>::type>::type&&...>, 176946035553Spatrick typename __make_tuple_indices<sizeof...(_Types) + 177046035553Spatrick tuple_size<_T0>::value>::type, 177146035553Spatrick typename __make_tuple_indices<tuple_size<_T1>::value>::type>()( 177246035553Spatrick _VSTD::forward_as_tuple( 177346035553Spatrick _VSTD::forward<_Types>(_VSTD::get<_I0>(__t))..., 177446035553Spatrick _VSTD::get<_J0>(_VSTD::forward<_Tuple0>(__t0))...), 177546035553Spatrick _VSTD::forward<_Tuple1>(__t1), _VSTD::forward<_Tuples>(__tpls)...); 177646035553Spatrick } 177746035553Spatrick}; 177846035553Spatrick 177946035553Spatricktemplate <class _Tuple0, class... _Tuples> 1780*4bdff4beSrobertinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 178146035553Spatricktypename __tuple_cat_return<_Tuple0, _Tuples...>::type 178246035553Spatricktuple_cat(_Tuple0&& __t0, _Tuples&&... __tpls) 178346035553Spatrick{ 1784*4bdff4beSrobert typedef _LIBCPP_NODEBUG __libcpp_remove_reference_t<_Tuple0> _T0; 178546035553Spatrick return __tuple_cat<tuple<>, __tuple_indices<>, 178646035553Spatrick typename __make_tuple_indices<tuple_size<_T0>::value>::type>() 178746035553Spatrick (tuple<>(), _VSTD::forward<_Tuple0>(__t0), 178846035553Spatrick _VSTD::forward<_Tuples>(__tpls)...); 178946035553Spatrick} 179046035553Spatrick 179146035553Spatricktemplate <class ..._Tp, class _Alloc> 179246035553Spatrickstruct _LIBCPP_TEMPLATE_VIS uses_allocator<tuple<_Tp...>, _Alloc> 179346035553Spatrick : true_type {}; 179446035553Spatrick 179546035553Spatricktemplate <class _T1, class _T2> 179646035553Spatricktemplate <class... _Args1, class... _Args2, size_t ..._I1, size_t ..._I2> 1797*4bdff4beSrobertinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 179846035553Spatrickpair<_T1, _T2>::pair(piecewise_construct_t, 179946035553Spatrick tuple<_Args1...>& __first_args, tuple<_Args2...>& __second_args, 180046035553Spatrick __tuple_indices<_I1...>, __tuple_indices<_I2...>) 180146035553Spatrick : first(_VSTD::forward<_Args1>(_VSTD::get<_I1>( __first_args))...), 180246035553Spatrick second(_VSTD::forward<_Args2>(_VSTD::get<_I2>(__second_args))...) 180346035553Spatrick{ 180446035553Spatrick} 180546035553Spatrick 180646035553Spatrick#if _LIBCPP_STD_VER > 14 180746035553Spatricktemplate <class _Tp> 1808*4bdff4beSrobertinline constexpr size_t tuple_size_v = tuple_size<_Tp>::value; 180946035553Spatrick 181046035553Spatrick#define _LIBCPP_NOEXCEPT_RETURN(...) noexcept(noexcept(__VA_ARGS__)) { return __VA_ARGS__; } 181146035553Spatrick 181246035553Spatricktemplate <class _Fn, class _Tuple, size_t ..._Id> 181346035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 181446035553Spatrickconstexpr decltype(auto) __apply_tuple_impl(_Fn && __f, _Tuple && __t, 181546035553Spatrick __tuple_indices<_Id...>) 181646035553Spatrick_LIBCPP_NOEXCEPT_RETURN( 1817*4bdff4beSrobert _VSTD::__invoke( 181846035553Spatrick _VSTD::forward<_Fn>(__f), 181946035553Spatrick _VSTD::get<_Id>(_VSTD::forward<_Tuple>(__t))...) 182046035553Spatrick) 182146035553Spatrick 182246035553Spatricktemplate <class _Fn, class _Tuple> 182346035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 182446035553Spatrickconstexpr decltype(auto) apply(_Fn && __f, _Tuple && __t) 182546035553Spatrick_LIBCPP_NOEXCEPT_RETURN( 182646035553Spatrick _VSTD::__apply_tuple_impl( 182746035553Spatrick _VSTD::forward<_Fn>(__f), _VSTD::forward<_Tuple>(__t), 182846035553Spatrick typename __make_tuple_indices<tuple_size_v<remove_reference_t<_Tuple>>>::type{}) 182946035553Spatrick) 183046035553Spatrick 183146035553Spatricktemplate <class _Tp, class _Tuple, size_t... _Idx> 183246035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 183346035553Spatrickconstexpr _Tp __make_from_tuple_impl(_Tuple&& __t, __tuple_indices<_Idx...>) 183446035553Spatrick_LIBCPP_NOEXCEPT_RETURN( 183546035553Spatrick _Tp(_VSTD::get<_Idx>(_VSTD::forward<_Tuple>(__t))...) 183646035553Spatrick) 183746035553Spatrick 183846035553Spatricktemplate <class _Tp, class _Tuple> 183946035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 184046035553Spatrickconstexpr _Tp make_from_tuple(_Tuple&& __t) 184146035553Spatrick_LIBCPP_NOEXCEPT_RETURN( 184246035553Spatrick _VSTD::__make_from_tuple_impl<_Tp>(_VSTD::forward<_Tuple>(__t), 184346035553Spatrick typename __make_tuple_indices<tuple_size_v<remove_reference_t<_Tuple>>>::type{}) 184446035553Spatrick) 184546035553Spatrick 184646035553Spatrick#undef _LIBCPP_NOEXCEPT_RETURN 184746035553Spatrick 184846035553Spatrick#endif // _LIBCPP_STD_VER > 14 184946035553Spatrick 185046035553Spatrick#endif // !defined(_LIBCPP_CXX03_LANG) 185146035553Spatrick 185246035553Spatrick_LIBCPP_END_NAMESPACE_STD 185346035553Spatrick 1854*4bdff4beSrobert#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 1855*4bdff4beSrobert# include <exception> 1856*4bdff4beSrobert# include <iosfwd> 1857*4bdff4beSrobert# include <new> 1858*4bdff4beSrobert# include <type_traits> 1859*4bdff4beSrobert# include <typeinfo> 1860*4bdff4beSrobert# include <utility> 1861*4bdff4beSrobert#endif 1862*4bdff4beSrobert 186346035553Spatrick#endif // _LIBCPP_TUPLE 1864