13e519524SHoward Hinnant// -*- C++ -*- 2eb8650a7SLouis Dionne//===----------------------------------------------------------------------===// 33e519524SHoward Hinnant// 42946cd70SChandler Carruth// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 52946cd70SChandler Carruth// See https://llvm.org/LICENSE.txt for license information. 62946cd70SChandler Carruth// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 73e519524SHoward Hinnant// 83e519524SHoward Hinnant//===----------------------------------------------------------------------===// 93e519524SHoward Hinnant 103e519524SHoward Hinnant#ifndef _LIBCPP_TUPLE 113e519524SHoward Hinnant#define _LIBCPP_TUPLE 123e519524SHoward Hinnant 133e519524SHoward Hinnant/* 143e519524SHoward Hinnant tuple synopsis 153e519524SHoward Hinnant 163e519524SHoward Hinnantnamespace std 173e519524SHoward Hinnant{ 183e519524SHoward Hinnant 193e519524SHoward Hinnanttemplate <class... T> 203e519524SHoward Hinnantclass tuple { 213e519524SHoward Hinnantpublic: 22e16f2cb6SLouis Dionne explicit(see-below) constexpr tuple(); 23e35c5121SLouis Dionne explicit(see-below) tuple(const T&...); // constexpr in C++14 243e519524SHoward Hinnant template <class... U> 25e35c5121SLouis Dionne explicit(see-below) tuple(U&&...); // constexpr in C++14 263e519524SHoward Hinnant tuple(const tuple&) = default; 2727d0a2a7SHoward Hinnant tuple(tuple&&) = default; 2816719cd0SHui Xie 2916719cd0SHui Xie template<class... UTypes> 3016719cd0SHui Xie constexpr explicit(see-below) tuple(tuple<UTypes...>&); // C++23 313e519524SHoward Hinnant template <class... U> 32e35c5121SLouis Dionne explicit(see-below) tuple(const tuple<U...>&); // constexpr in C++14 333e519524SHoward Hinnant template <class... U> 34e35c5121SLouis Dionne explicit(see-below) tuple(tuple<U...>&&); // constexpr in C++14 3516719cd0SHui Xie template<class... UTypes> 3616719cd0SHui Xie constexpr explicit(see-below) tuple(const tuple<UTypes...>&&); // C++23 3716719cd0SHui Xie 3816719cd0SHui Xie template<class U1, class U2> 3916719cd0SHui Xie constexpr explicit(see-below) tuple(pair<U1, U2>&); // iff sizeof...(Types) == 2 // C++23 403e519524SHoward Hinnant template <class U1, class U2> 41e35c5121SLouis Dionne explicit(see-below) tuple(const pair<U1, U2>&); // iff sizeof...(T) == 2 // constexpr in C++14 423e519524SHoward Hinnant template <class U1, class U2> 43e35c5121SLouis Dionne explicit(see-below) tuple(pair<U1, U2>&&); // iff sizeof...(T) == 2 // constexpr in C++14 4416719cd0SHui Xie template<class U1, class U2> 4516719cd0SHui Xie constexpr explicit(see-below) tuple(const pair<U1, U2>&&); // iff sizeof...(Types) == 2 // C++23 463e519524SHoward Hinnant 473e519524SHoward Hinnant // allocator-extended constructors 483e519524SHoward Hinnant template <class Alloc> 493e519524SHoward Hinnant tuple(allocator_arg_t, const Alloc& a); 503e519524SHoward Hinnant template <class Alloc> 5106e2b737SArthur O'Dwyer explicit(see-below) tuple(allocator_arg_t, const Alloc& a, const T&...); // constexpr in C++20 523e519524SHoward Hinnant template <class Alloc, class... U> 5306e2b737SArthur O'Dwyer explicit(see-below) tuple(allocator_arg_t, const Alloc& a, U&&...); // constexpr in C++20 543e519524SHoward Hinnant template <class Alloc> 5506e2b737SArthur O'Dwyer tuple(allocator_arg_t, const Alloc& a, const tuple&); // constexpr in C++20 563e519524SHoward Hinnant template <class Alloc> 5706e2b737SArthur O'Dwyer tuple(allocator_arg_t, const Alloc& a, tuple&&); // constexpr in C++20 5816719cd0SHui Xie template<class Alloc, class... UTypes> 5916719cd0SHui Xie constexpr explicit(see-below) 6016719cd0SHui Xie tuple(allocator_arg_t, const Alloc& a, tuple<UTypes...>&); // C++23 613e519524SHoward Hinnant template <class Alloc, class... U> 6206e2b737SArthur O'Dwyer explicit(see-below) tuple(allocator_arg_t, const Alloc& a, const tuple<U...>&); // constexpr in C++20 633e519524SHoward Hinnant template <class Alloc, class... U> 6406e2b737SArthur O'Dwyer explicit(see-below) tuple(allocator_arg_t, const Alloc& a, tuple<U...>&&); // constexpr in C++20 6516719cd0SHui Xie template<class Alloc, class... UTypes> 6616719cd0SHui Xie constexpr explicit(see-below) 6716719cd0SHui Xie tuple(allocator_arg_t, const Alloc& a, const tuple<UTypes...>&&); // C++23 6816719cd0SHui Xie template<class Alloc, class U1, class U2> 6916719cd0SHui Xie constexpr explicit(see-below) 7016719cd0SHui Xie tuple(allocator_arg_t, const Alloc& a, pair<U1, U2>&); // C++23 713e519524SHoward Hinnant template <class Alloc, class U1, class U2> 7206e2b737SArthur O'Dwyer explicit(see-below) tuple(allocator_arg_t, const Alloc& a, const pair<U1, U2>&); // constexpr in C++20 733e519524SHoward Hinnant template <class Alloc, class U1, class U2> 7406e2b737SArthur O'Dwyer explicit(see-below) tuple(allocator_arg_t, const Alloc& a, pair<U1, U2>&&); // constexpr in C++20 7516719cd0SHui Xie template<class Alloc, class U1, class U2> 7616719cd0SHui Xie constexpr explicit(see-below) 7716719cd0SHui Xie tuple(allocator_arg_t, const Alloc& a, const pair<U1, U2>&&); // C++23 783e519524SHoward Hinnant 7906e2b737SArthur O'Dwyer tuple& operator=(const tuple&); // constexpr in C++20 8016719cd0SHui Xie constexpr const tuple& operator=(const tuple&) const; // C++23 8106e2b737SArthur O'Dwyer tuple& operator=(tuple&&) noexcept(is_nothrow_move_assignable_v<T> && ...); // constexpr in C++20 8216719cd0SHui Xie constexpr const tuple& operator=(tuple&&) const; // C++23 833e519524SHoward Hinnant template <class... U> 8406e2b737SArthur O'Dwyer tuple& operator=(const tuple<U...>&); // constexpr in C++20 8516719cd0SHui Xie template<class... UTypes> 8616719cd0SHui Xie constexpr const tuple& operator=(const tuple<UTypes...>&) const; // C++23 873e519524SHoward Hinnant template <class... U> 8806e2b737SArthur O'Dwyer tuple& operator=(tuple<U...>&&); // constexpr in C++20 8916719cd0SHui Xie template<class... UTypes> 9016719cd0SHui Xie constexpr const tuple& operator=(tuple<UTypes...>&&) const; // C++23 913e519524SHoward Hinnant template <class U1, class U2> 9206e2b737SArthur O'Dwyer tuple& operator=(const pair<U1, U2>&); // iff sizeof...(T) == 2 // constexpr in C++20 933e519524SHoward Hinnant template<class U1, class U2> 9416719cd0SHui Xie constexpr const tuple& operator=(const pair<U1, U2>&) const; // iff sizeof...(Types) == 2 // C++23 9516719cd0SHui Xie template <class U1, class U2> 9606e2b737SArthur O'Dwyer tuple& operator=(pair<U1, U2>&&); // iff sizeof...(T) == 2 // constexpr in C++20 9716719cd0SHui Xie template<class U1, class U2> 9816719cd0SHui Xie constexpr const tuple& operator=(pair<U1, U2>&&) const; // iff sizeof...(Types) == 2 // C++23 993e519524SHoward Hinnant 100a0839b14SLouis Dionne template<class U, size_t N> 101a0839b14SLouis Dionne tuple& operator=(array<U, N> const&) // iff sizeof...(T) == N, EXTENSION 102a0839b14SLouis Dionne template<class U, size_t N> 103a0839b14SLouis Dionne tuple& operator=(array<U, N>&&) // iff sizeof...(T) == N, EXTENSION 104a0839b14SLouis Dionne 10506e2b737SArthur O'Dwyer void swap(tuple&) noexcept(AND(swap(declval<T&>(), declval<T&>())...)); // constexpr in C++20 10616719cd0SHui Xie constexpr void swap(const tuple&) const noexcept(see-below); // C++23 1073e519524SHoward Hinnant}; 1083e519524SHoward Hinnant 109311207bbSNikolas Klauser 110311207bbSNikolas Klausertemplate<class... TTypes, class... UTypes, template<class> class TQual, template<class> class UQual> // since C++23 111311207bbSNikolas Klauser requires requires { typename tuple<common_reference_t<TQual<TTypes>, UQual<UTypes>>...>; } 112311207bbSNikolas Klauserstruct basic_common_reference<tuple<TTypes...>, tuple<UTypes...>, TQual, UQual> { 113311207bbSNikolas Klauser using type = tuple<common_reference_t<TQual<TTypes>, UQual<UTypes>>...>; 114311207bbSNikolas Klauser}; 115311207bbSNikolas Klauser 116311207bbSNikolas Klausertemplate<class... TTypes, class... UTypes> // since C++23 117311207bbSNikolas Klauser requires requires { typename tuple<common_type_t<TTypes, UTypes>...>; } 118311207bbSNikolas Klauserstruct common_type<tuple<TTypes...>, tuple<UTypes...>> { 119311207bbSNikolas Klauser using type = tuple<common_type_t<TTypes, UTypes>...>; 120311207bbSNikolas Klauser}; 121311207bbSNikolas Klauser 1221308011eSLouis Dionnetemplate <class ...T> 1231308011eSLouis Dionnetuple(T...) -> tuple<T...>; // since C++17 1241308011eSLouis Dionnetemplate <class T1, class T2> 1251308011eSLouis Dionnetuple(pair<T1, T2>) -> tuple<T1, T2>; // since C++17 1261308011eSLouis Dionnetemplate <class Alloc, class ...T> 1271308011eSLouis Dionnetuple(allocator_arg_t, Alloc, T...) -> tuple<T...>; // since C++17 1281308011eSLouis Dionnetemplate <class Alloc, class T1, class T2> 1291308011eSLouis Dionnetuple(allocator_arg_t, Alloc, pair<T1, T2>) -> tuple<T1, T2>; // since C++17 1301308011eSLouis Dionnetemplate <class Alloc, class ...T> 1311308011eSLouis Dionnetuple(allocator_arg_t, Alloc, tuple<T...>) -> tuple<T...>; // since C++17 1321308011eSLouis Dionne 13340a01d53SMarshall Clowinline constexpr unspecified ignore; 1343e519524SHoward Hinnant 13575eff748SMarshall Clowtemplate <class... T> tuple<V...> make_tuple(T&&...); // constexpr in C++14 136de9320aaSMarshall Clowtemplate <class... T> tuple<ATypes...> forward_as_tuple(T&&...) noexcept; // constexpr in C++14 1370d1560e1SMarshall Clowtemplate <class... T> tuple<T&...> tie(T&...) noexcept; // constexpr in C++14 13875eff748SMarshall Clowtemplate <class... Tuples> tuple<CTypes...> tuple_cat(Tuples&&... tpls); // constexpr in C++14 1393e519524SHoward Hinnant 14003e29a29SEric Fiselier// [tuple.apply], calling a function with a tuple of arguments: 14103e29a29SEric Fiseliertemplate <class F, class Tuple> 14203e29a29SEric Fiselier constexpr decltype(auto) apply(F&& f, Tuple&& t); // C++17 14303e29a29SEric Fiseliertemplate <class T, class Tuple> 14403e29a29SEric Fiselier constexpr T make_from_tuple(Tuple&& t); // C++17 14503e29a29SEric Fiselier 1463e519524SHoward Hinnant// 20.4.1.4, tuple helper classes: 147e4957601SMarshall Clowtemplate <class T> struct tuple_size; // undefined 148e4957601SMarshall Clowtemplate <class... T> struct tuple_size<tuple<T...>>; 14903e29a29SEric Fiseliertemplate <class T> 15040a01d53SMarshall Clow inline constexpr size_t tuple_size_v = tuple_size<T>::value; // C++17 1512b0c7abbSLouis Dionnetemplate <size_t I, class T> struct tuple_element; // undefined 1522b0c7abbSLouis Dionnetemplate <size_t I, class... T> struct tuple_element<I, tuple<T...>>; 153bfb3f2bfSMarshall Clowtemplate <size_t I, class T> 154bfb3f2bfSMarshall Clow using tuple_element_t = typename tuple_element <I, T>::type; // C++14 1553e519524SHoward Hinnant 1563e519524SHoward Hinnant// 20.4.1.5, element access: 157bfb3f2bfSMarshall Clowtemplate <size_t I, class... T> 15827d0a2a7SHoward Hinnant typename tuple_element<I, tuple<T...>>::type& 1598bf1f08aSMarshall Clow get(tuple<T...>&) noexcept; // constexpr in C++14 160bfb3f2bfSMarshall Clowtemplate <size_t I, class... T> 161bfb3f2bfSMarshall Clow const typename tuple_element<I, tuple<T...>>::type& 1628bf1f08aSMarshall Clow get(const tuple<T...>&) noexcept; // constexpr in C++14 163bfb3f2bfSMarshall Clowtemplate <size_t I, class... T> 16427d0a2a7SHoward Hinnant typename tuple_element<I, tuple<T...>>::type&& 1658bf1f08aSMarshall Clow get(tuple<T...>&&) noexcept; // constexpr in C++14 166545b8861SEric Fiseliertemplate <size_t I, class... T> 167545b8861SEric Fiselier const typename tuple_element<I, tuple<T...>>::type&& 168545b8861SEric Fiselier get(const tuple<T...>&&) noexcept; // constexpr in C++14 1693e519524SHoward Hinnant 170e99520c7SMarshall Clowtemplate <class T1, class... T> 171e99520c7SMarshall Clow constexpr T1& get(tuple<T...>&) noexcept; // C++14 172e99520c7SMarshall Clowtemplate <class T1, class... T> 173bfb3f2bfSMarshall Clow constexpr const T1& get(const tuple<T...>&) noexcept; // C++14 174e99520c7SMarshall Clowtemplate <class T1, class... T> 175e99520c7SMarshall Clow constexpr T1&& get(tuple<T...>&&) noexcept; // C++14 176545b8861SEric Fiseliertemplate <class T1, class... T> 177545b8861SEric Fiselier constexpr const T1&& get(const tuple<T...>&&) noexcept; // C++14 178e99520c7SMarshall Clow 1793e519524SHoward Hinnant// 20.4.1.6, relational operators: 18075eff748SMarshall Clowtemplate<class... T, class... U> bool operator==(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14 181b80f2dfdSKent Rosstemplate<class... T, class... U> bool operator<(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14, removed in C++20 182b80f2dfdSKent Rosstemplate<class... T, class... U> bool operator!=(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14, removed in C++20 183b80f2dfdSKent Rosstemplate<class... T, class... U> bool operator>(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14, removed in C++20 184b80f2dfdSKent Rosstemplate<class... T, class... U> bool operator<=(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14, removed in C++20 185b80f2dfdSKent Rosstemplate<class... T, class... U> bool operator>=(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14, removed in C++20 186b80f2dfdSKent Rosstemplate<class... T, class... U> 187b80f2dfdSKent Ross constexpr common_comparison_category_t<synth-three-way-result<T, U>...> 188b80f2dfdSKent Ross operator<=>(const tuple<T...>&, const tuple<U...>&); // since C++20 1893e519524SHoward Hinnant 1903e519524SHoward Hinnanttemplate <class... Types, class Alloc> 1913e519524SHoward Hinnant struct uses_allocator<tuple<Types...>, Alloc>; 1923e519524SHoward Hinnant 1933e519524SHoward Hinnanttemplate <class... Types> 19427d0a2a7SHoward Hinnant void 19527d0a2a7SHoward Hinnant swap(tuple<Types...>& x, tuple<Types...>& y) noexcept(noexcept(x.swap(y))); 1963e519524SHoward Hinnant 19716719cd0SHui Xietemplate <class... Types> 19816719cd0SHui Xie constexpr void swap(const tuple<Types...>& x, const tuple<Types...>& y) noexcept(see-below); // C++23 19916719cd0SHui Xie 2003e519524SHoward Hinnant} // std 2013e519524SHoward Hinnant 2023e519524SHoward Hinnant*/ 2033e519524SHoward Hinnant 204385cc25aSLouis Dionne#include <__assert> // all public C++ headers provide the assertion handler 205b80f2dfdSKent Ross#include <__compare/common_comparison_category.h> 206b80f2dfdSKent Ross#include <__compare/synth_three_way.h> 2073e519524SHoward Hinnant#include <__config> 20869d5a666SChristopher Di Bella#include <__functional/unwrap_ref.h> 209050b064fSChristopher Di Bella#include <__memory/allocator_arg_t.h> 210050b064fSChristopher Di Bella#include <__memory/uses_allocator.h> 211050b064fSChristopher Di Bella#include <__tuple> 2126adbc83eSChristopher Di Bella#include <__utility/forward.h> 213b80f2dfdSKent Ross#include <__utility/integer_sequence.h> 2146adbc83eSChristopher Di Bella#include <__utility/move.h> 21552915d78SNikolas Klauser#include <__utility/pair.h> 21652915d78SNikolas Klauser#include <__utility/piecewise_construct.h> 21752915d78SNikolas Klauser#include <__utility/swap.h> 2183e519524SHoward Hinnant#include <cstddef> 2193e519524SHoward Hinnant#include <type_traits> 220f56972e2SMarshall Clow#include <version> 2213e519524SHoward Hinnant 222de4a57cbSLouis Dionne#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES 223de4a57cbSLouis Dionne# include <exception> 224de4a57cbSLouis Dionne# include <iosfwd> 225de4a57cbSLouis Dionne# include <new> 226de4a57cbSLouis Dionne# include <typeinfo> 227de4a57cbSLouis Dionne# include <utility> 228de4a57cbSLouis Dionne#endif 229de4a57cbSLouis Dionne 230db1978b6SNikolas Klauser// standard-mandated includes 231db1978b6SNikolas Klauser#include <compare> 232db1978b6SNikolas Klauser 233073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 2343e519524SHoward Hinnant# pragma GCC system_header 235073458b1SHoward Hinnant#endif 2363e519524SHoward Hinnant 2373e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 2383e519524SHoward Hinnant 23929870871SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 2403e519524SHoward Hinnant 24105c8dad2SMarshall Clow 2423e519524SHoward Hinnant// __tuple_leaf 2433e519524SHoward Hinnant 244ee187e24SEric Fiseliertemplate <size_t _Ip, class _Hp, 245ee187e24SEric Fiselier bool=is_empty<_Hp>::value && !__libcpp_is_final<_Hp>::value 24642b8bb50SHoward Hinnant > 2473e519524SHoward Hinnantclass __tuple_leaf; 2483e519524SHoward Hinnant 2493e519524SHoward Hinnanttemplate <size_t _Ip, class _Hp, bool _Ep> 25006e2b737SArthur O'Dwyerinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 2513e519524SHoward Hinnantvoid swap(__tuple_leaf<_Ip, _Hp, _Ep>& __x, __tuple_leaf<_Ip, _Hp, _Ep>& __y) 25227d0a2a7SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_Hp>::value) 2533e519524SHoward Hinnant{ 2543e519524SHoward Hinnant swap(__x.get(), __y.get()); 2553e519524SHoward Hinnant} 2563e519524SHoward Hinnant 25716719cd0SHui Xietemplate <size_t _Ip, class _Hp, bool _Ep> 25816719cd0SHui Xie_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 25916719cd0SHui Xievoid swap(const __tuple_leaf<_Ip, _Hp, _Ep>& __x, const __tuple_leaf<_Ip, _Hp, _Ep>& __y) 26016719cd0SHui Xie _NOEXCEPT_(__is_nothrow_swappable<const _Hp>::value) { 26116719cd0SHui Xie swap(__x.get(), __y.get()); 26216719cd0SHui Xie} 26316719cd0SHui Xie 2643e519524SHoward Hinnanttemplate <size_t _Ip, class _Hp, bool> 2653e519524SHoward Hinnantclass __tuple_leaf 2663e519524SHoward Hinnant{ 267def3c375SEric Fiselier _Hp __value_; 2683e519524SHoward Hinnant 269074f8d77SEric Fiselier template <class _Tp> 270074f8d77SEric Fiselier static constexpr bool __can_bind_reference() { 271292617e7SEric Fiselier#if __has_keyword(__reference_binds_to_temporary) 272292617e7SEric Fiselier return !__reference_binds_to_temporary(_Hp, _Tp); 273b1539e0aSEric Fiselier#else 274b1539e0aSEric Fiselier return true; 275292617e7SEric Fiselier#endif 276074f8d77SEric Fiselier } 277074f8d77SEric Fiselier 27806e2b737SArthur O'Dwyer _LIBCPP_CONSTEXPR_AFTER_CXX11 2793e519524SHoward Hinnant __tuple_leaf& operator=(const __tuple_leaf&); 2803e519524SHoward Hinnantpublic: 28106e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY constexpr __tuple_leaf() 282def3c375SEric Fiselier _NOEXCEPT_(is_nothrow_default_constructible<_Hp>::value) : __value_() 2833e519524SHoward Hinnant {static_assert(!is_reference<_Hp>::value, 2843e519524SHoward Hinnant "Attempted to default construct a reference element in a tuple");} 2853e519524SHoward Hinnant 2863e519524SHoward Hinnant template <class _Alloc> 28706e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY constexpr 2883e519524SHoward Hinnant __tuple_leaf(integral_constant<int, 0>, const _Alloc&) 289def3c375SEric Fiselier : __value_() 2903e519524SHoward Hinnant {static_assert(!is_reference<_Hp>::value, 2913e519524SHoward Hinnant "Attempted to default construct a reference element in a tuple");} 2923e519524SHoward Hinnant 2933e519524SHoward Hinnant template <class _Alloc> 29406e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY constexpr 2953e519524SHoward Hinnant __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a) 296def3c375SEric Fiselier : __value_(allocator_arg_t(), __a) 2973e519524SHoward Hinnant {static_assert(!is_reference<_Hp>::value, 2983e519524SHoward Hinnant "Attempted to default construct a reference element in a tuple");} 2993e519524SHoward Hinnant 3003e519524SHoward Hinnant template <class _Alloc> 30106e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY constexpr 3023e519524SHoward Hinnant __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a) 303def3c375SEric Fiselier : __value_(__a) 3043e519524SHoward Hinnant {static_assert(!is_reference<_Hp>::value, 3053e519524SHoward Hinnant "Attempted to default construct a reference element in a tuple");} 3063e519524SHoward Hinnant 30730ad985bSHoward Hinnant template <class _Tp, 308b4e88d4dSLouis Dionne class = __enable_if_t< 3093359a17bSEric Fiselier _And< 3103359a17bSEric Fiselier _IsNotSame<__uncvref_t<_Tp>, __tuple_leaf>, 3113359a17bSEric Fiselier is_constructible<_Hp, _Tp> 312567bb79bSEric Fiselier >::value 3133359a17bSEric Fiselier > 314567bb79bSEric Fiselier > 31575eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 3168a9ee148SHoward Hinnant explicit __tuple_leaf(_Tp&& __t) _NOEXCEPT_((is_nothrow_constructible<_Hp, _Tp>::value)) 317def3c375SEric Fiselier : __value_(_VSTD::forward<_Tp>(__t)) 318292617e7SEric Fiselier {static_assert(__can_bind_reference<_Tp&&>(), 319292617e7SEric Fiselier "Attempted construction of reference element binds to a temporary whose lifetime has ended");} 3203e519524SHoward Hinnant 3213e519524SHoward Hinnant template <class _Tp, class _Alloc> 32206e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 3233e519524SHoward Hinnant explicit __tuple_leaf(integral_constant<int, 0>, const _Alloc&, _Tp&& __t) 324def3c375SEric Fiselier : __value_(_VSTD::forward<_Tp>(__t)) 325292617e7SEric Fiselier {static_assert(__can_bind_reference<_Tp&&>(), 326292617e7SEric Fiselier "Attempted construction of reference element binds to a temporary whose lifetime has ended");} 3273e519524SHoward Hinnant 3283e519524SHoward Hinnant template <class _Tp, class _Alloc> 32906e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 3303e519524SHoward Hinnant explicit __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a, _Tp&& __t) 331def3c375SEric Fiselier : __value_(allocator_arg_t(), __a, _VSTD::forward<_Tp>(__t)) 332074f8d77SEric Fiselier {static_assert(!is_reference<_Hp>::value, 333074f8d77SEric Fiselier "Attempted to uses-allocator construct a reference element in a tuple");} 3343e519524SHoward Hinnant 3353e519524SHoward Hinnant template <class _Tp, class _Alloc> 33606e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 3373e519524SHoward Hinnant explicit __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a, _Tp&& __t) 338def3c375SEric Fiselier : __value_(_VSTD::forward<_Tp>(__t), __a) 339074f8d77SEric Fiselier {static_assert(!is_reference<_Hp>::value, 340074f8d77SEric Fiselier "Attempted to uses-allocator construct a reference element in a tuple");} 3413e519524SHoward Hinnant 3427546a111SMarshall Clow __tuple_leaf(const __tuple_leaf& __t) = default; 3437546a111SMarshall Clow __tuple_leaf(__tuple_leaf&& __t) = default; 3443e519524SHoward Hinnant 34506e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 34627d0a2a7SHoward Hinnant int swap(__tuple_leaf& __t) _NOEXCEPT_(__is_nothrow_swappable<__tuple_leaf>::value) 3473e519524SHoward Hinnant { 348ce48a113SHoward Hinnant _VSTD::swap(*this, __t); 3493e519524SHoward Hinnant return 0; 3503e519524SHoward Hinnant } 3513e519524SHoward Hinnant 35216719cd0SHui Xie _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 35316719cd0SHui Xie int swap(const __tuple_leaf& __t) const _NOEXCEPT_(__is_nothrow_swappable<const __tuple_leaf>::value) { 35416719cd0SHui Xie _VSTD::swap(*this, __t); 35516719cd0SHui Xie return 0; 35616719cd0SHui Xie } 35716719cd0SHui Xie 358def3c375SEric Fiselier _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 _Hp& get() _NOEXCEPT {return __value_;} 359def3c375SEric Fiselier _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const _Hp& get() const _NOEXCEPT {return __value_;} 3603e519524SHoward Hinnant}; 3613e519524SHoward Hinnant 3623e519524SHoward Hinnanttemplate <size_t _Ip, class _Hp> 3633e519524SHoward Hinnantclass __tuple_leaf<_Ip, _Hp, true> 3643e519524SHoward Hinnant : private _Hp 3653e519524SHoward Hinnant{ 36606e2b737SArthur O'Dwyer _LIBCPP_CONSTEXPR_AFTER_CXX11 3673e519524SHoward Hinnant __tuple_leaf& operator=(const __tuple_leaf&); 3683e519524SHoward Hinnantpublic: 36906e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY constexpr __tuple_leaf() 370a0f4c45cSHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<_Hp>::value) {} 3713e519524SHoward Hinnant 3723e519524SHoward Hinnant template <class _Alloc> 37306e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY constexpr 3743e519524SHoward Hinnant __tuple_leaf(integral_constant<int, 0>, const _Alloc&) {} 3753e519524SHoward Hinnant 3763e519524SHoward Hinnant template <class _Alloc> 37706e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY constexpr 3783e519524SHoward Hinnant __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a) 3793e519524SHoward Hinnant : _Hp(allocator_arg_t(), __a) {} 3803e519524SHoward Hinnant 3813e519524SHoward Hinnant template <class _Alloc> 38206e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY constexpr 3833e519524SHoward Hinnant __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a) 3843e519524SHoward Hinnant : _Hp(__a) {} 3853e519524SHoward Hinnant 38630ad985bSHoward Hinnant template <class _Tp, 387b4e88d4dSLouis Dionne class = __enable_if_t< 3883359a17bSEric Fiselier _And< 3893359a17bSEric Fiselier _IsNotSame<__uncvref_t<_Tp>, __tuple_leaf>, 3903359a17bSEric Fiselier is_constructible<_Hp, _Tp> 391567bb79bSEric Fiselier >::value 3923359a17bSEric Fiselier > 393567bb79bSEric Fiselier > 39475eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 3958a9ee148SHoward Hinnant explicit __tuple_leaf(_Tp&& __t) _NOEXCEPT_((is_nothrow_constructible<_Hp, _Tp>::value)) 396ce48a113SHoward Hinnant : _Hp(_VSTD::forward<_Tp>(__t)) {} 3973e519524SHoward Hinnant 3983e519524SHoward Hinnant template <class _Tp, class _Alloc> 39906e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY constexpr 4003e519524SHoward Hinnant explicit __tuple_leaf(integral_constant<int, 0>, const _Alloc&, _Tp&& __t) 401ce48a113SHoward Hinnant : _Hp(_VSTD::forward<_Tp>(__t)) {} 4023e519524SHoward Hinnant 4033e519524SHoward Hinnant template <class _Tp, class _Alloc> 40406e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY constexpr 4053e519524SHoward Hinnant explicit __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a, _Tp&& __t) 406ce48a113SHoward Hinnant : _Hp(allocator_arg_t(), __a, _VSTD::forward<_Tp>(__t)) {} 4073e519524SHoward Hinnant 4083e519524SHoward Hinnant template <class _Tp, class _Alloc> 40906e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY constexpr 4103e519524SHoward Hinnant explicit __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a, _Tp&& __t) 411ce48a113SHoward Hinnant : _Hp(_VSTD::forward<_Tp>(__t), __a) {} 4123e519524SHoward Hinnant 413567bb79bSEric Fiselier __tuple_leaf(__tuple_leaf const &) = default; 414567bb79bSEric Fiselier __tuple_leaf(__tuple_leaf &&) = default; 415567bb79bSEric Fiselier 41606e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 41727d0a2a7SHoward Hinnant int 41827d0a2a7SHoward Hinnant swap(__tuple_leaf& __t) _NOEXCEPT_(__is_nothrow_swappable<__tuple_leaf>::value) 4193e519524SHoward Hinnant { 420ce48a113SHoward Hinnant _VSTD::swap(*this, __t); 4213e519524SHoward Hinnant return 0; 4223e519524SHoward Hinnant } 4233e519524SHoward Hinnant 42416719cd0SHui Xie _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 42516719cd0SHui Xie int swap(const __tuple_leaf& __rhs) const _NOEXCEPT_(__is_nothrow_swappable<const __tuple_leaf>::value) { 42616719cd0SHui Xie _VSTD::swap(*this, __rhs); 42716719cd0SHui Xie return 0; 42816719cd0SHui Xie } 42916719cd0SHui Xie 43075eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 _Hp& get() _NOEXCEPT {return static_cast<_Hp&>(*this);} 43175eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const _Hp& get() const _NOEXCEPT {return static_cast<const _Hp&>(*this);} 4323e519524SHoward Hinnant}; 4333e519524SHoward Hinnant 434789847ddSHoward Hinnanttemplate <class ..._Tp> 43506e2b737SArthur O'Dwyer_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 4368a9ee148SHoward Hinnantvoid __swallow(_Tp&&...) _NOEXCEPT {} 4373e519524SHoward Hinnant 43814c5ec51SMarshall Clowtemplate <class _Tp> 43914c5ec51SMarshall Clowstruct __all_default_constructible; 44027d0a2a7SHoward Hinnant 44114c5ec51SMarshall Clowtemplate <class ..._Tp> 44214c5ec51SMarshall Clowstruct __all_default_constructible<__tuple_types<_Tp...>> 44314c5ec51SMarshall Clow : __all<is_default_constructible<_Tp>::value...> 44414c5ec51SMarshall Clow{ }; 44527d0a2a7SHoward Hinnant 4463e519524SHoward Hinnant// __tuple_impl 4473e519524SHoward Hinnant 4483e519524SHoward Hinnanttemplate<class _Indx, class ..._Tp> struct __tuple_impl; 4493e519524SHoward Hinnant 4503e519524SHoward Hinnanttemplate<size_t ..._Indx, class ..._Tp> 451b43f17c8SEric Fiselierstruct _LIBCPP_DECLSPEC_EMPTY_BASES __tuple_impl<__tuple_indices<_Indx...>, _Tp...> 4523e519524SHoward Hinnant : public __tuple_leaf<_Indx, _Tp>... 4533e519524SHoward Hinnant{ 454a62ebe04SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 45506e2b737SArthur O'Dwyer constexpr __tuple_impl() 456a0f4c45cSHoward Hinnant _NOEXCEPT_(__all<is_nothrow_default_constructible<_Tp>::value...>::value) {} 457a62ebe04SHoward Hinnant 4583e519524SHoward Hinnant template <size_t ..._Uf, class ..._Tf, 4593e519524SHoward Hinnant size_t ..._Ul, class ..._Tl, class ..._Up> 46075eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 4613e519524SHoward Hinnant explicit 4623e519524SHoward Hinnant __tuple_impl(__tuple_indices<_Uf...>, __tuple_types<_Tf...>, 4633e519524SHoward Hinnant __tuple_indices<_Ul...>, __tuple_types<_Tl...>, 4648a9ee148SHoward Hinnant _Up&&... __u) 4658a9ee148SHoward Hinnant _NOEXCEPT_((__all<is_nothrow_constructible<_Tf, _Up>::value...>::value && 4668a9ee148SHoward Hinnant __all<is_nothrow_default_constructible<_Tl>::value...>::value)) : 467ce48a113SHoward Hinnant __tuple_leaf<_Uf, _Tf>(_VSTD::forward<_Up>(__u))..., 4683e519524SHoward Hinnant __tuple_leaf<_Ul, _Tl>()... 4693e519524SHoward Hinnant {} 4703e519524SHoward Hinnant 4713e519524SHoward Hinnant template <class _Alloc, size_t ..._Uf, class ..._Tf, 4723e519524SHoward Hinnant size_t ..._Ul, class ..._Tl, class ..._Up> 47306e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 4743e519524SHoward Hinnant explicit 4753e519524SHoward Hinnant __tuple_impl(allocator_arg_t, const _Alloc& __a, 4763e519524SHoward Hinnant __tuple_indices<_Uf...>, __tuple_types<_Tf...>, 4773e519524SHoward Hinnant __tuple_indices<_Ul...>, __tuple_types<_Tl...>, 4783e519524SHoward Hinnant _Up&&... __u) : 4793e519524SHoward Hinnant __tuple_leaf<_Uf, _Tf>(__uses_alloc_ctor<_Tf, _Alloc, _Up>(), __a, 480ce48a113SHoward Hinnant _VSTD::forward<_Up>(__u))..., 4813e519524SHoward Hinnant __tuple_leaf<_Ul, _Tl>(__uses_alloc_ctor<_Tl, _Alloc>(), __a)... 4823e519524SHoward Hinnant {} 4833e519524SHoward Hinnant 4843e519524SHoward Hinnant template <class _Tuple, 485*4887d047SNikolas Klauser class = __enable_if_t<__tuple_constructible<_Tuple, tuple<_Tp...> >::value> 4863e519524SHoward Hinnant > 48775eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 4888a9ee148SHoward Hinnant __tuple_impl(_Tuple&& __t) _NOEXCEPT_((__all<is_nothrow_constructible<_Tp, typename tuple_element<_Indx, 4898a9ee148SHoward Hinnant typename __make_tuple_types<_Tuple>::type>::type>::value...>::value)) 490ce48a113SHoward Hinnant : __tuple_leaf<_Indx, _Tp>(_VSTD::forward<typename tuple_element<_Indx, 491ce48a113SHoward Hinnant typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<_Indx>(__t)))... 4923e519524SHoward Hinnant {} 4933e519524SHoward Hinnant 4943e519524SHoward Hinnant template <class _Alloc, class _Tuple, 495*4887d047SNikolas Klauser class = __enable_if_t<__tuple_constructible<_Tuple, tuple<_Tp...> >::value> 4963e519524SHoward Hinnant > 49706e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 4983e519524SHoward Hinnant __tuple_impl(allocator_arg_t, const _Alloc& __a, _Tuple&& __t) 4993e519524SHoward Hinnant : __tuple_leaf<_Indx, _Tp>(__uses_alloc_ctor<_Tp, _Alloc, typename tuple_element<_Indx, 5003e519524SHoward Hinnant typename __make_tuple_types<_Tuple>::type>::type>(), __a, 501ce48a113SHoward Hinnant _VSTD::forward<typename tuple_element<_Indx, 502ce48a113SHoward Hinnant typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<_Indx>(__t)))... 5033e519524SHoward Hinnant {} 5043e519524SHoward Hinnant 5054478b25aSHoward Hinnant __tuple_impl(const __tuple_impl&) = default; 5064478b25aSHoward Hinnant __tuple_impl(__tuple_impl&&) = default; 5074478b25aSHoward Hinnant 50806e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 5093e519524SHoward Hinnant void swap(__tuple_impl& __t) 51027d0a2a7SHoward Hinnant _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value) 5113e519524SHoward Hinnant { 512a0839b14SLouis Dionne _VSTD::__swallow(__tuple_leaf<_Indx, _Tp>::swap(static_cast<__tuple_leaf<_Indx, _Tp>&>(__t))...); 5133e519524SHoward Hinnant } 51416719cd0SHui Xie 51516719cd0SHui Xie _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 51616719cd0SHui Xie void swap(const __tuple_impl& __t) const 51716719cd0SHui Xie _NOEXCEPT_(__all<__is_nothrow_swappable<const _Tp>::value...>::value) 51816719cd0SHui Xie { 51916719cd0SHui Xie _VSTD::__swallow(__tuple_leaf<_Indx, _Tp>::swap(static_cast<const __tuple_leaf<_Indx, _Tp>&>(__t))...); 52016719cd0SHui Xie } 5213e519524SHoward Hinnant}; 5223e519524SHoward Hinnant 523a0839b14SLouis Dionnetemplate<class _Dest, class _Source, size_t ..._Np> 52406e2b737SArthur O'Dwyer_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 525a0839b14SLouis Dionnevoid __memberwise_copy_assign(_Dest& __dest, _Source const& __source, __tuple_indices<_Np...>) { 526a0839b14SLouis Dionne _VSTD::__swallow(((_VSTD::get<_Np>(__dest) = _VSTD::get<_Np>(__source)), void(), 0)...); 527a0839b14SLouis Dionne} 52874cba642SEric Fiselier 529a0839b14SLouis Dionnetemplate<class _Dest, class _Source, class ..._Up, size_t ..._Np> 53006e2b737SArthur O'Dwyer_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 531a0839b14SLouis Dionnevoid __memberwise_forward_assign(_Dest& __dest, _Source&& __source, __tuple_types<_Up...>, __tuple_indices<_Np...>) { 532a0839b14SLouis Dionne _VSTD::__swallow((( 533618862e8SLouis Dionne _VSTD::get<_Np>(__dest) = _VSTD::forward<_Up>(_VSTD::get<_Np>(__source)) 534a0839b14SLouis Dionne ), void(), 0)...); 535a0839b14SLouis Dionne} 53674cba642SEric Fiselier 5373e519524SHoward Hinnanttemplate <class ..._Tp> 538e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS tuple 5393e519524SHoward Hinnant{ 540def3c375SEric Fiselier typedef __tuple_impl<typename __make_tuple_indices<sizeof...(_Tp)>::type, _Tp...> _BaseT; 5413e519524SHoward Hinnant 542def3c375SEric Fiselier _BaseT __base_; 5433e519524SHoward Hinnant 5448bf1f08aSMarshall Clow template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11 545c206366fSHoward Hinnant typename tuple_element<_Jp, tuple<_Up...> >::type& get(tuple<_Up...>&) _NOEXCEPT; 5468bf1f08aSMarshall Clow template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11 547c206366fSHoward Hinnant const typename tuple_element<_Jp, tuple<_Up...> >::type& get(const tuple<_Up...>&) _NOEXCEPT; 5488bf1f08aSMarshall Clow template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11 549c206366fSHoward Hinnant typename tuple_element<_Jp, tuple<_Up...> >::type&& get(tuple<_Up...>&&) _NOEXCEPT; 550545b8861SEric Fiselier template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11 551545b8861SEric Fiselier const typename tuple_element<_Jp, tuple<_Up...> >::type&& get(const tuple<_Up...>&&) _NOEXCEPT; 5523e519524SHoward Hinnantpublic: 553a3ab5120SLouis Dionne // [tuple.cnstr] 5543e519524SHoward Hinnant 555a3ab5120SLouis Dionne // tuple() constructors (including allocator_arg_t variants) 556b4e88d4dSLouis Dionne template <template<class...> class _IsImpDefault = __is_implicitly_default_constructible, __enable_if_t< 557a3ab5120SLouis Dionne _And< 558a3ab5120SLouis Dionne _IsImpDefault<_Tp>... // explicit check 559a3ab5120SLouis Dionne >::value 560a3ab5120SLouis Dionne , int> = 0> 561ef89e8caSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 562e16f2cb6SLouis Dionne tuple() 563a3ab5120SLouis Dionne _NOEXCEPT_(_And<is_nothrow_default_constructible<_Tp>...>::value) 564a3ab5120SLouis Dionne { } 565e16f2cb6SLouis Dionne 566a3ab5120SLouis Dionne template <template<class...> class _IsImpDefault = __is_implicitly_default_constructible, 567b4e88d4dSLouis Dionne template<class...> class _IsDefault = is_default_constructible, __enable_if_t< 568a3ab5120SLouis Dionne _And< 569a3ab5120SLouis Dionne _IsDefault<_Tp>..., 570a3ab5120SLouis Dionne _Not<_Lazy<_And, _IsImpDefault<_Tp>...> > // explicit check 571a3ab5120SLouis Dionne >::value 572a3ab5120SLouis Dionne , int> = 0> 573a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 574a3ab5120SLouis Dionne explicit tuple() 575a3ab5120SLouis Dionne _NOEXCEPT_(_And<is_nothrow_default_constructible<_Tp>...>::value) 576a3ab5120SLouis Dionne { } 577a62ebe04SHoward Hinnant 578b4e88d4dSLouis Dionne template <class _Alloc, template<class...> class _IsImpDefault = __is_implicitly_default_constructible, __enable_if_t< 579a3ab5120SLouis Dionne _And< 580a3ab5120SLouis Dionne _IsImpDefault<_Tp>... // explicit check 581a3ab5120SLouis Dionne >::value 582a3ab5120SLouis Dionne , int> = 0> 583a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 584a3ab5120SLouis Dionne tuple(allocator_arg_t, _Alloc const& __a) 585a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __a, 586a3ab5120SLouis Dionne __tuple_indices<>(), __tuple_types<>(), 587a3ab5120SLouis Dionne typename __make_tuple_indices<sizeof...(_Tp), 0>::type(), 588a3ab5120SLouis Dionne __tuple_types<_Tp...>()) {} 589a3ab5120SLouis Dionne 590a3ab5120SLouis Dionne template <class _Alloc, 591a3ab5120SLouis Dionne template<class...> class _IsImpDefault = __is_implicitly_default_constructible, 592b4e88d4dSLouis Dionne template<class...> class _IsDefault = is_default_constructible, __enable_if_t< 593a3ab5120SLouis Dionne _And< 594a3ab5120SLouis Dionne _IsDefault<_Tp>..., 595a3ab5120SLouis Dionne _Not<_Lazy<_And, _IsImpDefault<_Tp>...> > // explicit check 596a3ab5120SLouis Dionne >::value 597a3ab5120SLouis Dionne , int> = 0> 598a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 599a3ab5120SLouis Dionne explicit tuple(allocator_arg_t, _Alloc const& __a) 600a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __a, 601a3ab5120SLouis Dionne __tuple_indices<>(), __tuple_types<>(), 602a3ab5120SLouis Dionne typename __make_tuple_indices<sizeof...(_Tp), 0>::type(), 603a3ab5120SLouis Dionne __tuple_types<_Tp...>()) {} 604a3ab5120SLouis Dionne 605a3ab5120SLouis Dionne // tuple(const T&...) constructors (including allocator_arg_t variants) 606b4e88d4dSLouis Dionne template <template<class...> class _And = _And, __enable_if_t< 607a3ab5120SLouis Dionne _And< 608a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Tp) >= 1>, 609a3ab5120SLouis Dionne is_copy_constructible<_Tp>..., 610a3ab5120SLouis Dionne is_convertible<const _Tp&, _Tp>... // explicit check 611a3ab5120SLouis Dionne >::value 612a3ab5120SLouis Dionne , int> = 0> 613a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 614a3ab5120SLouis Dionne tuple(const _Tp& ... __t) 615a3ab5120SLouis Dionne _NOEXCEPT_(_And<is_nothrow_copy_constructible<_Tp>...>::value) 616a3ab5120SLouis Dionne : __base_(typename __make_tuple_indices<sizeof...(_Tp)>::type(), 617a3ab5120SLouis Dionne typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(), 618a3ab5120SLouis Dionne typename __make_tuple_indices<0>::type(), 619a3ab5120SLouis Dionne typename __make_tuple_types<tuple, 0>::type(), 620a3ab5120SLouis Dionne __t... 621a3ab5120SLouis Dionne ) {} 622a3ab5120SLouis Dionne 623b4e88d4dSLouis Dionne template <template<class...> class _And = _And, __enable_if_t< 624a3ab5120SLouis Dionne _And< 625a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Tp) >= 1>, 626a3ab5120SLouis Dionne is_copy_constructible<_Tp>..., 627a3ab5120SLouis Dionne _Not<_Lazy<_And, is_convertible<const _Tp&, _Tp>...> > // explicit check 628a3ab5120SLouis Dionne >::value 629a3ab5120SLouis Dionne , int> = 0> 630a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 631a3ab5120SLouis Dionne explicit tuple(const _Tp& ... __t) 632a3ab5120SLouis Dionne _NOEXCEPT_(_And<is_nothrow_copy_constructible<_Tp>...>::value) 633a3ab5120SLouis Dionne : __base_(typename __make_tuple_indices<sizeof...(_Tp)>::type(), 634a3ab5120SLouis Dionne typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(), 635a3ab5120SLouis Dionne typename __make_tuple_indices<0>::type(), 636a3ab5120SLouis Dionne typename __make_tuple_types<tuple, 0>::type(), 637a3ab5120SLouis Dionne __t... 638a3ab5120SLouis Dionne ) {} 639a3ab5120SLouis Dionne 640b4e88d4dSLouis Dionne template <class _Alloc, template<class...> class _And = _And, __enable_if_t< 641a3ab5120SLouis Dionne _And< 642a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Tp) >= 1>, 643a3ab5120SLouis Dionne is_copy_constructible<_Tp>..., 644a3ab5120SLouis Dionne is_convertible<const _Tp&, _Tp>... // explicit check 645a3ab5120SLouis Dionne >::value 646a3ab5120SLouis Dionne , int> = 0> 647a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 648a3ab5120SLouis Dionne tuple(allocator_arg_t, const _Alloc& __a, const _Tp& ... __t) 649a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __a, 650a3ab5120SLouis Dionne typename __make_tuple_indices<sizeof...(_Tp)>::type(), 651a3ab5120SLouis Dionne typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(), 652a3ab5120SLouis Dionne typename __make_tuple_indices<0>::type(), 653a3ab5120SLouis Dionne typename __make_tuple_types<tuple, 0>::type(), 654a3ab5120SLouis Dionne __t... 655a3ab5120SLouis Dionne ) {} 656a3ab5120SLouis Dionne 657b4e88d4dSLouis Dionne template <class _Alloc, template<class...> class _And = _And, __enable_if_t< 658a3ab5120SLouis Dionne _And< 659a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Tp) >= 1>, 660a3ab5120SLouis Dionne is_copy_constructible<_Tp>..., 661a3ab5120SLouis Dionne _Not<_Lazy<_And, is_convertible<const _Tp&, _Tp>...> > // explicit check 662a3ab5120SLouis Dionne >::value 663a3ab5120SLouis Dionne , int> = 0> 664a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 665a3ab5120SLouis Dionne explicit tuple(allocator_arg_t, const _Alloc& __a, const _Tp& ... __t) 666a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __a, 667a3ab5120SLouis Dionne typename __make_tuple_indices<sizeof...(_Tp)>::type(), 668a3ab5120SLouis Dionne typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(), 669a3ab5120SLouis Dionne typename __make_tuple_indices<0>::type(), 670a3ab5120SLouis Dionne typename __make_tuple_types<tuple, 0>::type(), 671a3ab5120SLouis Dionne __t... 672a3ab5120SLouis Dionne ) {} 673a3ab5120SLouis Dionne 674a3ab5120SLouis Dionne // tuple(U&& ...) constructors (including allocator_arg_t variants) 675a3ab5120SLouis Dionne template <class ..._Up> struct _IsThisTuple : false_type { }; 676a3ab5120SLouis Dionne template <class _Up> struct _IsThisTuple<_Up> : is_same<__uncvref_t<_Up>, tuple> { }; 677a3ab5120SLouis Dionne 678a3ab5120SLouis Dionne template <class ..._Up> 679a3ab5120SLouis Dionne struct _EnableUTypesCtor : _And< 680a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Tp) >= 1>, 681a3ab5120SLouis Dionne _Not<_IsThisTuple<_Up...> >, // extension to allow mis-behaved user constructors 682a3ab5120SLouis Dionne is_constructible<_Tp, _Up>... 683a3ab5120SLouis Dionne > { }; 684a3ab5120SLouis Dionne 685b4e88d4dSLouis Dionne template <class ..._Up, __enable_if_t< 686a3ab5120SLouis Dionne _And< 687a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Up) == sizeof...(_Tp)>, 688a3ab5120SLouis Dionne _EnableUTypesCtor<_Up...>, 689a3ab5120SLouis Dionne is_convertible<_Up, _Tp>... // explicit check 690a3ab5120SLouis Dionne >::value 691a3ab5120SLouis Dionne , int> = 0> 692a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 693a3ab5120SLouis Dionne tuple(_Up&&... __u) 694a3ab5120SLouis Dionne _NOEXCEPT_((_And<is_nothrow_constructible<_Tp, _Up>...>::value)) 695a3ab5120SLouis Dionne : __base_(typename __make_tuple_indices<sizeof...(_Up)>::type(), 696a3ab5120SLouis Dionne typename __make_tuple_types<tuple, sizeof...(_Up)>::type(), 697a3ab5120SLouis Dionne typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(), 698a3ab5120SLouis Dionne typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(), 699a3ab5120SLouis Dionne _VSTD::forward<_Up>(__u)...) {} 700a3ab5120SLouis Dionne 701b4e88d4dSLouis Dionne template <class ..._Up, __enable_if_t< 702a3ab5120SLouis Dionne _And< 703a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Up) == sizeof...(_Tp)>, 704a3ab5120SLouis Dionne _EnableUTypesCtor<_Up...>, 705a3ab5120SLouis Dionne _Not<_Lazy<_And, is_convertible<_Up, _Tp>...> > // explicit check 706a3ab5120SLouis Dionne >::value 707a3ab5120SLouis Dionne , int> = 0> 708a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 709a3ab5120SLouis Dionne explicit tuple(_Up&&... __u) 710a3ab5120SLouis Dionne _NOEXCEPT_((_And<is_nothrow_constructible<_Tp, _Up>...>::value)) 711a3ab5120SLouis Dionne : __base_(typename __make_tuple_indices<sizeof...(_Up)>::type(), 712a3ab5120SLouis Dionne typename __make_tuple_types<tuple, sizeof...(_Up)>::type(), 713a3ab5120SLouis Dionne typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(), 714a3ab5120SLouis Dionne typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(), 715a3ab5120SLouis Dionne _VSTD::forward<_Up>(__u)...) {} 716a3ab5120SLouis Dionne 717b4e88d4dSLouis Dionne template <class _Alloc, class ..._Up, __enable_if_t< 718a3ab5120SLouis Dionne _And< 719a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Up) == sizeof...(_Tp)>, 720a3ab5120SLouis Dionne _EnableUTypesCtor<_Up...>, 721a3ab5120SLouis Dionne is_convertible<_Up, _Tp>... // explicit check 722a3ab5120SLouis Dionne >::value 723a3ab5120SLouis Dionne , int> = 0> 724a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 725a3ab5120SLouis Dionne tuple(allocator_arg_t, const _Alloc& __a, _Up&&... __u) 726a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __a, 727a3ab5120SLouis Dionne typename __make_tuple_indices<sizeof...(_Up)>::type(), 728a3ab5120SLouis Dionne typename __make_tuple_types<tuple, sizeof...(_Up)>::type(), 729a3ab5120SLouis Dionne typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(), 730a3ab5120SLouis Dionne typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(), 731a3ab5120SLouis Dionne _VSTD::forward<_Up>(__u)...) {} 732a3ab5120SLouis Dionne 733b4e88d4dSLouis Dionne template <class _Alloc, class ..._Up, __enable_if_t< 734a3ab5120SLouis Dionne _And< 735a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Up) == sizeof...(_Tp)>, 736a3ab5120SLouis Dionne _EnableUTypesCtor<_Up...>, 737a3ab5120SLouis Dionne _Not<_Lazy<_And, is_convertible<_Up, _Tp>...> > // explicit check 738a3ab5120SLouis Dionne >::value 739a3ab5120SLouis Dionne , int> = 0> 740a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 741a3ab5120SLouis Dionne explicit tuple(allocator_arg_t, const _Alloc& __a, _Up&&... __u) 742a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __a, 743a3ab5120SLouis Dionne typename __make_tuple_indices<sizeof...(_Up)>::type(), 744a3ab5120SLouis Dionne typename __make_tuple_types<tuple, sizeof...(_Up)>::type(), 745a3ab5120SLouis Dionne typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(), 746a3ab5120SLouis Dionne typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(), 747a3ab5120SLouis Dionne _VSTD::forward<_Up>(__u)...) {} 748a3ab5120SLouis Dionne 749a3ab5120SLouis Dionne // Copy and move constructors (including the allocator_arg_t variants) 750a3ab5120SLouis Dionne tuple(const tuple&) = default; 751aedcbf89SEric Fiselier tuple(tuple&&) = default; 752aedcbf89SEric Fiselier 753b4e88d4dSLouis Dionne template <class _Alloc, template<class...> class _And = _And, __enable_if_t< 754a3ab5120SLouis Dionne _And<is_copy_constructible<_Tp>...>::value 755a3ab5120SLouis Dionne , int> = 0> 75616719cd0SHui Xie _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 757a3ab5120SLouis Dionne tuple(allocator_arg_t, const _Alloc& __alloc, const tuple& __t) 758a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __alloc, __t) 759a3ab5120SLouis Dionne { } 76090fb2bafSEric Fiselier 761b4e88d4dSLouis Dionne template <class _Alloc, template<class...> class _And = _And, __enable_if_t< 762a3ab5120SLouis Dionne _And<is_move_constructible<_Tp>...>::value 763a3ab5120SLouis Dionne , int> = 0> 76416719cd0SHui Xie _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 765a3ab5120SLouis Dionne tuple(allocator_arg_t, const _Alloc& __alloc, tuple&& __t) 766a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __alloc, _VSTD::move(__t)) 767a3ab5120SLouis Dionne { } 76859e26308SLouis Dionne 769a3ab5120SLouis Dionne // tuple(const tuple<U...>&) constructors (including allocator_arg_t variants) 77016719cd0SHui Xie 77116719cd0SHui Xie template <class _OtherTuple, class _DecayedOtherTuple = __uncvref_t<_OtherTuple>, class = void> 77216719cd0SHui Xie struct _EnableCtorFromUTypesTuple : false_type {}; 77316719cd0SHui Xie 77416719cd0SHui Xie template <class _OtherTuple, class... _Up> 77516719cd0SHui Xie struct _EnableCtorFromUTypesTuple<_OtherTuple, tuple<_Up...>, 77616719cd0SHui Xie // the length of the packs needs to checked first otherwise the 2 packs cannot be expanded simultaneously below 77716719cd0SHui Xie __enable_if_t<sizeof...(_Up) == sizeof...(_Tp)>> : _And< 77816719cd0SHui Xie // the two conditions below are not in spec. The purpose is to disable the UTypes Ctor when copy/move Ctor can work. 77916719cd0SHui Xie // Otherwise, is_constructible can trigger hard error in those cases https://godbolt.org/z/M94cGdKcE 78016719cd0SHui Xie _Not<is_same<_OtherTuple, const tuple&> >, 78116719cd0SHui Xie _Not<is_same<_OtherTuple, tuple&&> >, 78216719cd0SHui Xie is_constructible<_Tp, __copy_cvref_t<_OtherTuple, _Up> >..., 78316719cd0SHui Xie _Lazy<_Or, _BoolConstant<sizeof...(_Tp) != 1>, 784a3ab5120SLouis Dionne // _Tp and _Up are 1-element packs - the pack expansions look 785a3ab5120SLouis Dionne // weird to avoid tripping up the type traits in degenerate cases 786a3ab5120SLouis Dionne _Lazy<_And, 78716719cd0SHui Xie _Not<is_same<_Tp, _Up> >..., 78816719cd0SHui Xie _Not<is_convertible<_OtherTuple, _Tp> >..., 78916719cd0SHui Xie _Not<is_constructible<_Tp, _OtherTuple> >... 7909795699aSEric Fiselier > 79116719cd0SHui Xie > 792a3ab5120SLouis Dionne > {}; 7939795699aSEric Fiselier 794b4e88d4dSLouis Dionne template <class ..._Up, __enable_if_t< 795a3ab5120SLouis Dionne _And< 79616719cd0SHui Xie _EnableCtorFromUTypesTuple<const tuple<_Up...>&>, 797a3ab5120SLouis Dionne is_convertible<const _Up&, _Tp>... // explicit check 7988a9ee148SHoward Hinnant >::value 799a3ab5120SLouis Dionne , int> = 0> 80075eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 801a3ab5120SLouis Dionne tuple(const tuple<_Up...>& __t) 802a3ab5120SLouis Dionne _NOEXCEPT_((_And<is_nothrow_constructible<_Tp, const _Up&>...>::value)) 803a3ab5120SLouis Dionne : __base_(__t) 804a3ab5120SLouis Dionne { } 805a3ab5120SLouis Dionne 806b4e88d4dSLouis Dionne template <class ..._Up, __enable_if_t< 807a3ab5120SLouis Dionne _And< 80816719cd0SHui Xie _EnableCtorFromUTypesTuple<const tuple<_Up...>&>, 809a3ab5120SLouis Dionne _Not<_Lazy<_And, is_convertible<const _Up&, _Tp>...> > // explicit check 8108a9ee148SHoward Hinnant >::value 811a3ab5120SLouis Dionne , int> = 0> 81275eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 813a3ab5120SLouis Dionne explicit tuple(const tuple<_Up...>& __t) 814a3ab5120SLouis Dionne _NOEXCEPT_((_And<is_nothrow_constructible<_Tp, const _Up&>...>::value)) 815a3ab5120SLouis Dionne : __base_(__t) 816a3ab5120SLouis Dionne { } 8173e519524SHoward Hinnant 818b4e88d4dSLouis Dionne template <class ..._Up, class _Alloc, __enable_if_t< 819a3ab5120SLouis Dionne _And< 82016719cd0SHui Xie _EnableCtorFromUTypesTuple<const tuple<_Up...>&>, 821a3ab5120SLouis Dionne is_convertible<const _Up&, _Tp>... // explicit check 822a3ab5120SLouis Dionne >::value 823a3ab5120SLouis Dionne , int> = 0> 82406e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 825a3ab5120SLouis Dionne tuple(allocator_arg_t, const _Alloc& __a, const tuple<_Up...>& __t) 826a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __a, __t) 827a3ab5120SLouis Dionne { } 8283e519524SHoward Hinnant 829b4e88d4dSLouis Dionne template <class ..._Up, class _Alloc, __enable_if_t< 830a3ab5120SLouis Dionne _And< 83116719cd0SHui Xie _EnableCtorFromUTypesTuple<const tuple<_Up...>&>, 832a3ab5120SLouis Dionne _Not<_Lazy<_And, is_convertible<const _Up&, _Tp>...> > // explicit check 833a3ab5120SLouis Dionne >::value 834a3ab5120SLouis Dionne , int> = 0> 83506e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 836a3ab5120SLouis Dionne explicit tuple(allocator_arg_t, const _Alloc& __a, const tuple<_Up...>& __t) 837a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __a, __t) 838a3ab5120SLouis Dionne { } 839a3ab5120SLouis Dionne 84016719cd0SHui Xie#if _LIBCPP_STD_VER > 20 84116719cd0SHui Xie // tuple(tuple<U...>&) constructors (including allocator_arg_t variants) 84216719cd0SHui Xie 84316719cd0SHui Xie template <class... _Up, enable_if_t< 84416719cd0SHui Xie _EnableCtorFromUTypesTuple<tuple<_Up...>&>::value>* = nullptr> 84516719cd0SHui Xie _LIBCPP_HIDE_FROM_ABI constexpr 84616719cd0SHui Xie explicit(!(is_convertible_v<_Up&, _Tp> && ...)) 84716719cd0SHui Xie tuple(tuple<_Up...>& __t) : __base_(__t) {} 84816719cd0SHui Xie 84916719cd0SHui Xie template <class _Alloc, class... _Up, enable_if_t< 85016719cd0SHui Xie _EnableCtorFromUTypesTuple<tuple<_Up...>&>::value>* = nullptr> 85116719cd0SHui Xie _LIBCPP_HIDE_FROM_ABI constexpr 85216719cd0SHui Xie explicit(!(is_convertible_v<_Up&, _Tp> && ...)) 85316719cd0SHui Xie tuple(allocator_arg_t, const _Alloc& __alloc, tuple<_Up...>& __t) : __base_(allocator_arg_t(), __alloc, __t) {} 85416719cd0SHui Xie#endif // _LIBCPP_STD_VER > 20 85516719cd0SHui Xie 856a3ab5120SLouis Dionne // tuple(tuple<U...>&&) constructors (including allocator_arg_t variants) 857a3ab5120SLouis Dionne 858b4e88d4dSLouis Dionne template <class ..._Up, __enable_if_t< 859a3ab5120SLouis Dionne _And< 86016719cd0SHui Xie _EnableCtorFromUTypesTuple<tuple<_Up...>&&>, 861a3ab5120SLouis Dionne is_convertible<_Up, _Tp>... // explicit check 862a3ab5120SLouis Dionne >::value 863a3ab5120SLouis Dionne , int> = 0> 864a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 865a3ab5120SLouis Dionne tuple(tuple<_Up...>&& __t) 866a3ab5120SLouis Dionne _NOEXCEPT_((_And<is_nothrow_constructible<_Tp, _Up>...>::value)) 867a3ab5120SLouis Dionne : __base_(_VSTD::move(__t)) 868a3ab5120SLouis Dionne { } 869a3ab5120SLouis Dionne 870b4e88d4dSLouis Dionne template <class ..._Up, __enable_if_t< 871a3ab5120SLouis Dionne _And< 87216719cd0SHui Xie _EnableCtorFromUTypesTuple<tuple<_Up...>&&>, 873a3ab5120SLouis Dionne _Not<_Lazy<_And, is_convertible<_Up, _Tp>...> > // explicit check 874a3ab5120SLouis Dionne >::value 875a3ab5120SLouis Dionne , int> = 0> 876a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 877a3ab5120SLouis Dionne explicit tuple(tuple<_Up...>&& __t) 878a3ab5120SLouis Dionne _NOEXCEPT_((_And<is_nothrow_constructible<_Tp, _Up>...>::value)) 879a3ab5120SLouis Dionne : __base_(_VSTD::move(__t)) 880a3ab5120SLouis Dionne { } 881a3ab5120SLouis Dionne 882b4e88d4dSLouis Dionne template <class _Alloc, class ..._Up, __enable_if_t< 883a3ab5120SLouis Dionne _And< 88416719cd0SHui Xie _EnableCtorFromUTypesTuple<tuple<_Up...>&&>, 885a3ab5120SLouis Dionne is_convertible<_Up, _Tp>... // explicit check 886a3ab5120SLouis Dionne >::value 887a3ab5120SLouis Dionne , int> = 0> 888a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 889a3ab5120SLouis Dionne tuple(allocator_arg_t, const _Alloc& __a, tuple<_Up...>&& __t) 890a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __a, _VSTD::move(__t)) 891a3ab5120SLouis Dionne { } 892a3ab5120SLouis Dionne 893b4e88d4dSLouis Dionne template <class _Alloc, class ..._Up, __enable_if_t< 894a3ab5120SLouis Dionne _And< 89516719cd0SHui Xie _EnableCtorFromUTypesTuple<tuple<_Up...>&&>, 896a3ab5120SLouis Dionne _Not<_Lazy<_And, is_convertible<_Up, _Tp>...> > // explicit check 897a3ab5120SLouis Dionne >::value 898a3ab5120SLouis Dionne , int> = 0> 899a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 900a3ab5120SLouis Dionne explicit tuple(allocator_arg_t, const _Alloc& __a, tuple<_Up...>&& __t) 901a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __a, _VSTD::move(__t)) 902a3ab5120SLouis Dionne { } 903a3ab5120SLouis Dionne 90416719cd0SHui Xie#if _LIBCPP_STD_VER > 20 90516719cd0SHui Xie // tuple(const tuple<U...>&&) constructors (including allocator_arg_t variants) 90616719cd0SHui Xie 90716719cd0SHui Xie template <class... _Up, enable_if_t< 90816719cd0SHui Xie _EnableCtorFromUTypesTuple<const tuple<_Up...>&&>::value>* = nullptr> 90916719cd0SHui Xie _LIBCPP_HIDE_FROM_ABI constexpr 91016719cd0SHui Xie explicit(!(is_convertible_v<const _Up&&, _Tp> && ...)) 91116719cd0SHui Xie tuple(const tuple<_Up...>&& __t) : __base_(std::move(__t)) {} 91216719cd0SHui Xie 91316719cd0SHui Xie template <class _Alloc, class... _Up, enable_if_t< 91416719cd0SHui Xie _EnableCtorFromUTypesTuple<const tuple<_Up...>&&>::value>* = nullptr> 91516719cd0SHui Xie _LIBCPP_HIDE_FROM_ABI constexpr 91616719cd0SHui Xie explicit(!(is_convertible_v<const _Up&&, _Tp> && ...)) 91716719cd0SHui Xie tuple(allocator_arg_t, const _Alloc& __alloc, const tuple<_Up...>&& __t) 91816719cd0SHui Xie : __base_(allocator_arg_t(), __alloc, std::move(__t)) {} 91916719cd0SHui Xie#endif // _LIBCPP_STD_VER > 20 92016719cd0SHui Xie 921a3ab5120SLouis Dionne // tuple(const pair<U1, U2>&) constructors (including allocator_arg_t variants) 92216719cd0SHui Xie 92316719cd0SHui Xie template <template <class...> class Pred, class _Pair, class _DecayedPair = __uncvref_t<_Pair>, class _Tuple = tuple> 92416719cd0SHui Xie struct _CtorPredicateFromPair : false_type{}; 92516719cd0SHui Xie 92616719cd0SHui Xie template <template <class...> class Pred, class _Pair, class _Up1, class _Up2, class _Tp1, class _Tp2> 92716719cd0SHui Xie struct _CtorPredicateFromPair<Pred, _Pair, pair<_Up1, _Up2>, tuple<_Tp1, _Tp2> > : _And< 92816719cd0SHui Xie Pred<_Tp1, __copy_cvref_t<_Pair, _Up1> >, 92916719cd0SHui Xie Pred<_Tp2, __copy_cvref_t<_Pair, _Up2> > 930a3ab5120SLouis Dionne > {}; 931a3ab5120SLouis Dionne 93216719cd0SHui Xie template <class _Pair> 93316719cd0SHui Xie struct _EnableCtorFromPair : _CtorPredicateFromPair<is_constructible, _Pair>{}; 93416719cd0SHui Xie 93516719cd0SHui Xie template <class _Pair> 93616719cd0SHui Xie struct _NothrowConstructibleFromPair : _CtorPredicateFromPair<is_nothrow_constructible, _Pair>{}; 93716719cd0SHui Xie 93816719cd0SHui Xie template <class _Pair, class _DecayedPair = __uncvref_t<_Pair>, class _Tuple = tuple> 93916719cd0SHui Xie struct _BothImplicitlyConvertible : false_type{}; 94016719cd0SHui Xie 94116719cd0SHui Xie template <class _Pair, class _Up1, class _Up2, class _Tp1, class _Tp2> 94216719cd0SHui Xie struct _BothImplicitlyConvertible<_Pair, pair<_Up1, _Up2>, tuple<_Tp1, _Tp2> > : _And< 94316719cd0SHui Xie is_convertible<__copy_cvref_t<_Pair, _Up1>, _Tp1>, 94416719cd0SHui Xie is_convertible<__copy_cvref_t<_Pair, _Up2>, _Tp2> 945a3ab5120SLouis Dionne > {}; 946a3ab5120SLouis Dionne 947b4e88d4dSLouis Dionne template <class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t< 948a3ab5120SLouis Dionne _And< 94916719cd0SHui Xie _EnableCtorFromPair<const pair<_Up1, _Up2>&>, 95016719cd0SHui Xie _BothImplicitlyConvertible<const pair<_Up1, _Up2>&> // explicit check 951a3ab5120SLouis Dionne >::value 952a3ab5120SLouis Dionne , int> = 0> 953a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 954a3ab5120SLouis Dionne tuple(const pair<_Up1, _Up2>& __p) 95516719cd0SHui Xie _NOEXCEPT_((_NothrowConstructibleFromPair<const pair<_Up1, _Up2>&>::value)) 956a3ab5120SLouis Dionne : __base_(__p) 957a3ab5120SLouis Dionne { } 958a3ab5120SLouis Dionne 959b4e88d4dSLouis Dionne template <class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t< 960a3ab5120SLouis Dionne _And< 96116719cd0SHui Xie _EnableCtorFromPair<const pair<_Up1, _Up2>&>, 96216719cd0SHui Xie _Not<_BothImplicitlyConvertible<const pair<_Up1, _Up2>&> > // explicit check 963a3ab5120SLouis Dionne >::value 964a3ab5120SLouis Dionne , int> = 0> 965a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 966a3ab5120SLouis Dionne explicit tuple(const pair<_Up1, _Up2>& __p) 96716719cd0SHui Xie _NOEXCEPT_((_NothrowConstructibleFromPair<const pair<_Up1, _Up2>&>::value)) 968a3ab5120SLouis Dionne : __base_(__p) 969a3ab5120SLouis Dionne { } 970a3ab5120SLouis Dionne 971b4e88d4dSLouis Dionne template <class _Alloc, class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t< 972a3ab5120SLouis Dionne _And< 97316719cd0SHui Xie _EnableCtorFromPair<const pair<_Up1, _Up2>&>, 97416719cd0SHui Xie _BothImplicitlyConvertible<const pair<_Up1, _Up2>&> // explicit check 975a3ab5120SLouis Dionne >::value 976a3ab5120SLouis Dionne , int> = 0> 977a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 978a3ab5120SLouis Dionne tuple(allocator_arg_t, const _Alloc& __a, const pair<_Up1, _Up2>& __p) 979a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __a, __p) 980a3ab5120SLouis Dionne { } 981a3ab5120SLouis Dionne 982b4e88d4dSLouis Dionne template <class _Alloc, class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t< 983a3ab5120SLouis Dionne _And< 98416719cd0SHui Xie _EnableCtorFromPair<const pair<_Up1, _Up2>&>, 98516719cd0SHui Xie _Not<_BothImplicitlyConvertible<const pair<_Up1, _Up2>&> > // explicit check 986a3ab5120SLouis Dionne >::value 987a3ab5120SLouis Dionne , int> = 0> 988a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 989a3ab5120SLouis Dionne explicit tuple(allocator_arg_t, const _Alloc& __a, const pair<_Up1, _Up2>& __p) 990a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __a, __p) 991a3ab5120SLouis Dionne { } 992a3ab5120SLouis Dionne 99316719cd0SHui Xie#if _LIBCPP_STD_VER > 20 99416719cd0SHui Xie // tuple(pair<U1, U2>&) constructors (including allocator_arg_t variants) 9959dd7ad6fSHui Xie 99616719cd0SHui Xie template <class _U1, class _U2, enable_if_t< 99716719cd0SHui Xie _EnableCtorFromPair<pair<_U1, _U2>&>::value>* = nullptr> 99816719cd0SHui Xie _LIBCPP_HIDE_FROM_ABI constexpr 99916719cd0SHui Xie explicit(!_BothImplicitlyConvertible<pair<_U1, _U2>&>::value) 100016719cd0SHui Xie tuple(pair<_U1, _U2>& __p) : __base_(__p) {} 100116719cd0SHui Xie 100216719cd0SHui Xie template <class _Alloc, class _U1, class _U2, enable_if_t< 100316719cd0SHui Xie _EnableCtorFromPair<std::pair<_U1, _U2>&>::value>* = nullptr> 100416719cd0SHui Xie _LIBCPP_HIDE_FROM_ABI constexpr 100516719cd0SHui Xie explicit(!_BothImplicitlyConvertible<pair<_U1, _U2>&>::value) 100616719cd0SHui Xie tuple(allocator_arg_t, const _Alloc& __alloc, pair<_U1, _U2>& __p) : __base_(allocator_arg_t(), __alloc, __p) {} 100716719cd0SHui Xie#endif 100816719cd0SHui Xie 100916719cd0SHui Xie // tuple(pair<U1, U2>&&) constructors (including allocator_arg_t variants) 1010a3ab5120SLouis Dionne 1011b4e88d4dSLouis Dionne template <class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t< 1012a3ab5120SLouis Dionne _And< 101316719cd0SHui Xie _EnableCtorFromPair<pair<_Up1, _Up2>&&>, 101416719cd0SHui Xie _BothImplicitlyConvertible<pair<_Up1, _Up2>&&> // explicit check 1015a3ab5120SLouis Dionne >::value 1016a3ab5120SLouis Dionne , int> = 0> 1017ef89e8caSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1018a3ab5120SLouis Dionne tuple(pair<_Up1, _Up2>&& __p) 101916719cd0SHui Xie _NOEXCEPT_((_NothrowConstructibleFromPair<pair<_Up1, _Up2>&&>::value)) 1020a3ab5120SLouis Dionne : __base_(_VSTD::move(__p)) 1021a3ab5120SLouis Dionne { } 1022a3ab5120SLouis Dionne 1023b4e88d4dSLouis Dionne template <class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t< 1024a3ab5120SLouis Dionne _And< 102516719cd0SHui Xie _EnableCtorFromPair<pair<_Up1, _Up2>&&>, 102616719cd0SHui Xie _Not<_BothImplicitlyConvertible<pair<_Up1, _Up2>&&> > // explicit check 1027a3ab5120SLouis Dionne >::value 1028a3ab5120SLouis Dionne , int> = 0> 1029ef89e8caSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1030a3ab5120SLouis Dionne explicit tuple(pair<_Up1, _Up2>&& __p) 103116719cd0SHui Xie _NOEXCEPT_((_NothrowConstructibleFromPair<pair<_Up1, _Up2>&&>::value)) 1032a3ab5120SLouis Dionne : __base_(_VSTD::move(__p)) 1033a3ab5120SLouis Dionne { } 1034a3ab5120SLouis Dionne 1035b4e88d4dSLouis Dionne template <class _Alloc, class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t< 1036a3ab5120SLouis Dionne _And< 103716719cd0SHui Xie _EnableCtorFromPair<pair<_Up1, _Up2>&&>, 103816719cd0SHui Xie _BothImplicitlyConvertible<pair<_Up1, _Up2>&&> // explicit check 1039a3ab5120SLouis Dionne >::value 1040a3ab5120SLouis Dionne , int> = 0> 1041a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 1042a3ab5120SLouis Dionne tuple(allocator_arg_t, const _Alloc& __a, pair<_Up1, _Up2>&& __p) 1043a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __a, _VSTD::move(__p)) 1044a3ab5120SLouis Dionne { } 1045a3ab5120SLouis Dionne 1046b4e88d4dSLouis Dionne template <class _Alloc, class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t< 1047a3ab5120SLouis Dionne _And< 104816719cd0SHui Xie _EnableCtorFromPair<pair<_Up1, _Up2>&&>, 104916719cd0SHui Xie _Not<_BothImplicitlyConvertible<pair<_Up1, _Up2>&&> > // explicit check 1050a3ab5120SLouis Dionne >::value 1051a3ab5120SLouis Dionne , int> = 0> 1052a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 1053a3ab5120SLouis Dionne explicit tuple(allocator_arg_t, const _Alloc& __a, pair<_Up1, _Up2>&& __p) 1054a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __a, _VSTD::move(__p)) 1055a3ab5120SLouis Dionne { } 10569795699aSEric Fiselier 105716719cd0SHui Xie#if _LIBCPP_STD_VER > 20 105816719cd0SHui Xie // tuple(const pair<U1, U2>&&) constructors (including allocator_arg_t variants) 105916719cd0SHui Xie 106016719cd0SHui Xie template <class _U1, class _U2, enable_if_t< 106116719cd0SHui Xie _EnableCtorFromPair<const pair<_U1, _U2>&&>::value>* = nullptr> 106216719cd0SHui Xie _LIBCPP_HIDE_FROM_ABI constexpr 106316719cd0SHui Xie explicit(!_BothImplicitlyConvertible<const pair<_U1, _U2>&&>::value) 106416719cd0SHui Xie tuple(const pair<_U1, _U2>&& __p) : __base_(std::move(__p)) {} 106516719cd0SHui Xie 106616719cd0SHui Xie template <class _Alloc, class _U1, class _U2, enable_if_t< 106716719cd0SHui Xie _EnableCtorFromPair<const pair<_U1, _U2>&&>::value>* = nullptr> 106816719cd0SHui Xie _LIBCPP_HIDE_FROM_ABI constexpr 106916719cd0SHui Xie explicit(!_BothImplicitlyConvertible<const pair<_U1, _U2>&&>::value) 107016719cd0SHui Xie tuple(allocator_arg_t, const _Alloc& __alloc, const pair<_U1, _U2>&& __p) 107116719cd0SHui Xie : __base_(allocator_arg_t(), __alloc, std::move(__p)) {} 107216719cd0SHui Xie#endif // _LIBCPP_STD_VER > 20 107316719cd0SHui Xie 1074a0839b14SLouis Dionne // [tuple.assign] 107506e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 1076a0839b14SLouis Dionne tuple& operator=(_If<_And<is_copy_assignable<_Tp>...>::value, tuple, __nat> const& __tuple) 1077a0839b14SLouis Dionne _NOEXCEPT_((_And<is_nothrow_copy_assignable<_Tp>...>::value)) 1078aedcbf89SEric Fiselier { 1079a0839b14SLouis Dionne _VSTD::__memberwise_copy_assign(*this, __tuple, 1080a0839b14SLouis Dionne typename __make_tuple_indices<sizeof...(_Tp)>::type()); 1081aedcbf89SEric Fiselier return *this; 1082aedcbf89SEric Fiselier } 1083aedcbf89SEric Fiselier 108416719cd0SHui Xie#if _LIBCPP_STD_VER > 20 108516719cd0SHui Xie _LIBCPP_HIDE_FROM_ABI constexpr 108616719cd0SHui Xie const tuple& operator=(tuple const& __tuple) const 108716719cd0SHui Xie requires (_And<is_copy_assignable<const _Tp>...>::value) { 108816719cd0SHui Xie std::__memberwise_copy_assign(*this, __tuple, typename __make_tuple_indices<sizeof...(_Tp)>::type()); 108916719cd0SHui Xie return *this; 109016719cd0SHui Xie } 109116719cd0SHui Xie 109216719cd0SHui Xie _LIBCPP_HIDE_FROM_ABI constexpr 109316719cd0SHui Xie const tuple& operator=(tuple&& __tuple) const 109416719cd0SHui Xie requires (_And<is_assignable<const _Tp&, _Tp>...>::value) { 109516719cd0SHui Xie std::__memberwise_forward_assign(*this, 109616719cd0SHui Xie std::move(__tuple), 109716719cd0SHui Xie __tuple_types<_Tp...>(), 109816719cd0SHui Xie typename __make_tuple_indices<sizeof...(_Tp)>::type()); 109916719cd0SHui Xie return *this; 110016719cd0SHui Xie } 110116719cd0SHui Xie#endif // _LIBCPP_STD_VER > 20 110216719cd0SHui Xie 110306e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 1104a0839b14SLouis Dionne tuple& operator=(_If<_And<is_move_assignable<_Tp>...>::value, tuple, __nat>&& __tuple) 1105a0839b14SLouis Dionne _NOEXCEPT_((_And<is_nothrow_move_assignable<_Tp>...>::value)) 1106aedcbf89SEric Fiselier { 1107a0839b14SLouis Dionne _VSTD::__memberwise_forward_assign(*this, _VSTD::move(__tuple), 1108a0839b14SLouis Dionne __tuple_types<_Tp...>(), 1109a0839b14SLouis Dionne typename __make_tuple_indices<sizeof...(_Tp)>::type()); 1110aedcbf89SEric Fiselier return *this; 1111aedcbf89SEric Fiselier } 1112aedcbf89SEric Fiselier 1113b4e88d4dSLouis Dionne template<class... _Up, __enable_if_t< 1114a0839b14SLouis Dionne _And< 1115a0839b14SLouis Dionne _BoolConstant<sizeof...(_Tp) == sizeof...(_Up)>, 1116a0839b14SLouis Dionne is_assignable<_Tp&, _Up const&>... 1117a0839b14SLouis Dionne >::value 1118a0839b14SLouis Dionne ,int> = 0> 111906e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 1120a0839b14SLouis Dionne tuple& operator=(tuple<_Up...> const& __tuple) 1121a0839b14SLouis Dionne _NOEXCEPT_((_And<is_nothrow_assignable<_Tp&, _Up const&>...>::value)) 11223e519524SHoward Hinnant { 1123a0839b14SLouis Dionne _VSTD::__memberwise_copy_assign(*this, __tuple, 1124a0839b14SLouis Dionne typename __make_tuple_indices<sizeof...(_Tp)>::type()); 11253e519524SHoward Hinnant return *this; 11263e519524SHoward Hinnant } 11273e519524SHoward Hinnant 1128b4e88d4dSLouis Dionne template<class... _Up, __enable_if_t< 1129a0839b14SLouis Dionne _And< 1130a0839b14SLouis Dionne _BoolConstant<sizeof...(_Tp) == sizeof...(_Up)>, 1131a0839b14SLouis Dionne is_assignable<_Tp&, _Up>... 1132a0839b14SLouis Dionne >::value 1133a0839b14SLouis Dionne ,int> = 0> 113406e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 1135a0839b14SLouis Dionne tuple& operator=(tuple<_Up...>&& __tuple) 1136a0839b14SLouis Dionne _NOEXCEPT_((_And<is_nothrow_assignable<_Tp&, _Up>...>::value)) 1137a0839b14SLouis Dionne { 1138a0839b14SLouis Dionne _VSTD::__memberwise_forward_assign(*this, _VSTD::move(__tuple), 1139a0839b14SLouis Dionne __tuple_types<_Up...>(), 1140a0839b14SLouis Dionne typename __make_tuple_indices<sizeof...(_Tp)>::type()); 1141a0839b14SLouis Dionne return *this; 1142a0839b14SLouis Dionne } 1143a0839b14SLouis Dionne 114416719cd0SHui Xie 114516719cd0SHui Xie#if _LIBCPP_STD_VER > 20 114616719cd0SHui Xie template <class... _UTypes, enable_if_t< 114716719cd0SHui Xie _And<_BoolConstant<sizeof...(_Tp) == sizeof...(_UTypes)>, 114816719cd0SHui Xie is_assignable<const _Tp&, const _UTypes&>...>::value>* = nullptr> 114916719cd0SHui Xie _LIBCPP_HIDE_FROM_ABI constexpr 115016719cd0SHui Xie const tuple& operator=(const tuple<_UTypes...>& __u) const { 115116719cd0SHui Xie std::__memberwise_copy_assign(*this, 115216719cd0SHui Xie __u, 115316719cd0SHui Xie typename __make_tuple_indices<sizeof...(_Tp)>::type()); 115416719cd0SHui Xie return *this; 115516719cd0SHui Xie } 115616719cd0SHui Xie 115716719cd0SHui Xie template <class... _UTypes, enable_if_t< 115816719cd0SHui Xie _And<_BoolConstant<sizeof...(_Tp) == sizeof...(_UTypes)>, 115916719cd0SHui Xie is_assignable<const _Tp&, _UTypes>...>::value>* = nullptr> 116016719cd0SHui Xie _LIBCPP_HIDE_FROM_ABI constexpr 116116719cd0SHui Xie const tuple& operator=(tuple<_UTypes...>&& __u) const { 116216719cd0SHui Xie std::__memberwise_forward_assign(*this, 116316719cd0SHui Xie __u, 116416719cd0SHui Xie __tuple_types<_UTypes...>(), 116516719cd0SHui Xie typename __make_tuple_indices<sizeof...(_Tp)>::type()); 116616719cd0SHui Xie return *this; 116716719cd0SHui Xie } 116816719cd0SHui Xie#endif // _LIBCPP_STD_VER > 20 116916719cd0SHui Xie 117016719cd0SHui Xie template <template<class...> class Pred, bool _Const, 117116719cd0SHui Xie class _Pair, class _DecayedPair = __uncvref_t<_Pair>, class _Tuple = tuple> 117216719cd0SHui Xie struct _AssignPredicateFromPair : false_type {}; 117316719cd0SHui Xie 117416719cd0SHui Xie template <template<class...> class Pred, bool _Const, 117516719cd0SHui Xie class _Pair, class _Up1, class _Up2, class _Tp1, class _Tp2> 117616719cd0SHui Xie struct _AssignPredicateFromPair<Pred, _Const, _Pair, pair<_Up1, _Up2>, tuple<_Tp1, _Tp2> > : 117716719cd0SHui Xie _And<Pred<__maybe_const<_Const, _Tp1>&, __copy_cvref_t<_Pair, _Up1> >, 117816719cd0SHui Xie Pred<__maybe_const<_Const, _Tp2>&, __copy_cvref_t<_Pair, _Up2> > 117916719cd0SHui Xie > {}; 118016719cd0SHui Xie 118116719cd0SHui Xie template <bool _Const, class _Pair> 118216719cd0SHui Xie struct _EnableAssignFromPair : _AssignPredicateFromPair<is_assignable, _Const, _Pair> {}; 118316719cd0SHui Xie 118416719cd0SHui Xie template <bool _Const, class _Pair> 118516719cd0SHui Xie struct _NothrowAssignFromPair : _AssignPredicateFromPair<is_nothrow_assignable, _Const, _Pair> {}; 118616719cd0SHui Xie 118716719cd0SHui Xie#if _LIBCPP_STD_VER > 20 118816719cd0SHui Xie template <class _U1, class _U2, enable_if_t< 118916719cd0SHui Xie _EnableAssignFromPair<true, const pair<_U1, _U2>&>::value>* = nullptr> 119016719cd0SHui Xie _LIBCPP_HIDE_FROM_ABI constexpr 119116719cd0SHui Xie const tuple& operator=(const pair<_U1, _U2>& __pair) const 119216719cd0SHui Xie noexcept(_NothrowAssignFromPair<true, const pair<_U1, _U2>&>::value) { 119316719cd0SHui Xie std::get<0>(*this) = __pair.first; 119416719cd0SHui Xie std::get<1>(*this) = __pair.second; 119516719cd0SHui Xie return *this; 119616719cd0SHui Xie } 119716719cd0SHui Xie 119816719cd0SHui Xie template <class _U1, class _U2, enable_if_t< 119916719cd0SHui Xie _EnableAssignFromPair<true, pair<_U1, _U2>&&>::value>* = nullptr> 120016719cd0SHui Xie _LIBCPP_HIDE_FROM_ABI constexpr 120116719cd0SHui Xie const tuple& operator=(pair<_U1, _U2>&& __pair) const 120216719cd0SHui Xie noexcept(_NothrowAssignFromPair<true, pair<_U1, _U2>&&>::value) { 120316719cd0SHui Xie std::get<0>(*this) = std::move(__pair.first); 120416719cd0SHui Xie std::get<1>(*this) = std::move(__pair.second); 120516719cd0SHui Xie return *this; 120616719cd0SHui Xie } 120716719cd0SHui Xie#endif // _LIBCPP_STD_VER > 20 120816719cd0SHui Xie 120916719cd0SHui Xie template<class _Up1, class _Up2, __enable_if_t< 121016719cd0SHui Xie _EnableAssignFromPair<false, pair<_Up1, _Up2> const&>::value 1211a0839b14SLouis Dionne ,int> = 0> 121206e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 1213a0839b14SLouis Dionne tuple& operator=(pair<_Up1, _Up2> const& __pair) 121416719cd0SHui Xie _NOEXCEPT_((_NothrowAssignFromPair<false, pair<_Up1, _Up2> const&>::value)) 1215a0839b14SLouis Dionne { 1216a0839b14SLouis Dionne _VSTD::get<0>(*this) = __pair.first; 1217a0839b14SLouis Dionne _VSTD::get<1>(*this) = __pair.second; 1218a0839b14SLouis Dionne return *this; 1219a0839b14SLouis Dionne } 1220a0839b14SLouis Dionne 122116719cd0SHui Xie template<class _Up1, class _Up2, __enable_if_t< 122216719cd0SHui Xie _EnableAssignFromPair<false, pair<_Up1, _Up2>&&>::value 1223a0839b14SLouis Dionne ,int> = 0> 122406e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 1225a0839b14SLouis Dionne tuple& operator=(pair<_Up1, _Up2>&& __pair) 122616719cd0SHui Xie _NOEXCEPT_((_NothrowAssignFromPair<false, pair<_Up1, _Up2>&&>::value)) 1227a0839b14SLouis Dionne { 1228618862e8SLouis Dionne _VSTD::get<0>(*this) = _VSTD::forward<_Up1>(__pair.first); 1229618862e8SLouis Dionne _VSTD::get<1>(*this) = _VSTD::forward<_Up2>(__pair.second); 1230a0839b14SLouis Dionne return *this; 1231a0839b14SLouis Dionne } 1232a0839b14SLouis Dionne 1233a0839b14SLouis Dionne // EXTENSION 1234b4e88d4dSLouis Dionne template<class _Up, size_t _Np, class = __enable_if_t< 1235a0839b14SLouis Dionne _And< 1236a0839b14SLouis Dionne _BoolConstant<_Np == sizeof...(_Tp)>, 1237a0839b14SLouis Dionne is_assignable<_Tp&, _Up const&>... 1238a0839b14SLouis Dionne >::value 1239a0839b14SLouis Dionne > > 124006e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 1241a0839b14SLouis Dionne tuple& operator=(array<_Up, _Np> const& __array) 1242a0839b14SLouis Dionne _NOEXCEPT_((_And<is_nothrow_assignable<_Tp&, _Up const&>...>::value)) 1243a0839b14SLouis Dionne { 1244a0839b14SLouis Dionne _VSTD::__memberwise_copy_assign(*this, __array, 1245a0839b14SLouis Dionne typename __make_tuple_indices<sizeof...(_Tp)>::type()); 1246a0839b14SLouis Dionne return *this; 1247a0839b14SLouis Dionne } 1248a0839b14SLouis Dionne 1249a0839b14SLouis Dionne // EXTENSION 1250b4e88d4dSLouis Dionne template<class _Up, size_t _Np, class = void, class = __enable_if_t< 1251a0839b14SLouis Dionne _And< 1252a0839b14SLouis Dionne _BoolConstant<_Np == sizeof...(_Tp)>, 1253a0839b14SLouis Dionne is_assignable<_Tp&, _Up>... 1254a0839b14SLouis Dionne >::value 1255a0839b14SLouis Dionne > > 125606e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 1257a0839b14SLouis Dionne tuple& operator=(array<_Up, _Np>&& __array) 1258a0839b14SLouis Dionne _NOEXCEPT_((_And<is_nothrow_assignable<_Tp&, _Up>...>::value)) 1259a0839b14SLouis Dionne { 1260a0839b14SLouis Dionne _VSTD::__memberwise_forward_assign(*this, _VSTD::move(__array), 1261a0839b14SLouis Dionne __tuple_types<_If<true, _Up, _Tp>...>(), 1262a0839b14SLouis Dionne typename __make_tuple_indices<sizeof...(_Tp)>::type()); 1263a0839b14SLouis Dionne return *this; 1264a0839b14SLouis Dionne } 1265a0839b14SLouis Dionne 1266a0839b14SLouis Dionne // [tuple.swap] 126706e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 126827d0a2a7SHoward Hinnant void swap(tuple& __t) _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value) 1269def3c375SEric Fiselier {__base_.swap(__t.__base_);} 127016719cd0SHui Xie 127116719cd0SHui Xie#if _LIBCPP_STD_VER > 20 127216719cd0SHui Xie _LIBCPP_HIDE_FROM_ABI constexpr 127316719cd0SHui Xie void swap(const tuple& __t) const noexcept(__all<is_nothrow_swappable_v<const _Tp&>...>::value) { 127416719cd0SHui Xie __base_.swap(__t.__base_); 127516719cd0SHui Xie } 127616719cd0SHui Xie#endif // _LIBCPP_STD_VER > 20 12773e519524SHoward Hinnant}; 12783e519524SHoward Hinnant 12793e519524SHoward Hinnanttemplate <> 1280e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS tuple<> 12813e519524SHoward Hinnant{ 12823e519524SHoward Hinnantpublic: 128306e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY constexpr 128406e2b737SArthur O'Dwyer tuple() _NOEXCEPT = default; 12853e519524SHoward Hinnant template <class _Alloc> 128606e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 12878a9ee148SHoward Hinnant tuple(allocator_arg_t, const _Alloc&) _NOEXCEPT {} 12883e519524SHoward Hinnant template <class _Alloc> 128906e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 12908a9ee148SHoward Hinnant tuple(allocator_arg_t, const _Alloc&, const tuple&) _NOEXCEPT {} 1291c003db1fSHoward Hinnant template <class _Up> 129206e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 12938a9ee148SHoward Hinnant tuple(array<_Up, 0>) _NOEXCEPT {} 1294c003db1fSHoward Hinnant template <class _Alloc, class _Up> 129506e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 12968a9ee148SHoward Hinnant tuple(allocator_arg_t, const _Alloc&, array<_Up, 0>) _NOEXCEPT {} 129706e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 129827d0a2a7SHoward Hinnant void swap(tuple&) _NOEXCEPT {} 129916719cd0SHui Xie#if _LIBCPP_STD_VER > 20 130016719cd0SHui Xie _LIBCPP_HIDE_FROM_ABI constexpr void swap(const tuple&) const noexcept {} 130116719cd0SHui Xie#endif 13023e519524SHoward Hinnant}; 13033e519524SHoward Hinnant 1304d2baefaeSJoe Loser#if _LIBCPP_STD_VER > 20 1305311207bbSNikolas Klausertemplate <class... _TTypes, class... _UTypes, template<class> class _TQual, template<class> class _UQual> 1306311207bbSNikolas Klauser requires requires { typename tuple<common_reference_t<_TQual<_TTypes>, _UQual<_UTypes>>...>; } 1307311207bbSNikolas Klauserstruct basic_common_reference<tuple<_TTypes...>, tuple<_UTypes...>, _TQual, _UQual> { 1308311207bbSNikolas Klauser using type = tuple<common_reference_t<_TQual<_TTypes>, _UQual<_UTypes>>...>; 1309311207bbSNikolas Klauser}; 1310311207bbSNikolas Klauser 1311311207bbSNikolas Klausertemplate <class... _TTypes, class... _UTypes> 1312311207bbSNikolas Klauser requires requires { typename tuple<common_type_t<_TTypes, _UTypes>...>; } 1313311207bbSNikolas Klauserstruct common_type<tuple<_TTypes...>, tuple<_UTypes...>> { 1314311207bbSNikolas Klauser using type = tuple<common_type_t<_TTypes, _UTypes>...>; 1315311207bbSNikolas Klauser}; 1316d2baefaeSJoe Loser#endif // _LIBCPP_STD_VER > 20 1317311207bbSNikolas Klauser 1318311207bbSNikolas Klauser#if _LIBCPP_STD_VER > 14 13191308011eSLouis Dionnetemplate <class ..._Tp> 13201308011eSLouis Dionnetuple(_Tp...) -> tuple<_Tp...>; 13211308011eSLouis Dionnetemplate <class _Tp1, class _Tp2> 13221308011eSLouis Dionnetuple(pair<_Tp1, _Tp2>) -> tuple<_Tp1, _Tp2>; 13231308011eSLouis Dionnetemplate <class _Alloc, class ..._Tp> 13241308011eSLouis Dionnetuple(allocator_arg_t, _Alloc, _Tp...) -> tuple<_Tp...>; 13251308011eSLouis Dionnetemplate <class _Alloc, class _Tp1, class _Tp2> 13261308011eSLouis Dionnetuple(allocator_arg_t, _Alloc, pair<_Tp1, _Tp2>) -> tuple<_Tp1, _Tp2>; 13271308011eSLouis Dionnetemplate <class _Alloc, class ..._Tp> 13281308011eSLouis Dionnetuple(allocator_arg_t, _Alloc, tuple<_Tp...>) -> tuple<_Tp...>; 1329baaee206SEric Fiselier#endif 1330baaee206SEric Fiselier 13313e519524SHoward Hinnanttemplate <class ..._Tp> 133206e2b737SArthur O'Dwyerinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 1333*4887d047SNikolas Klauser__enable_if_t<__all<__is_swappable<_Tp>::value...>::value, void> 133427d0a2a7SHoward Hinnantswap(tuple<_Tp...>& __t, tuple<_Tp...>& __u) 133527d0a2a7SHoward Hinnant _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value) 133627d0a2a7SHoward Hinnant {__t.swap(__u);} 13373e519524SHoward Hinnant 133816719cd0SHui Xie#if _LIBCPP_STD_VER > 20 133916719cd0SHui Xietemplate <class... _Tp> 134016719cd0SHui Xie_LIBCPP_HIDE_FROM_ABI constexpr 134116719cd0SHui Xieenable_if_t<__all<is_swappable_v<const _Tp>...>::value, void> 134216719cd0SHui Xieswap(const tuple<_Tp...>& __lhs, const tuple<_Tp...>& __rhs) 134316719cd0SHui Xie noexcept(__all<is_nothrow_swappable_v<const _Tp>...>::value) { 134416719cd0SHui Xie __lhs.swap(__rhs); 134516719cd0SHui Xie} 134616719cd0SHui Xie#endif 134716719cd0SHui Xie 13483e519524SHoward Hinnant// get 13493e519524SHoward Hinnant 13503e519524SHoward Hinnanttemplate <size_t _Ip, class ..._Tp> 13518bf1f08aSMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 13523e519524SHoward Hinnanttypename tuple_element<_Ip, tuple<_Tp...> >::type& 1353c206366fSHoward Hinnantget(tuple<_Tp...>& __t) _NOEXCEPT 13543e519524SHoward Hinnant{ 13553557c7c1SLouis Dionne typedef _LIBCPP_NODEBUG typename tuple_element<_Ip, tuple<_Tp...> >::type type; 1356def3c375SEric Fiselier return static_cast<__tuple_leaf<_Ip, type>&>(__t.__base_).get(); 13573e519524SHoward Hinnant} 13583e519524SHoward Hinnant 13593e519524SHoward Hinnanttemplate <size_t _Ip, class ..._Tp> 13608bf1f08aSMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 13613e519524SHoward Hinnantconst typename tuple_element<_Ip, tuple<_Tp...> >::type& 1362c206366fSHoward Hinnantget(const tuple<_Tp...>& __t) _NOEXCEPT 13633e519524SHoward Hinnant{ 13643557c7c1SLouis Dionne typedef _LIBCPP_NODEBUG typename tuple_element<_Ip, tuple<_Tp...> >::type type; 1365def3c375SEric Fiselier return static_cast<const __tuple_leaf<_Ip, type>&>(__t.__base_).get(); 13663e519524SHoward Hinnant} 13673e519524SHoward Hinnant 1368601afb30SHoward Hinnanttemplate <size_t _Ip, class ..._Tp> 13698bf1f08aSMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1370601afb30SHoward Hinnanttypename tuple_element<_Ip, tuple<_Tp...> >::type&& 1371c206366fSHoward Hinnantget(tuple<_Tp...>&& __t) _NOEXCEPT 1372601afb30SHoward Hinnant{ 13733557c7c1SLouis Dionne typedef _LIBCPP_NODEBUG typename tuple_element<_Ip, tuple<_Tp...> >::type type; 13742a3f1bc1SHoward Hinnant return static_cast<type&&>( 1375def3c375SEric Fiselier static_cast<__tuple_leaf<_Ip, type>&&>(__t.__base_).get()); 1376601afb30SHoward Hinnant} 1377601afb30SHoward Hinnant 1378545b8861SEric Fiseliertemplate <size_t _Ip, class ..._Tp> 1379545b8861SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1380545b8861SEric Fiselierconst typename tuple_element<_Ip, tuple<_Tp...> >::type&& 1381545b8861SEric Fiselierget(const tuple<_Tp...>&& __t) _NOEXCEPT 1382545b8861SEric Fiselier{ 13833557c7c1SLouis Dionne typedef _LIBCPP_NODEBUG typename tuple_element<_Ip, tuple<_Tp...> >::type type; 1384545b8861SEric Fiselier return static_cast<const type&&>( 1385def3c375SEric Fiselier static_cast<const __tuple_leaf<_Ip, type>&&>(__t.__base_).get()); 1386545b8861SEric Fiselier} 1387545b8861SEric Fiselier 1388e99520c7SMarshall Clow#if _LIBCPP_STD_VER > 11 1389e99520c7SMarshall Clow 1390f447e62eSEric Fiseliernamespace __find_detail { 1391f447e62eSEric Fiselier 1392f86570cdSLouis Dionnestatic constexpr size_t __not_found = static_cast<size_t>(-1); 1393f447e62eSEric Fiselierstatic constexpr size_t __ambiguous = __not_found - 1; 1394f447e62eSEric Fiselier 1395f447e62eSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 1396f447e62eSEric Fiselierconstexpr size_t __find_idx_return(size_t __curr_i, size_t __res, bool __matches) { 1397f447e62eSEric Fiselier return !__matches ? __res : 1398f447e62eSEric Fiselier (__res == __not_found ? __curr_i : __ambiguous); 1399f447e62eSEric Fiselier} 1400f447e62eSEric Fiselier 1401f447e62eSEric Fiseliertemplate <size_t _Nx> 1402f447e62eSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 1403f447e62eSEric Fiselierconstexpr size_t __find_idx(size_t __i, const bool (&__matches)[_Nx]) { 1404f447e62eSEric Fiselier return __i == _Nx ? __not_found : 1405f447e62eSEric Fiselier __find_idx_return(__i, __find_idx(__i + 1, __matches), __matches[__i]); 1406f447e62eSEric Fiselier} 1407f447e62eSEric Fiselier 1408f447e62eSEric Fiseliertemplate <class _T1, class ..._Args> 1409f447e62eSEric Fiselierstruct __find_exactly_one_checked { 141000c872f3SCasey Carter static constexpr bool __matches[sizeof...(_Args)] = {is_same<_T1, _Args>::value...}; 1411f447e62eSEric Fiselier static constexpr size_t value = __find_detail::__find_idx(0, __matches); 1412f447e62eSEric Fiselier static_assert(value != __not_found, "type not found in type list" ); 1413f447e62eSEric Fiselier static_assert(value != __ambiguous, "type occurs more than once in type list"); 1414e99520c7SMarshall Clow}; 1415e99520c7SMarshall Clow 14164f905b8dSEric Fiseliertemplate <class _T1> 14174f905b8dSEric Fiselierstruct __find_exactly_one_checked<_T1> { 14184f905b8dSEric Fiselier static_assert(!is_same<_T1, _T1>::value, "type not in empty type list"); 14194f905b8dSEric Fiselier}; 14204f905b8dSEric Fiselier 1421d2b0df35SNikolas Klauser} // namespace __find_detail 1422e99520c7SMarshall Clow 1423e99520c7SMarshall Clowtemplate <typename _T1, typename... _Args> 1424f447e62eSEric Fiselierstruct __find_exactly_one_t 1425f447e62eSEric Fiselier : public __find_detail::__find_exactly_one_checked<_T1, _Args...> { 1426e99520c7SMarshall Clow}; 1427e99520c7SMarshall Clow 1428e99520c7SMarshall Clowtemplate <class _T1, class... _Args> 1429e99520c7SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 1430e99520c7SMarshall Clowconstexpr _T1& get(tuple<_Args...>& __tup) noexcept 1431e99520c7SMarshall Clow{ 1432e99520c7SMarshall Clow return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(__tup); 1433e99520c7SMarshall Clow} 1434e99520c7SMarshall Clow 1435e99520c7SMarshall Clowtemplate <class _T1, class... _Args> 1436e99520c7SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 1437e99520c7SMarshall Clowconstexpr _T1 const& get(tuple<_Args...> const& __tup) noexcept 1438e99520c7SMarshall Clow{ 1439e99520c7SMarshall Clow return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(__tup); 1440e99520c7SMarshall Clow} 1441e99520c7SMarshall Clow 1442e99520c7SMarshall Clowtemplate <class _T1, class... _Args> 1443e99520c7SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 1444e99520c7SMarshall Clowconstexpr _T1&& get(tuple<_Args...>&& __tup) noexcept 1445e99520c7SMarshall Clow{ 14461c682f0fSMarshall Clow return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(_VSTD::move(__tup)); 1447e99520c7SMarshall Clow} 1448e99520c7SMarshall Clow 1449545b8861SEric Fiseliertemplate <class _T1, class... _Args> 1450545b8861SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 1451545b8861SEric Fiselierconstexpr _T1 const&& get(tuple<_Args...> const&& __tup) noexcept 1452545b8861SEric Fiselier{ 1453545b8861SEric Fiselier return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(_VSTD::move(__tup)); 1454545b8861SEric Fiselier} 1455545b8861SEric Fiselier 1456e99520c7SMarshall Clow#endif 1457e99520c7SMarshall Clow 14583e519524SHoward Hinnant// tie 14593e519524SHoward Hinnant 14603e519524SHoward Hinnanttemplate <class ..._Tp> 14610d1560e1SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 14623e519524SHoward Hinnanttuple<_Tp&...> 14638a9ee148SHoward Hinnanttie(_Tp&... __t) _NOEXCEPT 14643e519524SHoward Hinnant{ 14653e519524SHoward Hinnant return tuple<_Tp&...>(__t...); 14663e519524SHoward Hinnant} 14673e519524SHoward Hinnant 14683e519524SHoward Hinnanttemplate <class _Up> 14693e519524SHoward Hinnantstruct __ignore_t 14703e519524SHoward Hinnant{ 14713e519524SHoward Hinnant template <class _Tp> 14729af60c4aSEric Fiselier _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 14733e519524SHoward Hinnant const __ignore_t& operator=(_Tp&&) const {return *this;} 14743e519524SHoward Hinnant}; 14753e519524SHoward Hinnant 14769af60c4aSEric Fiseliernamespace { 1477cb793e1aSLouis Dionne constexpr __ignore_t<unsigned char> ignore = __ignore_t<unsigned char>(); 1478d2b0df35SNikolas Klauser} // namespace 14793e519524SHoward Hinnant 14803e519524SHoward Hinnanttemplate <class... _Tp> 148175eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1482bb9ca6d0SLouis Dionnetuple<typename __unwrap_ref_decay<_Tp>::type...> 14833e519524SHoward Hinnantmake_tuple(_Tp&&... __t) 14843e519524SHoward Hinnant{ 1485bb9ca6d0SLouis Dionne return tuple<typename __unwrap_ref_decay<_Tp>::type...>(_VSTD::forward<_Tp>(__t)...); 14863e519524SHoward Hinnant} 14873e519524SHoward Hinnant 14881102fbbdSHoward Hinnanttemplate <class... _Tp> 148975eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 149075eff748SMarshall Clowtuple<_Tp&&...> 14918a9ee148SHoward Hinnantforward_as_tuple(_Tp&&... __t) _NOEXCEPT 14921102fbbdSHoward Hinnant{ 1493ce48a113SHoward Hinnant return tuple<_Tp&&...>(_VSTD::forward<_Tp>(__t)...); 14941102fbbdSHoward Hinnant} 14951102fbbdSHoward Hinnant 1496c003db1fSHoward Hinnanttemplate <size_t _Ip> 14973e519524SHoward Hinnantstruct __tuple_equal 14983e519524SHoward Hinnant{ 14993e519524SHoward Hinnant template <class _Tp, class _Up> 150075eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 15013e519524SHoward Hinnant bool operator()(const _Tp& __x, const _Up& __y) 15023e519524SHoward Hinnant { 1503f9af6140SMarshall Clow return __tuple_equal<_Ip - 1>()(__x, __y) && _VSTD::get<_Ip-1>(__x) == _VSTD::get<_Ip-1>(__y); 15043e519524SHoward Hinnant } 15053e519524SHoward Hinnant}; 15063e519524SHoward Hinnant 15073e519524SHoward Hinnanttemplate <> 15083e519524SHoward Hinnantstruct __tuple_equal<0> 15093e519524SHoward Hinnant{ 15103e519524SHoward Hinnant template <class _Tp, class _Up> 151175eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 15123e519524SHoward Hinnant bool operator()(const _Tp&, const _Up&) 15133e519524SHoward Hinnant { 15143e519524SHoward Hinnant return true; 15153e519524SHoward Hinnant } 15163e519524SHoward Hinnant}; 15173e519524SHoward Hinnant 15183e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up> 151975eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 15203e519524SHoward Hinnantbool 15213e519524SHoward Hinnantoperator==(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 15223e519524SHoward Hinnant{ 1523aa09911aSMarshall Clow static_assert (sizeof...(_Tp) == sizeof...(_Up), "Can't compare tuples of different sizes"); 15243e519524SHoward Hinnant return __tuple_equal<sizeof...(_Tp)>()(__x, __y); 15253e519524SHoward Hinnant} 15263e519524SHoward Hinnant 1527d2baefaeSJoe Loser#if _LIBCPP_STD_VER > 17 1528b80f2dfdSKent Ross 1529b80f2dfdSKent Ross// operator<=> 1530b80f2dfdSKent Ross 1531b80f2dfdSKent Rosstemplate <class ..._Tp, class ..._Up, size_t ..._Is> 1532b80f2dfdSKent Ross_LIBCPP_HIDE_FROM_ABI constexpr 1533b80f2dfdSKent Rossauto 1534b80f2dfdSKent Ross__tuple_compare_three_way(const tuple<_Tp...>& __x, const tuple<_Up...>& __y, index_sequence<_Is...>) { 1535b80f2dfdSKent Ross common_comparison_category_t<__synth_three_way_result<_Tp, _Up>...> __result = strong_ordering::equal; 1536b80f2dfdSKent Ross static_cast<void>(((__result = _VSTD::__synth_three_way(_VSTD::get<_Is>(__x), _VSTD::get<_Is>(__y)), __result != 0) || ...)); 1537b80f2dfdSKent Ross return __result; 1538b80f2dfdSKent Ross} 1539b80f2dfdSKent Ross 1540b80f2dfdSKent Rosstemplate <class ..._Tp, class ..._Up> 1541b80f2dfdSKent Rossrequires (sizeof...(_Tp) == sizeof...(_Up)) 1542b80f2dfdSKent Ross_LIBCPP_HIDE_FROM_ABI constexpr 1543b80f2dfdSKent Rosscommon_comparison_category_t<__synth_three_way_result<_Tp, _Up>...> 1544b80f2dfdSKent Rossoperator<=>(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 1545b80f2dfdSKent Ross{ 1546b80f2dfdSKent Ross return _VSTD::__tuple_compare_three_way(__x, __y, index_sequence_for<_Tp...>{}); 1547b80f2dfdSKent Ross} 1548b80f2dfdSKent Ross 1549d2baefaeSJoe Loser#else // _LIBCPP_STD_VER > 17 1550b80f2dfdSKent Ross 15513e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up> 155275eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 15533e519524SHoward Hinnantbool 15543e519524SHoward Hinnantoperator!=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 15553e519524SHoward Hinnant{ 15563e519524SHoward Hinnant return !(__x == __y); 15573e519524SHoward Hinnant} 15583e519524SHoward Hinnant 1559c003db1fSHoward Hinnanttemplate <size_t _Ip> 15603e519524SHoward Hinnantstruct __tuple_less 15613e519524SHoward Hinnant{ 15623e519524SHoward Hinnant template <class _Tp, class _Up> 156375eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 15643e519524SHoward Hinnant bool operator()(const _Tp& __x, const _Up& __y) 15653e519524SHoward Hinnant { 156653afae49SDuncan P. N. Exon Smith const size_t __idx = tuple_size<_Tp>::value - _Ip; 156753afae49SDuncan P. N. Exon Smith if (_VSTD::get<__idx>(__x) < _VSTD::get<__idx>(__y)) 156853afae49SDuncan P. N. Exon Smith return true; 156953afae49SDuncan P. N. Exon Smith if (_VSTD::get<__idx>(__y) < _VSTD::get<__idx>(__x)) 157053afae49SDuncan P. N. Exon Smith return false; 157153afae49SDuncan P. N. Exon Smith return __tuple_less<_Ip-1>()(__x, __y); 15723e519524SHoward Hinnant } 15733e519524SHoward Hinnant}; 15743e519524SHoward Hinnant 15753e519524SHoward Hinnanttemplate <> 15763e519524SHoward Hinnantstruct __tuple_less<0> 15773e519524SHoward Hinnant{ 15783e519524SHoward Hinnant template <class _Tp, class _Up> 157975eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 15803e519524SHoward Hinnant bool operator()(const _Tp&, const _Up&) 15813e519524SHoward Hinnant { 15823e519524SHoward Hinnant return false; 15833e519524SHoward Hinnant } 15843e519524SHoward Hinnant}; 15853e519524SHoward Hinnant 15863e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up> 158775eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 15883e519524SHoward Hinnantbool 15893e519524SHoward Hinnantoperator<(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 15903e519524SHoward Hinnant{ 1591aa09911aSMarshall Clow static_assert (sizeof...(_Tp) == sizeof...(_Up), "Can't compare tuples of different sizes"); 15923e519524SHoward Hinnant return __tuple_less<sizeof...(_Tp)>()(__x, __y); 15933e519524SHoward Hinnant} 15943e519524SHoward Hinnant 15953e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up> 159675eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 15973e519524SHoward Hinnantbool 15983e519524SHoward Hinnantoperator>(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 15993e519524SHoward Hinnant{ 16003e519524SHoward Hinnant return __y < __x; 16013e519524SHoward Hinnant} 16023e519524SHoward Hinnant 16033e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up> 160475eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 16053e519524SHoward Hinnantbool 16063e519524SHoward Hinnantoperator>=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 16073e519524SHoward Hinnant{ 16083e519524SHoward Hinnant return !(__x < __y); 16093e519524SHoward Hinnant} 16103e519524SHoward Hinnant 16113e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up> 161275eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 16133e519524SHoward Hinnantbool 16143e519524SHoward Hinnantoperator<=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 16153e519524SHoward Hinnant{ 16163e519524SHoward Hinnant return !(__y < __x); 16173e519524SHoward Hinnant} 16183e519524SHoward Hinnant 1619d2baefaeSJoe Loser#endif // _LIBCPP_STD_VER > 17 1620b80f2dfdSKent Ross 16213e519524SHoward Hinnant// tuple_cat 16223e519524SHoward Hinnant 16237f64810bSHoward Hinnanttemplate <class _Tp, class _Up> struct __tuple_cat_type; 16247f64810bSHoward Hinnant 16257f64810bSHoward Hinnanttemplate <class ..._Ttypes, class ..._Utypes> 16267f64810bSHoward Hinnantstruct __tuple_cat_type<tuple<_Ttypes...>, __tuple_types<_Utypes...> > 16273e519524SHoward Hinnant{ 16283557c7c1SLouis Dionne typedef _LIBCPP_NODEBUG tuple<_Ttypes..., _Utypes...> type; 16297f64810bSHoward Hinnant}; 16307f64810bSHoward Hinnant 16317f64810bSHoward Hinnanttemplate <class _ResultTuple, bool _Is_Tuple0TupleLike, class ..._Tuples> 16327f64810bSHoward Hinnantstruct __tuple_cat_return_1 16337f64810bSHoward Hinnant{ 16347f64810bSHoward Hinnant}; 16357f64810bSHoward Hinnant 16367f64810bSHoward Hinnanttemplate <class ..._Types, class _Tuple0> 16377f64810bSHoward Hinnantstruct __tuple_cat_return_1<tuple<_Types...>, true, _Tuple0> 16387f64810bSHoward Hinnant{ 1639f7558068SNikolas Klauser using type _LIBCPP_NODEBUG = typename __tuple_cat_type< 1640f7558068SNikolas Klauser tuple<_Types...>, 1641f7558068SNikolas Klauser typename __make_tuple_types<__uncvref_t<_Tuple0> >::type 1642f7558068SNikolas Klauser >::type; 16437f64810bSHoward Hinnant}; 16447f64810bSHoward Hinnant 16457f64810bSHoward Hinnanttemplate <class ..._Types, class _Tuple0, class _Tuple1, class ..._Tuples> 16467f64810bSHoward Hinnantstruct __tuple_cat_return_1<tuple<_Types...>, true, _Tuple0, _Tuple1, _Tuples...> 16477f64810bSHoward Hinnant : public __tuple_cat_return_1< 16487f64810bSHoward Hinnant typename __tuple_cat_type< 16497f64810bSHoward Hinnant tuple<_Types...>, 1650f7558068SNikolas Klauser typename __make_tuple_types<__uncvref_t<_Tuple0> >::type 16517f64810bSHoward Hinnant >::type, 16527f64810bSHoward Hinnant __tuple_like<typename remove_reference<_Tuple1>::type>::value, 16537f64810bSHoward Hinnant _Tuple1, _Tuples...> 16547f64810bSHoward Hinnant{ 16557f64810bSHoward Hinnant}; 16567f64810bSHoward Hinnant 16577f64810bSHoward Hinnanttemplate <class ..._Tuples> struct __tuple_cat_return; 16587f64810bSHoward Hinnant 16597f64810bSHoward Hinnanttemplate <class _Tuple0, class ..._Tuples> 16607f64810bSHoward Hinnantstruct __tuple_cat_return<_Tuple0, _Tuples...> 16617f64810bSHoward Hinnant : public __tuple_cat_return_1<tuple<>, 16627f64810bSHoward Hinnant __tuple_like<typename remove_reference<_Tuple0>::type>::value, _Tuple0, 16637f64810bSHoward Hinnant _Tuples...> 16647f64810bSHoward Hinnant{ 16657f64810bSHoward Hinnant}; 16667f64810bSHoward Hinnant 16677f64810bSHoward Hinnanttemplate <> 16687f64810bSHoward Hinnantstruct __tuple_cat_return<> 16697f64810bSHoward Hinnant{ 16703557c7c1SLouis Dionne typedef _LIBCPP_NODEBUG tuple<> type; 16717f64810bSHoward Hinnant}; 16727f64810bSHoward Hinnant 167375eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 16747f64810bSHoward Hinnanttuple<> 16757f64810bSHoward Hinnanttuple_cat() 16767f64810bSHoward Hinnant{ 16777f64810bSHoward Hinnant return tuple<>(); 16783e519524SHoward Hinnant} 16793e519524SHoward Hinnant 1680c003db1fSHoward Hinnanttemplate <class _Rp, class _Indices, class _Tuple0, class ..._Tuples> 1681ba31cbdbSHoward Hinnantstruct __tuple_cat_return_ref_imp; 16823e519524SHoward Hinnant 1683ba31cbdbSHoward Hinnanttemplate <class ..._Types, size_t ..._I0, class _Tuple0> 1684ba31cbdbSHoward Hinnantstruct __tuple_cat_return_ref_imp<tuple<_Types...>, __tuple_indices<_I0...>, _Tuple0> 16853e519524SHoward Hinnant{ 16863557c7c1SLouis Dionne typedef _LIBCPP_NODEBUG typename remove_reference<_Tuple0>::type _T0; 1687ba31cbdbSHoward Hinnant typedef tuple<_Types..., typename __apply_cv<_Tuple0, 1688ba31cbdbSHoward Hinnant typename tuple_element<_I0, _T0>::type>::type&&...> type; 1689ba31cbdbSHoward Hinnant}; 1690ba31cbdbSHoward Hinnant 1691ba31cbdbSHoward Hinnanttemplate <class ..._Types, size_t ..._I0, class _Tuple0, class _Tuple1, class ..._Tuples> 1692ba31cbdbSHoward Hinnantstruct __tuple_cat_return_ref_imp<tuple<_Types...>, __tuple_indices<_I0...>, 1693ba31cbdbSHoward Hinnant _Tuple0, _Tuple1, _Tuples...> 1694ba31cbdbSHoward Hinnant : public __tuple_cat_return_ref_imp< 1695ba31cbdbSHoward Hinnant tuple<_Types..., typename __apply_cv<_Tuple0, 1696ba31cbdbSHoward Hinnant typename tuple_element<_I0, 1697ba31cbdbSHoward Hinnant typename remove_reference<_Tuple0>::type>::type>::type&&...>, 1698ba31cbdbSHoward Hinnant typename __make_tuple_indices<tuple_size<typename 1699ba31cbdbSHoward Hinnant remove_reference<_Tuple1>::type>::value>::type, 1700ba31cbdbSHoward Hinnant _Tuple1, _Tuples...> 1701ba31cbdbSHoward Hinnant{ 1702ba31cbdbSHoward Hinnant}; 1703ba31cbdbSHoward Hinnant 1704ba31cbdbSHoward Hinnanttemplate <class _Tuple0, class ..._Tuples> 1705ba31cbdbSHoward Hinnantstruct __tuple_cat_return_ref 1706ba31cbdbSHoward Hinnant : public __tuple_cat_return_ref_imp<tuple<>, 1707ba31cbdbSHoward Hinnant typename __make_tuple_indices< 1708ba31cbdbSHoward Hinnant tuple_size<typename remove_reference<_Tuple0>::type>::value 1709ba31cbdbSHoward Hinnant >::type, _Tuple0, _Tuples...> 1710ba31cbdbSHoward Hinnant{ 1711ba31cbdbSHoward Hinnant}; 1712ba31cbdbSHoward Hinnant 1713ba31cbdbSHoward Hinnanttemplate <class _Types, class _I0, class _J0> 1714ba31cbdbSHoward Hinnantstruct __tuple_cat; 1715ba31cbdbSHoward Hinnant 1716ba31cbdbSHoward Hinnanttemplate <class ..._Types, size_t ..._I0, size_t ..._J0> 1717ba31cbdbSHoward Hinnantstruct __tuple_cat<tuple<_Types...>, __tuple_indices<_I0...>, __tuple_indices<_J0...> > 1718ba31cbdbSHoward Hinnant{ 1719ba31cbdbSHoward Hinnant template <class _Tuple0> 172075eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1721ba31cbdbSHoward Hinnant typename __tuple_cat_return_ref<tuple<_Types...>&&, _Tuple0&&>::type 1722ba31cbdbSHoward Hinnant operator()(tuple<_Types...> __t, _Tuple0&& __t0) 1723ba31cbdbSHoward Hinnant { 1724e39095a3SLouis Dionne (void)__t; // avoid unused parameter warning on GCC when _I0 is empty 1725e658b3ebSDavid Blaikie return _VSTD::forward_as_tuple( 1726e658b3ebSDavid Blaikie _VSTD::forward<_Types>(_VSTD::get<_I0>(__t))..., 1727f9af6140SMarshall Clow _VSTD::get<_J0>(_VSTD::forward<_Tuple0>(__t0))...); 17283e519524SHoward Hinnant } 17293e519524SHoward Hinnant 17307f64810bSHoward Hinnant template <class _Tuple0, class _Tuple1, class ..._Tuples> 173175eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1732ba31cbdbSHoward Hinnant typename __tuple_cat_return_ref<tuple<_Types...>&&, _Tuple0&&, _Tuple1&&, _Tuples&&...>::type 1733ba31cbdbSHoward Hinnant operator()(tuple<_Types...> __t, _Tuple0&& __t0, _Tuple1&& __t1, _Tuples&& ...__tpls) 17343e519524SHoward Hinnant { 1735e39095a3SLouis Dionne (void)__t; // avoid unused parameter warning on GCC when _I0 is empty 17363557c7c1SLouis Dionne typedef _LIBCPP_NODEBUG typename remove_reference<_Tuple0>::type _T0; 17373557c7c1SLouis Dionne typedef _LIBCPP_NODEBUG typename remove_reference<_Tuple1>::type _T1; 1738ba31cbdbSHoward Hinnant return __tuple_cat< 1739e658b3ebSDavid Blaikie tuple<_Types..., 1740e658b3ebSDavid Blaikie typename __apply_cv<_Tuple0, typename tuple_element< 1741e658b3ebSDavid Blaikie _J0, _T0>::type>::type&&...>, 1742e658b3ebSDavid Blaikie typename __make_tuple_indices<sizeof...(_Types) + 1743e658b3ebSDavid Blaikie tuple_size<_T0>::value>::type, 1744e658b3ebSDavid Blaikie typename __make_tuple_indices<tuple_size<_T1>::value>::type>()( 1745e658b3ebSDavid Blaikie _VSTD::forward_as_tuple( 1746f9af6140SMarshall Clow _VSTD::forward<_Types>(_VSTD::get<_I0>(__t))..., 1747e658b3ebSDavid Blaikie _VSTD::get<_J0>(_VSTD::forward<_Tuple0>(__t0))...), 1748e658b3ebSDavid Blaikie _VSTD::forward<_Tuple1>(__t1), _VSTD::forward<_Tuples>(__tpls)...); 1749ba31cbdbSHoward Hinnant } 1750ba31cbdbSHoward Hinnant}; 1751ba31cbdbSHoward Hinnant 1752ba31cbdbSHoward Hinnanttemplate <class _Tuple0, class... _Tuples> 175375eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1754ba31cbdbSHoward Hinnanttypename __tuple_cat_return<_Tuple0, _Tuples...>::type 1755ba31cbdbSHoward Hinnanttuple_cat(_Tuple0&& __t0, _Tuples&&... __tpls) 1756ba31cbdbSHoward Hinnant{ 17573557c7c1SLouis Dionne typedef _LIBCPP_NODEBUG typename remove_reference<_Tuple0>::type _T0; 1758ba31cbdbSHoward Hinnant return __tuple_cat<tuple<>, __tuple_indices<>, 1759ba31cbdbSHoward Hinnant typename __make_tuple_indices<tuple_size<_T0>::value>::type>() 1760ce48a113SHoward Hinnant (tuple<>(), _VSTD::forward<_Tuple0>(__t0), 1761ce48a113SHoward Hinnant _VSTD::forward<_Tuples>(__tpls)...); 17623e519524SHoward Hinnant} 17633e519524SHoward Hinnant 17643e519524SHoward Hinnanttemplate <class ..._Tp, class _Alloc> 1765e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS uses_allocator<tuple<_Tp...>, _Alloc> 17663e519524SHoward Hinnant : true_type {}; 17673e519524SHoward Hinnant 17683e519524SHoward Hinnanttemplate <class _T1, class _T2> 17693e519524SHoward Hinnanttemplate <class... _Args1, class... _Args2, size_t ..._I1, size_t ..._I2> 1770737a4501SMichael Schellenberger Costainline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 17713e519524SHoward Hinnantpair<_T1, _T2>::pair(piecewise_construct_t, 17723e519524SHoward Hinnant tuple<_Args1...>& __first_args, tuple<_Args2...>& __second_args, 17733e519524SHoward Hinnant __tuple_indices<_I1...>, __tuple_indices<_I2...>) 1774f9af6140SMarshall Clow : first(_VSTD::forward<_Args1>(_VSTD::get<_I1>( __first_args))...), 1775f9af6140SMarshall Clow second(_VSTD::forward<_Args2>(_VSTD::get<_I2>(__second_args))...) 17763e519524SHoward Hinnant{ 17773e519524SHoward Hinnant} 17783e519524SHoward Hinnant 177903e29a29SEric Fiselier#if _LIBCPP_STD_VER > 14 178003e29a29SEric Fiseliertemplate <class _Tp> 1781cb793e1aSLouis Dionneinline constexpr size_t tuple_size_v = tuple_size<_Tp>::value; 178203e29a29SEric Fiselier 178303e29a29SEric Fiselier#define _LIBCPP_NOEXCEPT_RETURN(...) noexcept(noexcept(__VA_ARGS__)) { return __VA_ARGS__; } 178403e29a29SEric Fiselier 178503e29a29SEric Fiseliertemplate <class _Fn, class _Tuple, size_t ..._Id> 178603e29a29SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 178703e29a29SEric Fiselierconstexpr decltype(auto) __apply_tuple_impl(_Fn && __f, _Tuple && __t, 178803e29a29SEric Fiselier __tuple_indices<_Id...>) 178903e29a29SEric Fiselier_LIBCPP_NOEXCEPT_RETURN( 17901b9c5f60SNikolas Klauser _VSTD::__invoke( 179103e29a29SEric Fiselier _VSTD::forward<_Fn>(__f), 179203e29a29SEric Fiselier _VSTD::get<_Id>(_VSTD::forward<_Tuple>(__t))...) 179303e29a29SEric Fiselier) 179403e29a29SEric Fiselier 179503e29a29SEric Fiseliertemplate <class _Fn, class _Tuple> 179603e29a29SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 179703e29a29SEric Fiselierconstexpr decltype(auto) apply(_Fn && __f, _Tuple && __t) 179803e29a29SEric Fiselier_LIBCPP_NOEXCEPT_RETURN( 179903e29a29SEric Fiselier _VSTD::__apply_tuple_impl( 180003e29a29SEric Fiselier _VSTD::forward<_Fn>(__f), _VSTD::forward<_Tuple>(__t), 1801655c4695SMarshall Clow typename __make_tuple_indices<tuple_size_v<remove_reference_t<_Tuple>>>::type{}) 180203e29a29SEric Fiselier) 180303e29a29SEric Fiselier 180403e29a29SEric Fiseliertemplate <class _Tp, class _Tuple, size_t... _Idx> 180503e29a29SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 180603e29a29SEric Fiselierconstexpr _Tp __make_from_tuple_impl(_Tuple&& __t, __tuple_indices<_Idx...>) 180703e29a29SEric Fiselier_LIBCPP_NOEXCEPT_RETURN( 180803e29a29SEric Fiselier _Tp(_VSTD::get<_Idx>(_VSTD::forward<_Tuple>(__t))...) 180903e29a29SEric Fiselier) 181003e29a29SEric Fiselier 181103e29a29SEric Fiseliertemplate <class _Tp, class _Tuple> 181203e29a29SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 181303e29a29SEric Fiselierconstexpr _Tp make_from_tuple(_Tuple&& __t) 181403e29a29SEric Fiselier_LIBCPP_NOEXCEPT_RETURN( 181503e29a29SEric Fiselier _VSTD::__make_from_tuple_impl<_Tp>(_VSTD::forward<_Tuple>(__t), 1816655c4695SMarshall Clow typename __make_tuple_indices<tuple_size_v<remove_reference_t<_Tuple>>>::type{}) 181703e29a29SEric Fiselier) 181803e29a29SEric Fiselier 181903e29a29SEric Fiselier#undef _LIBCPP_NOEXCEPT_RETURN 182003e29a29SEric Fiselier 182103e29a29SEric Fiselier#endif // _LIBCPP_STD_VER > 14 182203e29a29SEric Fiselier 182329870871SEric Fiselier#endif // !defined(_LIBCPP_CXX03_LANG) 182429870871SEric Fiselier 18253e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 18263e519524SHoward Hinnant 18273e519524SHoward Hinnant#endif // _LIBCPP_TUPLE 1828