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; 283e519524SHoward Hinnant template <class... U> 29e35c5121SLouis Dionne explicit(see-below) tuple(const tuple<U...>&); // constexpr in C++14 303e519524SHoward Hinnant template <class... U> 31e35c5121SLouis Dionne explicit(see-below) tuple(tuple<U...>&&); // constexpr in C++14 323e519524SHoward Hinnant template <class U1, class U2> 33e35c5121SLouis Dionne explicit(see-below) tuple(const pair<U1, U2>&); // iff sizeof...(T) == 2 // constexpr in C++14 343e519524SHoward Hinnant template <class U1, class U2> 35e35c5121SLouis Dionne explicit(see-below) tuple(pair<U1, U2>&&); // iff sizeof...(T) == 2 // constexpr in C++14 363e519524SHoward Hinnant 373e519524SHoward Hinnant // allocator-extended constructors 383e519524SHoward Hinnant template <class Alloc> 393e519524SHoward Hinnant tuple(allocator_arg_t, const Alloc& a); 403e519524SHoward Hinnant template <class Alloc> 4106e2b737SArthur O'Dwyer explicit(see-below) tuple(allocator_arg_t, const Alloc& a, const T&...); // constexpr in C++20 423e519524SHoward Hinnant template <class Alloc, class... U> 4306e2b737SArthur O'Dwyer explicit(see-below) tuple(allocator_arg_t, const Alloc& a, U&&...); // constexpr in C++20 443e519524SHoward Hinnant template <class Alloc> 4506e2b737SArthur O'Dwyer tuple(allocator_arg_t, const Alloc& a, const tuple&); // constexpr in C++20 463e519524SHoward Hinnant template <class Alloc> 4706e2b737SArthur O'Dwyer tuple(allocator_arg_t, const Alloc& a, tuple&&); // constexpr in C++20 483e519524SHoward Hinnant template <class Alloc, class... U> 4906e2b737SArthur O'Dwyer explicit(see-below) tuple(allocator_arg_t, const Alloc& a, const tuple<U...>&); // constexpr in C++20 503e519524SHoward Hinnant template <class Alloc, class... U> 5106e2b737SArthur O'Dwyer explicit(see-below) tuple(allocator_arg_t, const Alloc& a, tuple<U...>&&); // constexpr in C++20 523e519524SHoward Hinnant template <class Alloc, class U1, class U2> 5306e2b737SArthur O'Dwyer explicit(see-below) tuple(allocator_arg_t, const Alloc& a, const pair<U1, U2>&); // constexpr in C++20 543e519524SHoward Hinnant template <class Alloc, class U1, class U2> 5506e2b737SArthur O'Dwyer explicit(see-below) tuple(allocator_arg_t, const Alloc& a, pair<U1, U2>&&); // constexpr in C++20 563e519524SHoward Hinnant 5706e2b737SArthur O'Dwyer tuple& operator=(const tuple&); // constexpr in C++20 5806e2b737SArthur O'Dwyer tuple& operator=(tuple&&) noexcept(is_nothrow_move_assignable_v<T> && ...); // constexpr in C++20 593e519524SHoward Hinnant template <class... U> 6006e2b737SArthur O'Dwyer tuple& operator=(const tuple<U...>&); // constexpr in C++20 613e519524SHoward Hinnant template <class... U> 6206e2b737SArthur O'Dwyer tuple& operator=(tuple<U...>&&); // constexpr in C++20 633e519524SHoward Hinnant template <class U1, class U2> 6406e2b737SArthur O'Dwyer tuple& operator=(const pair<U1, U2>&); // iff sizeof...(T) == 2 // constexpr in C++20 653e519524SHoward Hinnant template <class U1, class U2> 6606e2b737SArthur O'Dwyer tuple& operator=(pair<U1, U2>&&); // iff sizeof...(T) == 2 // constexpr in C++20 673e519524SHoward Hinnant 68a0839b14SLouis Dionne template<class U, size_t N> 69a0839b14SLouis Dionne tuple& operator=(array<U, N> const&) // iff sizeof...(T) == N, EXTENSION 70a0839b14SLouis Dionne template<class U, size_t N> 71a0839b14SLouis Dionne tuple& operator=(array<U, N>&&) // iff sizeof...(T) == N, EXTENSION 72a0839b14SLouis Dionne 7306e2b737SArthur O'Dwyer void swap(tuple&) noexcept(AND(swap(declval<T&>(), declval<T&>())...)); // constexpr in C++20 743e519524SHoward Hinnant}; 753e519524SHoward Hinnant 76311207bbSNikolas Klauser 77311207bbSNikolas Klausertemplate<class... TTypes, class... UTypes, template<class> class TQual, template<class> class UQual> // since C++23 78311207bbSNikolas Klauser requires requires { typename tuple<common_reference_t<TQual<TTypes>, UQual<UTypes>>...>; } 79311207bbSNikolas Klauserstruct basic_common_reference<tuple<TTypes...>, tuple<UTypes...>, TQual, UQual> { 80311207bbSNikolas Klauser using type = tuple<common_reference_t<TQual<TTypes>, UQual<UTypes>>...>; 81311207bbSNikolas Klauser}; 82311207bbSNikolas Klauser 83311207bbSNikolas Klausertemplate<class... TTypes, class... UTypes> // since C++23 84311207bbSNikolas Klauser requires requires { typename tuple<common_type_t<TTypes, UTypes>...>; } 85311207bbSNikolas Klauserstruct common_type<tuple<TTypes...>, tuple<UTypes...>> { 86311207bbSNikolas Klauser using type = tuple<common_type_t<TTypes, UTypes>...>; 87311207bbSNikolas Klauser}; 88311207bbSNikolas Klauser 891308011eSLouis Dionnetemplate <class ...T> 901308011eSLouis Dionnetuple(T...) -> tuple<T...>; // since C++17 911308011eSLouis Dionnetemplate <class T1, class T2> 921308011eSLouis Dionnetuple(pair<T1, T2>) -> tuple<T1, T2>; // since C++17 931308011eSLouis Dionnetemplate <class Alloc, class ...T> 941308011eSLouis Dionnetuple(allocator_arg_t, Alloc, T...) -> tuple<T...>; // since C++17 951308011eSLouis Dionnetemplate <class Alloc, class T1, class T2> 961308011eSLouis Dionnetuple(allocator_arg_t, Alloc, pair<T1, T2>) -> tuple<T1, T2>; // since C++17 971308011eSLouis Dionnetemplate <class Alloc, class ...T> 981308011eSLouis Dionnetuple(allocator_arg_t, Alloc, tuple<T...>) -> tuple<T...>; // since C++17 991308011eSLouis Dionne 10040a01d53SMarshall Clowinline constexpr unspecified ignore; 1013e519524SHoward Hinnant 10275eff748SMarshall Clowtemplate <class... T> tuple<V...> make_tuple(T&&...); // constexpr in C++14 103de9320aaSMarshall Clowtemplate <class... T> tuple<ATypes...> forward_as_tuple(T&&...) noexcept; // constexpr in C++14 1040d1560e1SMarshall Clowtemplate <class... T> tuple<T&...> tie(T&...) noexcept; // constexpr in C++14 10575eff748SMarshall Clowtemplate <class... Tuples> tuple<CTypes...> tuple_cat(Tuples&&... tpls); // constexpr in C++14 1063e519524SHoward Hinnant 10703e29a29SEric Fiselier// [tuple.apply], calling a function with a tuple of arguments: 10803e29a29SEric Fiseliertemplate <class F, class Tuple> 10903e29a29SEric Fiselier constexpr decltype(auto) apply(F&& f, Tuple&& t); // C++17 11003e29a29SEric Fiseliertemplate <class T, class Tuple> 11103e29a29SEric Fiselier constexpr T make_from_tuple(Tuple&& t); // C++17 11203e29a29SEric Fiselier 1133e519524SHoward Hinnant// 20.4.1.4, tuple helper classes: 114e4957601SMarshall Clowtemplate <class T> struct tuple_size; // undefined 115e4957601SMarshall Clowtemplate <class... T> struct tuple_size<tuple<T...>>; 11603e29a29SEric Fiseliertemplate <class T> 11740a01d53SMarshall Clow inline constexpr size_t tuple_size_v = tuple_size<T>::value; // C++17 1182b0c7abbSLouis Dionnetemplate <size_t I, class T> struct tuple_element; // undefined 1192b0c7abbSLouis Dionnetemplate <size_t I, class... T> struct tuple_element<I, tuple<T...>>; 120bfb3f2bfSMarshall Clowtemplate <size_t I, class T> 121bfb3f2bfSMarshall Clow using tuple_element_t = typename tuple_element <I, T>::type; // C++14 1223e519524SHoward Hinnant 1233e519524SHoward Hinnant// 20.4.1.5, element access: 124bfb3f2bfSMarshall Clowtemplate <size_t I, class... T> 12527d0a2a7SHoward Hinnant typename tuple_element<I, tuple<T...>>::type& 1268bf1f08aSMarshall Clow get(tuple<T...>&) noexcept; // constexpr in C++14 127bfb3f2bfSMarshall Clowtemplate <size_t I, class... T> 128bfb3f2bfSMarshall Clow const typename tuple_element<I, tuple<T...>>::type& 1298bf1f08aSMarshall Clow get(const tuple<T...>&) noexcept; // constexpr in C++14 130bfb3f2bfSMarshall Clowtemplate <size_t I, class... T> 13127d0a2a7SHoward Hinnant typename tuple_element<I, tuple<T...>>::type&& 1328bf1f08aSMarshall Clow get(tuple<T...>&&) noexcept; // constexpr in C++14 133545b8861SEric Fiseliertemplate <size_t I, class... T> 134545b8861SEric Fiselier const typename tuple_element<I, tuple<T...>>::type&& 135545b8861SEric Fiselier get(const tuple<T...>&&) noexcept; // constexpr in C++14 1363e519524SHoward Hinnant 137e99520c7SMarshall Clowtemplate <class T1, class... T> 138e99520c7SMarshall Clow constexpr T1& get(tuple<T...>&) noexcept; // C++14 139e99520c7SMarshall Clowtemplate <class T1, class... T> 140bfb3f2bfSMarshall Clow constexpr const T1& get(const tuple<T...>&) noexcept; // C++14 141e99520c7SMarshall Clowtemplate <class T1, class... T> 142e99520c7SMarshall Clow constexpr T1&& get(tuple<T...>&&) noexcept; // C++14 143545b8861SEric Fiseliertemplate <class T1, class... T> 144545b8861SEric Fiselier constexpr const T1&& get(const tuple<T...>&&) noexcept; // C++14 145e99520c7SMarshall Clow 1463e519524SHoward Hinnant// 20.4.1.6, relational operators: 14775eff748SMarshall Clowtemplate<class... T, class... U> bool operator==(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14 148b80f2dfdSKent Rosstemplate<class... T, class... U> bool operator<(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14, removed in C++20 149b80f2dfdSKent Rosstemplate<class... T, class... U> bool operator!=(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14, removed in C++20 150b80f2dfdSKent Rosstemplate<class... T, class... U> bool operator>(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14, removed in C++20 151b80f2dfdSKent Rosstemplate<class... T, class... U> bool operator<=(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14, removed in C++20 152b80f2dfdSKent Rosstemplate<class... T, class... U> bool operator>=(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14, removed in C++20 153b80f2dfdSKent Rosstemplate<class... T, class... U> 154b80f2dfdSKent Ross constexpr common_comparison_category_t<synth-three-way-result<T, U>...> 155b80f2dfdSKent Ross operator<=>(const tuple<T...>&, const tuple<U...>&); // since C++20 1563e519524SHoward Hinnant 1573e519524SHoward Hinnanttemplate <class... Types, class Alloc> 1583e519524SHoward Hinnant struct uses_allocator<tuple<Types...>, Alloc>; 1593e519524SHoward Hinnant 1603e519524SHoward Hinnanttemplate <class... Types> 16127d0a2a7SHoward Hinnant void 16227d0a2a7SHoward Hinnant swap(tuple<Types...>& x, tuple<Types...>& y) noexcept(noexcept(x.swap(y))); 1633e519524SHoward Hinnant 1643e519524SHoward Hinnant} // std 1653e519524SHoward Hinnant 1663e519524SHoward Hinnant*/ 1673e519524SHoward Hinnant 168b80f2dfdSKent Ross#include <__compare/common_comparison_category.h> 169b80f2dfdSKent Ross#include <__compare/synth_three_way.h> 1703e519524SHoward Hinnant#include <__config> 17169d5a666SChristopher Di Bella#include <__functional/unwrap_ref.h> 172050b064fSChristopher Di Bella#include <__memory/allocator_arg_t.h> 173050b064fSChristopher Di Bella#include <__memory/uses_allocator.h> 174050b064fSChristopher Di Bella#include <__tuple> 1756adbc83eSChristopher Di Bella#include <__utility/forward.h> 176b80f2dfdSKent Ross#include <__utility/integer_sequence.h> 1776adbc83eSChristopher Di Bella#include <__utility/move.h> 17852915d78SNikolas Klauser#include <__utility/pair.h> 17952915d78SNikolas Klauser#include <__utility/piecewise_construct.h> 18052915d78SNikolas Klauser#include <__utility/swap.h> 1812d0f1fa4SArthur O'Dwyer#include <compare> 1823e519524SHoward Hinnant#include <cstddef> 1833e519524SHoward Hinnant#include <type_traits> 184f56972e2SMarshall Clow#include <version> 1853e519524SHoward Hinnant 18652915d78SNikolas Klauser#include <utility> // TODO: Remove this 18752915d78SNikolas Klauser 188169a66eaSNikolas Klauser// TODO: remove these headers 189169a66eaSNikolas Klauser#include <__functional/binary_function.h> 190169a66eaSNikolas Klauser#include <__functional/invoke.h> 191169a66eaSNikolas Klauser#include <__functional/operations.h> 192169a66eaSNikolas Klauser#include <__functional/reference_wrapper.h> 193169a66eaSNikolas Klauser#include <__functional/unary_function.h> 194169a66eaSNikolas Klauser#include <__functional/weak_result_type.h> 195169a66eaSNikolas Klauser#include <exception> 196169a66eaSNikolas Klauser#include <new> 197169a66eaSNikolas Klauser#include <typeinfo> 198169a66eaSNikolas Klauser 199073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 2003e519524SHoward Hinnant# pragma GCC system_header 201073458b1SHoward Hinnant#endif 2023e519524SHoward Hinnant 2033e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 2043e519524SHoward Hinnant 20529870871SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 2063e519524SHoward Hinnant 20705c8dad2SMarshall Clow 2083e519524SHoward Hinnant// __tuple_leaf 2093e519524SHoward Hinnant 210ee187e24SEric Fiseliertemplate <size_t _Ip, class _Hp, 211ee187e24SEric Fiselier bool=is_empty<_Hp>::value && !__libcpp_is_final<_Hp>::value 21242b8bb50SHoward Hinnant > 2133e519524SHoward Hinnantclass __tuple_leaf; 2143e519524SHoward Hinnant 2153e519524SHoward Hinnanttemplate <size_t _Ip, class _Hp, bool _Ep> 21606e2b737SArthur O'Dwyerinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 2173e519524SHoward Hinnantvoid swap(__tuple_leaf<_Ip, _Hp, _Ep>& __x, __tuple_leaf<_Ip, _Hp, _Ep>& __y) 21827d0a2a7SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_Hp>::value) 2193e519524SHoward Hinnant{ 2203e519524SHoward Hinnant swap(__x.get(), __y.get()); 2213e519524SHoward Hinnant} 2223e519524SHoward Hinnant 2233e519524SHoward Hinnanttemplate <size_t _Ip, class _Hp, bool> 2243e519524SHoward Hinnantclass __tuple_leaf 2253e519524SHoward Hinnant{ 226def3c375SEric Fiselier _Hp __value_; 2273e519524SHoward Hinnant 228074f8d77SEric Fiselier template <class _Tp> 229074f8d77SEric Fiselier static constexpr bool __can_bind_reference() { 230292617e7SEric Fiselier#if __has_keyword(__reference_binds_to_temporary) 231292617e7SEric Fiselier return !__reference_binds_to_temporary(_Hp, _Tp); 232b1539e0aSEric Fiselier#else 233b1539e0aSEric Fiselier return true; 234292617e7SEric Fiselier#endif 235074f8d77SEric Fiselier } 236074f8d77SEric Fiselier 23706e2b737SArthur O'Dwyer _LIBCPP_CONSTEXPR_AFTER_CXX11 2383e519524SHoward Hinnant __tuple_leaf& operator=(const __tuple_leaf&); 2393e519524SHoward Hinnantpublic: 24006e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY constexpr __tuple_leaf() 241def3c375SEric Fiselier _NOEXCEPT_(is_nothrow_default_constructible<_Hp>::value) : __value_() 2423e519524SHoward Hinnant {static_assert(!is_reference<_Hp>::value, 2433e519524SHoward Hinnant "Attempted to default construct a reference element in a tuple");} 2443e519524SHoward Hinnant 2453e519524SHoward Hinnant template <class _Alloc> 24606e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY constexpr 2473e519524SHoward Hinnant __tuple_leaf(integral_constant<int, 0>, const _Alloc&) 248def3c375SEric Fiselier : __value_() 2493e519524SHoward Hinnant {static_assert(!is_reference<_Hp>::value, 2503e519524SHoward Hinnant "Attempted to default construct a reference element in a tuple");} 2513e519524SHoward Hinnant 2523e519524SHoward Hinnant template <class _Alloc> 25306e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY constexpr 2543e519524SHoward Hinnant __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a) 255def3c375SEric Fiselier : __value_(allocator_arg_t(), __a) 2563e519524SHoward Hinnant {static_assert(!is_reference<_Hp>::value, 2573e519524SHoward Hinnant "Attempted to default construct a reference element in a tuple");} 2583e519524SHoward Hinnant 2593e519524SHoward Hinnant template <class _Alloc> 26006e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY constexpr 2613e519524SHoward Hinnant __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a) 262def3c375SEric Fiselier : __value_(__a) 2633e519524SHoward Hinnant {static_assert(!is_reference<_Hp>::value, 2643e519524SHoward Hinnant "Attempted to default construct a reference element in a tuple");} 2653e519524SHoward Hinnant 26630ad985bSHoward Hinnant template <class _Tp, 267b4e88d4dSLouis Dionne class = __enable_if_t< 2683359a17bSEric Fiselier _And< 2693359a17bSEric Fiselier _IsNotSame<__uncvref_t<_Tp>, __tuple_leaf>, 2703359a17bSEric Fiselier is_constructible<_Hp, _Tp> 271567bb79bSEric Fiselier >::value 2723359a17bSEric Fiselier > 273567bb79bSEric Fiselier > 27475eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 2758a9ee148SHoward Hinnant explicit __tuple_leaf(_Tp&& __t) _NOEXCEPT_((is_nothrow_constructible<_Hp, _Tp>::value)) 276def3c375SEric Fiselier : __value_(_VSTD::forward<_Tp>(__t)) 277292617e7SEric Fiselier {static_assert(__can_bind_reference<_Tp&&>(), 278292617e7SEric Fiselier "Attempted construction of reference element binds to a temporary whose lifetime has ended");} 2793e519524SHoward Hinnant 2803e519524SHoward Hinnant template <class _Tp, class _Alloc> 28106e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 2823e519524SHoward Hinnant explicit __tuple_leaf(integral_constant<int, 0>, const _Alloc&, _Tp&& __t) 283def3c375SEric Fiselier : __value_(_VSTD::forward<_Tp>(__t)) 284292617e7SEric Fiselier {static_assert(__can_bind_reference<_Tp&&>(), 285292617e7SEric Fiselier "Attempted construction of reference element binds to a temporary whose lifetime has ended");} 2863e519524SHoward Hinnant 2873e519524SHoward Hinnant template <class _Tp, class _Alloc> 28806e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 2893e519524SHoward Hinnant explicit __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a, _Tp&& __t) 290def3c375SEric Fiselier : __value_(allocator_arg_t(), __a, _VSTD::forward<_Tp>(__t)) 291074f8d77SEric Fiselier {static_assert(!is_reference<_Hp>::value, 292074f8d77SEric Fiselier "Attempted to uses-allocator construct a reference element in a tuple");} 2933e519524SHoward Hinnant 2943e519524SHoward Hinnant template <class _Tp, class _Alloc> 29506e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 2963e519524SHoward Hinnant explicit __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a, _Tp&& __t) 297def3c375SEric Fiselier : __value_(_VSTD::forward<_Tp>(__t), __a) 298074f8d77SEric Fiselier {static_assert(!is_reference<_Hp>::value, 299074f8d77SEric Fiselier "Attempted to uses-allocator construct a reference element in a tuple");} 3003e519524SHoward Hinnant 3017546a111SMarshall Clow __tuple_leaf(const __tuple_leaf& __t) = default; 3027546a111SMarshall Clow __tuple_leaf(__tuple_leaf&& __t) = default; 3033e519524SHoward Hinnant 30406e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 30527d0a2a7SHoward Hinnant int swap(__tuple_leaf& __t) _NOEXCEPT_(__is_nothrow_swappable<__tuple_leaf>::value) 3063e519524SHoward Hinnant { 307ce48a113SHoward Hinnant _VSTD::swap(*this, __t); 3083e519524SHoward Hinnant return 0; 3093e519524SHoward Hinnant } 3103e519524SHoward Hinnant 311def3c375SEric Fiselier _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 _Hp& get() _NOEXCEPT {return __value_;} 312def3c375SEric Fiselier _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const _Hp& get() const _NOEXCEPT {return __value_;} 3133e519524SHoward Hinnant}; 3143e519524SHoward Hinnant 3153e519524SHoward Hinnanttemplate <size_t _Ip, class _Hp> 3163e519524SHoward Hinnantclass __tuple_leaf<_Ip, _Hp, true> 3173e519524SHoward Hinnant : private _Hp 3183e519524SHoward Hinnant{ 31906e2b737SArthur O'Dwyer _LIBCPP_CONSTEXPR_AFTER_CXX11 3203e519524SHoward Hinnant __tuple_leaf& operator=(const __tuple_leaf&); 3213e519524SHoward Hinnantpublic: 32206e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY constexpr __tuple_leaf() 323a0f4c45cSHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<_Hp>::value) {} 3243e519524SHoward Hinnant 3253e519524SHoward Hinnant template <class _Alloc> 32606e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY constexpr 3273e519524SHoward Hinnant __tuple_leaf(integral_constant<int, 0>, const _Alloc&) {} 3283e519524SHoward Hinnant 3293e519524SHoward Hinnant template <class _Alloc> 33006e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY constexpr 3313e519524SHoward Hinnant __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a) 3323e519524SHoward Hinnant : _Hp(allocator_arg_t(), __a) {} 3333e519524SHoward Hinnant 3343e519524SHoward Hinnant template <class _Alloc> 33506e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY constexpr 3363e519524SHoward Hinnant __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a) 3373e519524SHoward Hinnant : _Hp(__a) {} 3383e519524SHoward Hinnant 33930ad985bSHoward Hinnant template <class _Tp, 340b4e88d4dSLouis Dionne class = __enable_if_t< 3413359a17bSEric Fiselier _And< 3423359a17bSEric Fiselier _IsNotSame<__uncvref_t<_Tp>, __tuple_leaf>, 3433359a17bSEric Fiselier is_constructible<_Hp, _Tp> 344567bb79bSEric Fiselier >::value 3453359a17bSEric Fiselier > 346567bb79bSEric Fiselier > 34775eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 3488a9ee148SHoward Hinnant explicit __tuple_leaf(_Tp&& __t) _NOEXCEPT_((is_nothrow_constructible<_Hp, _Tp>::value)) 349ce48a113SHoward Hinnant : _Hp(_VSTD::forward<_Tp>(__t)) {} 3503e519524SHoward Hinnant 3513e519524SHoward Hinnant template <class _Tp, class _Alloc> 35206e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY constexpr 3533e519524SHoward Hinnant explicit __tuple_leaf(integral_constant<int, 0>, const _Alloc&, _Tp&& __t) 354ce48a113SHoward Hinnant : _Hp(_VSTD::forward<_Tp>(__t)) {} 3553e519524SHoward Hinnant 3563e519524SHoward Hinnant template <class _Tp, class _Alloc> 35706e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY constexpr 3583e519524SHoward Hinnant explicit __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a, _Tp&& __t) 359ce48a113SHoward Hinnant : _Hp(allocator_arg_t(), __a, _VSTD::forward<_Tp>(__t)) {} 3603e519524SHoward Hinnant 3613e519524SHoward Hinnant template <class _Tp, class _Alloc> 36206e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY constexpr 3633e519524SHoward Hinnant explicit __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a, _Tp&& __t) 364ce48a113SHoward Hinnant : _Hp(_VSTD::forward<_Tp>(__t), __a) {} 3653e519524SHoward Hinnant 366567bb79bSEric Fiselier __tuple_leaf(__tuple_leaf const &) = default; 367567bb79bSEric Fiselier __tuple_leaf(__tuple_leaf &&) = default; 368567bb79bSEric Fiselier 36906e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 37027d0a2a7SHoward Hinnant int 37127d0a2a7SHoward Hinnant swap(__tuple_leaf& __t) _NOEXCEPT_(__is_nothrow_swappable<__tuple_leaf>::value) 3723e519524SHoward Hinnant { 373ce48a113SHoward Hinnant _VSTD::swap(*this, __t); 3743e519524SHoward Hinnant return 0; 3753e519524SHoward Hinnant } 3763e519524SHoward Hinnant 37775eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 _Hp& get() _NOEXCEPT {return static_cast<_Hp&>(*this);} 37875eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const _Hp& get() const _NOEXCEPT {return static_cast<const _Hp&>(*this);} 3793e519524SHoward Hinnant}; 3803e519524SHoward Hinnant 381789847ddSHoward Hinnanttemplate <class ..._Tp> 38206e2b737SArthur O'Dwyer_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 3838a9ee148SHoward Hinnantvoid __swallow(_Tp&&...) _NOEXCEPT {} 3843e519524SHoward Hinnant 38514c5ec51SMarshall Clowtemplate <class _Tp> 38614c5ec51SMarshall Clowstruct __all_default_constructible; 38727d0a2a7SHoward Hinnant 38814c5ec51SMarshall Clowtemplate <class ..._Tp> 38914c5ec51SMarshall Clowstruct __all_default_constructible<__tuple_types<_Tp...>> 39014c5ec51SMarshall Clow : __all<is_default_constructible<_Tp>::value...> 39114c5ec51SMarshall Clow{ }; 39227d0a2a7SHoward Hinnant 3933e519524SHoward Hinnant// __tuple_impl 3943e519524SHoward Hinnant 3953e519524SHoward Hinnanttemplate<class _Indx, class ..._Tp> struct __tuple_impl; 3963e519524SHoward Hinnant 3973e519524SHoward Hinnanttemplate<size_t ..._Indx, class ..._Tp> 398b43f17c8SEric Fiselierstruct _LIBCPP_DECLSPEC_EMPTY_BASES __tuple_impl<__tuple_indices<_Indx...>, _Tp...> 3993e519524SHoward Hinnant : public __tuple_leaf<_Indx, _Tp>... 4003e519524SHoward Hinnant{ 401a62ebe04SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 40206e2b737SArthur O'Dwyer constexpr __tuple_impl() 403a0f4c45cSHoward Hinnant _NOEXCEPT_(__all<is_nothrow_default_constructible<_Tp>::value...>::value) {} 404a62ebe04SHoward Hinnant 4053e519524SHoward Hinnant template <size_t ..._Uf, class ..._Tf, 4063e519524SHoward Hinnant size_t ..._Ul, class ..._Tl, class ..._Up> 40775eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 4083e519524SHoward Hinnant explicit 4093e519524SHoward Hinnant __tuple_impl(__tuple_indices<_Uf...>, __tuple_types<_Tf...>, 4103e519524SHoward Hinnant __tuple_indices<_Ul...>, __tuple_types<_Tl...>, 4118a9ee148SHoward Hinnant _Up&&... __u) 4128a9ee148SHoward Hinnant _NOEXCEPT_((__all<is_nothrow_constructible<_Tf, _Up>::value...>::value && 4138a9ee148SHoward Hinnant __all<is_nothrow_default_constructible<_Tl>::value...>::value)) : 414ce48a113SHoward Hinnant __tuple_leaf<_Uf, _Tf>(_VSTD::forward<_Up>(__u))..., 4153e519524SHoward Hinnant __tuple_leaf<_Ul, _Tl>()... 4163e519524SHoward Hinnant {} 4173e519524SHoward Hinnant 4183e519524SHoward Hinnant template <class _Alloc, size_t ..._Uf, class ..._Tf, 4193e519524SHoward Hinnant size_t ..._Ul, class ..._Tl, class ..._Up> 42006e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 4213e519524SHoward Hinnant explicit 4223e519524SHoward Hinnant __tuple_impl(allocator_arg_t, const _Alloc& __a, 4233e519524SHoward Hinnant __tuple_indices<_Uf...>, __tuple_types<_Tf...>, 4243e519524SHoward Hinnant __tuple_indices<_Ul...>, __tuple_types<_Tl...>, 4253e519524SHoward Hinnant _Up&&... __u) : 4263e519524SHoward Hinnant __tuple_leaf<_Uf, _Tf>(__uses_alloc_ctor<_Tf, _Alloc, _Up>(), __a, 427ce48a113SHoward Hinnant _VSTD::forward<_Up>(__u))..., 4283e519524SHoward Hinnant __tuple_leaf<_Ul, _Tl>(__uses_alloc_ctor<_Tl, _Alloc>(), __a)... 4293e519524SHoward Hinnant {} 4303e519524SHoward Hinnant 4313e519524SHoward Hinnant template <class _Tuple, 4323e519524SHoward Hinnant class = typename enable_if 4333e519524SHoward Hinnant < 434f3b02b17SHoward Hinnant __tuple_constructible<_Tuple, tuple<_Tp...> >::value 4353e519524SHoward Hinnant >::type 4363e519524SHoward Hinnant > 43775eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 4388a9ee148SHoward Hinnant __tuple_impl(_Tuple&& __t) _NOEXCEPT_((__all<is_nothrow_constructible<_Tp, typename tuple_element<_Indx, 4398a9ee148SHoward Hinnant typename __make_tuple_types<_Tuple>::type>::type>::value...>::value)) 440ce48a113SHoward Hinnant : __tuple_leaf<_Indx, _Tp>(_VSTD::forward<typename tuple_element<_Indx, 441ce48a113SHoward Hinnant typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<_Indx>(__t)))... 4423e519524SHoward Hinnant {} 4433e519524SHoward Hinnant 4443e519524SHoward Hinnant template <class _Alloc, class _Tuple, 4453e519524SHoward Hinnant class = typename enable_if 4463e519524SHoward Hinnant < 4479795699aSEric Fiselier __tuple_constructible<_Tuple, tuple<_Tp...> >::value 4483e519524SHoward Hinnant >::type 4493e519524SHoward Hinnant > 45006e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 4513e519524SHoward Hinnant __tuple_impl(allocator_arg_t, const _Alloc& __a, _Tuple&& __t) 4523e519524SHoward Hinnant : __tuple_leaf<_Indx, _Tp>(__uses_alloc_ctor<_Tp, _Alloc, typename tuple_element<_Indx, 4533e519524SHoward Hinnant typename __make_tuple_types<_Tuple>::type>::type>(), __a, 454ce48a113SHoward Hinnant _VSTD::forward<typename tuple_element<_Indx, 455ce48a113SHoward Hinnant typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<_Indx>(__t)))... 4563e519524SHoward Hinnant {} 4573e519524SHoward Hinnant 4584478b25aSHoward Hinnant __tuple_impl(const __tuple_impl&) = default; 4594478b25aSHoward Hinnant __tuple_impl(__tuple_impl&&) = default; 4604478b25aSHoward Hinnant 46106e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 4623e519524SHoward Hinnant void swap(__tuple_impl& __t) 46327d0a2a7SHoward Hinnant _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value) 4643e519524SHoward Hinnant { 465a0839b14SLouis Dionne _VSTD::__swallow(__tuple_leaf<_Indx, _Tp>::swap(static_cast<__tuple_leaf<_Indx, _Tp>&>(__t))...); 4663e519524SHoward Hinnant } 4673e519524SHoward Hinnant}; 4683e519524SHoward Hinnant 469a0839b14SLouis Dionnetemplate<class _Dest, class _Source, size_t ..._Np> 47006e2b737SArthur O'Dwyer_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 471a0839b14SLouis Dionnevoid __memberwise_copy_assign(_Dest& __dest, _Source const& __source, __tuple_indices<_Np...>) { 472a0839b14SLouis Dionne _VSTD::__swallow(((_VSTD::get<_Np>(__dest) = _VSTD::get<_Np>(__source)), void(), 0)...); 473a0839b14SLouis Dionne} 47474cba642SEric Fiselier 475a0839b14SLouis Dionnetemplate<class _Dest, class _Source, class ..._Up, size_t ..._Np> 47606e2b737SArthur O'Dwyer_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 477a0839b14SLouis Dionnevoid __memberwise_forward_assign(_Dest& __dest, _Source&& __source, __tuple_types<_Up...>, __tuple_indices<_Np...>) { 478a0839b14SLouis Dionne _VSTD::__swallow((( 479618862e8SLouis Dionne _VSTD::get<_Np>(__dest) = _VSTD::forward<_Up>(_VSTD::get<_Np>(__source)) 480a0839b14SLouis Dionne ), void(), 0)...); 481a0839b14SLouis Dionne} 48274cba642SEric Fiselier 4833e519524SHoward Hinnanttemplate <class ..._Tp> 484e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS tuple 4853e519524SHoward Hinnant{ 486def3c375SEric Fiselier typedef __tuple_impl<typename __make_tuple_indices<sizeof...(_Tp)>::type, _Tp...> _BaseT; 4873e519524SHoward Hinnant 488def3c375SEric Fiselier _BaseT __base_; 4893e519524SHoward Hinnant 4908bf1f08aSMarshall Clow template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11 491c206366fSHoward Hinnant typename tuple_element<_Jp, tuple<_Up...> >::type& get(tuple<_Up...>&) _NOEXCEPT; 4928bf1f08aSMarshall Clow template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11 493c206366fSHoward Hinnant const typename tuple_element<_Jp, tuple<_Up...> >::type& get(const tuple<_Up...>&) _NOEXCEPT; 4948bf1f08aSMarshall Clow template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11 495c206366fSHoward Hinnant typename tuple_element<_Jp, tuple<_Up...> >::type&& get(tuple<_Up...>&&) _NOEXCEPT; 496545b8861SEric Fiselier template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11 497545b8861SEric Fiselier const typename tuple_element<_Jp, tuple<_Up...> >::type&& get(const tuple<_Up...>&&) _NOEXCEPT; 4983e519524SHoward Hinnantpublic: 499a3ab5120SLouis Dionne // [tuple.cnstr] 5003e519524SHoward Hinnant 501a3ab5120SLouis Dionne // tuple() constructors (including allocator_arg_t variants) 502b4e88d4dSLouis Dionne template <template<class...> class _IsImpDefault = __is_implicitly_default_constructible, __enable_if_t< 503a3ab5120SLouis Dionne _And< 504a3ab5120SLouis Dionne _IsImpDefault<_Tp>... // explicit check 505a3ab5120SLouis Dionne >::value 506a3ab5120SLouis Dionne , int> = 0> 507ef89e8caSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 508e16f2cb6SLouis Dionne tuple() 509a3ab5120SLouis Dionne _NOEXCEPT_(_And<is_nothrow_default_constructible<_Tp>...>::value) 510a3ab5120SLouis Dionne { } 511e16f2cb6SLouis Dionne 512a3ab5120SLouis Dionne template <template<class...> class _IsImpDefault = __is_implicitly_default_constructible, 513b4e88d4dSLouis Dionne template<class...> class _IsDefault = is_default_constructible, __enable_if_t< 514a3ab5120SLouis Dionne _And< 515a3ab5120SLouis Dionne _IsDefault<_Tp>..., 516a3ab5120SLouis Dionne _Not<_Lazy<_And, _IsImpDefault<_Tp>...> > // explicit check 517a3ab5120SLouis Dionne >::value 518a3ab5120SLouis Dionne , int> = 0> 519a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 520a3ab5120SLouis Dionne explicit tuple() 521a3ab5120SLouis Dionne _NOEXCEPT_(_And<is_nothrow_default_constructible<_Tp>...>::value) 522a3ab5120SLouis Dionne { } 523a62ebe04SHoward Hinnant 524b4e88d4dSLouis Dionne template <class _Alloc, template<class...> class _IsImpDefault = __is_implicitly_default_constructible, __enable_if_t< 525a3ab5120SLouis Dionne _And< 526a3ab5120SLouis Dionne _IsImpDefault<_Tp>... // explicit check 527a3ab5120SLouis Dionne >::value 528a3ab5120SLouis Dionne , int> = 0> 529a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 530a3ab5120SLouis Dionne tuple(allocator_arg_t, _Alloc const& __a) 531a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __a, 532a3ab5120SLouis Dionne __tuple_indices<>(), __tuple_types<>(), 533a3ab5120SLouis Dionne typename __make_tuple_indices<sizeof...(_Tp), 0>::type(), 534a3ab5120SLouis Dionne __tuple_types<_Tp...>()) {} 535a3ab5120SLouis Dionne 536a3ab5120SLouis Dionne template <class _Alloc, 537a3ab5120SLouis Dionne template<class...> class _IsImpDefault = __is_implicitly_default_constructible, 538b4e88d4dSLouis Dionne template<class...> class _IsDefault = is_default_constructible, __enable_if_t< 539a3ab5120SLouis Dionne _And< 540a3ab5120SLouis Dionne _IsDefault<_Tp>..., 541a3ab5120SLouis Dionne _Not<_Lazy<_And, _IsImpDefault<_Tp>...> > // explicit check 542a3ab5120SLouis Dionne >::value 543a3ab5120SLouis Dionne , int> = 0> 544a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 545a3ab5120SLouis Dionne explicit tuple(allocator_arg_t, _Alloc const& __a) 546a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __a, 547a3ab5120SLouis Dionne __tuple_indices<>(), __tuple_types<>(), 548a3ab5120SLouis Dionne typename __make_tuple_indices<sizeof...(_Tp), 0>::type(), 549a3ab5120SLouis Dionne __tuple_types<_Tp...>()) {} 550a3ab5120SLouis Dionne 551a3ab5120SLouis Dionne // tuple(const T&...) constructors (including allocator_arg_t variants) 552b4e88d4dSLouis Dionne template <template<class...> class _And = _And, __enable_if_t< 553a3ab5120SLouis Dionne _And< 554a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Tp) >= 1>, 555a3ab5120SLouis Dionne is_copy_constructible<_Tp>..., 556a3ab5120SLouis Dionne is_convertible<const _Tp&, _Tp>... // explicit check 557a3ab5120SLouis Dionne >::value 558a3ab5120SLouis Dionne , int> = 0> 559a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 560a3ab5120SLouis Dionne tuple(const _Tp& ... __t) 561a3ab5120SLouis Dionne _NOEXCEPT_(_And<is_nothrow_copy_constructible<_Tp>...>::value) 562a3ab5120SLouis Dionne : __base_(typename __make_tuple_indices<sizeof...(_Tp)>::type(), 563a3ab5120SLouis Dionne typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(), 564a3ab5120SLouis Dionne typename __make_tuple_indices<0>::type(), 565a3ab5120SLouis Dionne typename __make_tuple_types<tuple, 0>::type(), 566a3ab5120SLouis Dionne __t... 567a3ab5120SLouis Dionne ) {} 568a3ab5120SLouis Dionne 569b4e88d4dSLouis Dionne template <template<class...> class _And = _And, __enable_if_t< 570a3ab5120SLouis Dionne _And< 571a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Tp) >= 1>, 572a3ab5120SLouis Dionne is_copy_constructible<_Tp>..., 573a3ab5120SLouis Dionne _Not<_Lazy<_And, is_convertible<const _Tp&, _Tp>...> > // explicit check 574a3ab5120SLouis Dionne >::value 575a3ab5120SLouis Dionne , int> = 0> 576a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 577a3ab5120SLouis Dionne explicit tuple(const _Tp& ... __t) 578a3ab5120SLouis Dionne _NOEXCEPT_(_And<is_nothrow_copy_constructible<_Tp>...>::value) 579a3ab5120SLouis Dionne : __base_(typename __make_tuple_indices<sizeof...(_Tp)>::type(), 580a3ab5120SLouis Dionne typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(), 581a3ab5120SLouis Dionne typename __make_tuple_indices<0>::type(), 582a3ab5120SLouis Dionne typename __make_tuple_types<tuple, 0>::type(), 583a3ab5120SLouis Dionne __t... 584a3ab5120SLouis Dionne ) {} 585a3ab5120SLouis Dionne 586b4e88d4dSLouis Dionne template <class _Alloc, template<class...> class _And = _And, __enable_if_t< 587a3ab5120SLouis Dionne _And< 588a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Tp) >= 1>, 589a3ab5120SLouis Dionne is_copy_constructible<_Tp>..., 590a3ab5120SLouis Dionne is_convertible<const _Tp&, _Tp>... // explicit check 591a3ab5120SLouis Dionne >::value 592a3ab5120SLouis Dionne , int> = 0> 593a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 594a3ab5120SLouis Dionne tuple(allocator_arg_t, const _Alloc& __a, const _Tp& ... __t) 595a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __a, 596a3ab5120SLouis Dionne typename __make_tuple_indices<sizeof...(_Tp)>::type(), 597a3ab5120SLouis Dionne typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(), 598a3ab5120SLouis Dionne typename __make_tuple_indices<0>::type(), 599a3ab5120SLouis Dionne typename __make_tuple_types<tuple, 0>::type(), 600a3ab5120SLouis Dionne __t... 601a3ab5120SLouis Dionne ) {} 602a3ab5120SLouis Dionne 603b4e88d4dSLouis Dionne template <class _Alloc, template<class...> class _And = _And, __enable_if_t< 604a3ab5120SLouis Dionne _And< 605a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Tp) >= 1>, 606a3ab5120SLouis Dionne is_copy_constructible<_Tp>..., 607a3ab5120SLouis Dionne _Not<_Lazy<_And, is_convertible<const _Tp&, _Tp>...> > // explicit check 608a3ab5120SLouis Dionne >::value 609a3ab5120SLouis Dionne , int> = 0> 610a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 611a3ab5120SLouis Dionne explicit tuple(allocator_arg_t, const _Alloc& __a, const _Tp& ... __t) 612a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __a, 613a3ab5120SLouis Dionne typename __make_tuple_indices<sizeof...(_Tp)>::type(), 614a3ab5120SLouis Dionne typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(), 615a3ab5120SLouis Dionne typename __make_tuple_indices<0>::type(), 616a3ab5120SLouis Dionne typename __make_tuple_types<tuple, 0>::type(), 617a3ab5120SLouis Dionne __t... 618a3ab5120SLouis Dionne ) {} 619a3ab5120SLouis Dionne 620a3ab5120SLouis Dionne // tuple(U&& ...) constructors (including allocator_arg_t variants) 621a3ab5120SLouis Dionne template <class ..._Up> struct _IsThisTuple : false_type { }; 622a3ab5120SLouis Dionne template <class _Up> struct _IsThisTuple<_Up> : is_same<__uncvref_t<_Up>, tuple> { }; 623a3ab5120SLouis Dionne 624a3ab5120SLouis Dionne template <class ..._Up> 625a3ab5120SLouis Dionne struct _EnableUTypesCtor : _And< 626a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Tp) >= 1>, 627a3ab5120SLouis Dionne _Not<_IsThisTuple<_Up...> >, // extension to allow mis-behaved user constructors 628a3ab5120SLouis Dionne is_constructible<_Tp, _Up>... 629a3ab5120SLouis Dionne > { }; 630a3ab5120SLouis Dionne 631b4e88d4dSLouis Dionne template <class ..._Up, __enable_if_t< 632a3ab5120SLouis Dionne _And< 633a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Up) == sizeof...(_Tp)>, 634a3ab5120SLouis Dionne _EnableUTypesCtor<_Up...>, 635a3ab5120SLouis Dionne is_convertible<_Up, _Tp>... // explicit check 636a3ab5120SLouis Dionne >::value 637a3ab5120SLouis Dionne , int> = 0> 638a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 639a3ab5120SLouis Dionne tuple(_Up&&... __u) 640a3ab5120SLouis Dionne _NOEXCEPT_((_And<is_nothrow_constructible<_Tp, _Up>...>::value)) 641a3ab5120SLouis Dionne : __base_(typename __make_tuple_indices<sizeof...(_Up)>::type(), 642a3ab5120SLouis Dionne typename __make_tuple_types<tuple, sizeof...(_Up)>::type(), 643a3ab5120SLouis Dionne typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(), 644a3ab5120SLouis Dionne typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(), 645a3ab5120SLouis Dionne _VSTD::forward<_Up>(__u)...) {} 646a3ab5120SLouis Dionne 647b4e88d4dSLouis Dionne template <class ..._Up, __enable_if_t< 648a3ab5120SLouis Dionne _And< 649a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Up) == sizeof...(_Tp)>, 650a3ab5120SLouis Dionne _EnableUTypesCtor<_Up...>, 651a3ab5120SLouis Dionne _Not<_Lazy<_And, is_convertible<_Up, _Tp>...> > // explicit check 652a3ab5120SLouis Dionne >::value 653a3ab5120SLouis Dionne , int> = 0> 654a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 655a3ab5120SLouis Dionne explicit tuple(_Up&&... __u) 656a3ab5120SLouis Dionne _NOEXCEPT_((_And<is_nothrow_constructible<_Tp, _Up>...>::value)) 657a3ab5120SLouis Dionne : __base_(typename __make_tuple_indices<sizeof...(_Up)>::type(), 658a3ab5120SLouis Dionne typename __make_tuple_types<tuple, sizeof...(_Up)>::type(), 659a3ab5120SLouis Dionne typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(), 660a3ab5120SLouis Dionne typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(), 661a3ab5120SLouis Dionne _VSTD::forward<_Up>(__u)...) {} 662a3ab5120SLouis Dionne 663b4e88d4dSLouis Dionne template <class _Alloc, class ..._Up, __enable_if_t< 664a3ab5120SLouis Dionne _And< 665a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Up) == sizeof...(_Tp)>, 666a3ab5120SLouis Dionne _EnableUTypesCtor<_Up...>, 667a3ab5120SLouis Dionne is_convertible<_Up, _Tp>... // explicit check 668a3ab5120SLouis Dionne >::value 669a3ab5120SLouis Dionne , int> = 0> 670a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 671a3ab5120SLouis Dionne tuple(allocator_arg_t, const _Alloc& __a, _Up&&... __u) 672a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __a, 673a3ab5120SLouis Dionne typename __make_tuple_indices<sizeof...(_Up)>::type(), 674a3ab5120SLouis Dionne typename __make_tuple_types<tuple, sizeof...(_Up)>::type(), 675a3ab5120SLouis Dionne typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(), 676a3ab5120SLouis Dionne typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(), 677a3ab5120SLouis Dionne _VSTD::forward<_Up>(__u)...) {} 678a3ab5120SLouis Dionne 679b4e88d4dSLouis Dionne template <class _Alloc, class ..._Up, __enable_if_t< 680a3ab5120SLouis Dionne _And< 681a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Up) == sizeof...(_Tp)>, 682a3ab5120SLouis Dionne _EnableUTypesCtor<_Up...>, 683a3ab5120SLouis Dionne _Not<_Lazy<_And, is_convertible<_Up, _Tp>...> > // explicit check 684a3ab5120SLouis Dionne >::value 685a3ab5120SLouis Dionne , int> = 0> 686a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 687a3ab5120SLouis Dionne explicit tuple(allocator_arg_t, const _Alloc& __a, _Up&&... __u) 688a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __a, 689a3ab5120SLouis Dionne typename __make_tuple_indices<sizeof...(_Up)>::type(), 690a3ab5120SLouis Dionne typename __make_tuple_types<tuple, sizeof...(_Up)>::type(), 691a3ab5120SLouis Dionne typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(), 692a3ab5120SLouis Dionne typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(), 693a3ab5120SLouis Dionne _VSTD::forward<_Up>(__u)...) {} 694a3ab5120SLouis Dionne 695a3ab5120SLouis Dionne // Copy and move constructors (including the allocator_arg_t variants) 696a3ab5120SLouis Dionne tuple(const tuple&) = default; 697aedcbf89SEric Fiselier tuple(tuple&&) = default; 698aedcbf89SEric Fiselier 699b4e88d4dSLouis Dionne template <class _Alloc, template<class...> class _And = _And, __enable_if_t< 700a3ab5120SLouis Dionne _And<is_copy_constructible<_Tp>...>::value 701a3ab5120SLouis Dionne , int> = 0> 702a3ab5120SLouis Dionne tuple(allocator_arg_t, const _Alloc& __alloc, const tuple& __t) 703a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __alloc, __t) 704a3ab5120SLouis Dionne { } 70590fb2bafSEric Fiselier 706b4e88d4dSLouis Dionne template <class _Alloc, template<class...> class _And = _And, __enable_if_t< 707a3ab5120SLouis Dionne _And<is_move_constructible<_Tp>...>::value 708a3ab5120SLouis Dionne , int> = 0> 709a3ab5120SLouis Dionne tuple(allocator_arg_t, const _Alloc& __alloc, tuple&& __t) 710a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __alloc, _VSTD::move(__t)) 711a3ab5120SLouis Dionne { } 71259e26308SLouis Dionne 713a3ab5120SLouis Dionne // tuple(const tuple<U...>&) constructors (including allocator_arg_t variants) 714a3ab5120SLouis Dionne template <class ..._Up> 715a3ab5120SLouis Dionne struct _EnableCopyFromOtherTuple : _And< 71617f2d1cbSLouis Dionne _Not<is_same<tuple<_Tp...>, tuple<_Up...> > >, 71717f2d1cbSLouis Dionne _Lazy<_Or, 718a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Tp) != 1>, 719a3ab5120SLouis Dionne // _Tp and _Up are 1-element packs - the pack expansions look 720a3ab5120SLouis Dionne // weird to avoid tripping up the type traits in degenerate cases 721a3ab5120SLouis Dionne _Lazy<_And, 722a3ab5120SLouis Dionne _Not<is_convertible<const tuple<_Up>&, _Tp> >..., 723a3ab5120SLouis Dionne _Not<is_constructible<_Tp, const tuple<_Up>&> >... 7249795699aSEric Fiselier > 725a3ab5120SLouis Dionne >, 726a3ab5120SLouis Dionne is_constructible<_Tp, const _Up&>... 727a3ab5120SLouis Dionne > { }; 7289795699aSEric Fiselier 729b4e88d4dSLouis Dionne template <class ..._Up, __enable_if_t< 730a3ab5120SLouis Dionne _And< 731a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Up) == sizeof...(_Tp)>, 732a3ab5120SLouis Dionne _EnableCopyFromOtherTuple<_Up...>, 733a3ab5120SLouis Dionne is_convertible<const _Up&, _Tp>... // explicit check 7348a9ee148SHoward Hinnant >::value 735a3ab5120SLouis Dionne , int> = 0> 73675eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 737a3ab5120SLouis Dionne tuple(const tuple<_Up...>& __t) 738a3ab5120SLouis Dionne _NOEXCEPT_((_And<is_nothrow_constructible<_Tp, const _Up&>...>::value)) 739a3ab5120SLouis Dionne : __base_(__t) 740a3ab5120SLouis Dionne { } 741a3ab5120SLouis Dionne 742b4e88d4dSLouis Dionne template <class ..._Up, __enable_if_t< 743a3ab5120SLouis Dionne _And< 744a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Up) == sizeof...(_Tp)>, 745a3ab5120SLouis Dionne _EnableCopyFromOtherTuple<_Up...>, 746a3ab5120SLouis Dionne _Not<_Lazy<_And, is_convertible<const _Up&, _Tp>...> > // explicit check 7478a9ee148SHoward Hinnant >::value 748a3ab5120SLouis Dionne , int> = 0> 74975eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 750a3ab5120SLouis Dionne explicit tuple(const tuple<_Up...>& __t) 751a3ab5120SLouis Dionne _NOEXCEPT_((_And<is_nothrow_constructible<_Tp, const _Up&>...>::value)) 752a3ab5120SLouis Dionne : __base_(__t) 753a3ab5120SLouis Dionne { } 7543e519524SHoward Hinnant 755b4e88d4dSLouis Dionne template <class ..._Up, class _Alloc, __enable_if_t< 756a3ab5120SLouis Dionne _And< 757a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Up) == sizeof...(_Tp)>, 758a3ab5120SLouis Dionne _EnableCopyFromOtherTuple<_Up...>, 759a3ab5120SLouis Dionne is_convertible<const _Up&, _Tp>... // explicit check 760a3ab5120SLouis Dionne >::value 761a3ab5120SLouis Dionne , int> = 0> 76206e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 763a3ab5120SLouis Dionne tuple(allocator_arg_t, const _Alloc& __a, const tuple<_Up...>& __t) 764a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __a, __t) 765a3ab5120SLouis Dionne { } 7663e519524SHoward Hinnant 767b4e88d4dSLouis Dionne template <class ..._Up, class _Alloc, __enable_if_t< 768a3ab5120SLouis Dionne _And< 769a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Up) == sizeof...(_Tp)>, 770a3ab5120SLouis Dionne _EnableCopyFromOtherTuple<_Up...>, 771a3ab5120SLouis Dionne _Not<_Lazy<_And, is_convertible<const _Up&, _Tp>...> > // explicit check 772a3ab5120SLouis Dionne >::value 773a3ab5120SLouis Dionne , int> = 0> 77406e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 775a3ab5120SLouis Dionne explicit tuple(allocator_arg_t, const _Alloc& __a, const tuple<_Up...>& __t) 776a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __a, __t) 777a3ab5120SLouis Dionne { } 778a3ab5120SLouis Dionne 779a3ab5120SLouis Dionne // tuple(tuple<U...>&&) constructors (including allocator_arg_t variants) 780a3ab5120SLouis Dionne template <class ..._Up> 781a3ab5120SLouis Dionne struct _EnableMoveFromOtherTuple : _And< 78217f2d1cbSLouis Dionne _Not<is_same<tuple<_Tp...>, tuple<_Up...> > >, 78317f2d1cbSLouis Dionne _Lazy<_Or, 784a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Tp) != 1>, 785a3ab5120SLouis Dionne // _Tp and _Up are 1-element packs - the pack expansions look 786a3ab5120SLouis Dionne // weird to avoid tripping up the type traits in degenerate cases 787a3ab5120SLouis Dionne _Lazy<_And, 788a3ab5120SLouis Dionne _Not<is_convertible<tuple<_Up>, _Tp> >..., 789a3ab5120SLouis Dionne _Not<is_constructible<_Tp, tuple<_Up> > >... 790a3ab5120SLouis Dionne > 791a3ab5120SLouis Dionne >, 792a3ab5120SLouis Dionne is_constructible<_Tp, _Up>... 793a3ab5120SLouis Dionne > { }; 794a3ab5120SLouis Dionne 795b4e88d4dSLouis Dionne template <class ..._Up, __enable_if_t< 796a3ab5120SLouis Dionne _And< 797a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Up) == sizeof...(_Tp)>, 798a3ab5120SLouis Dionne _EnableMoveFromOtherTuple<_Up...>, 799a3ab5120SLouis Dionne is_convertible<_Up, _Tp>... // explicit check 800a3ab5120SLouis Dionne >::value 801a3ab5120SLouis Dionne , int> = 0> 802a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 803a3ab5120SLouis Dionne tuple(tuple<_Up...>&& __t) 804a3ab5120SLouis Dionne _NOEXCEPT_((_And<is_nothrow_constructible<_Tp, _Up>...>::value)) 805a3ab5120SLouis Dionne : __base_(_VSTD::move(__t)) 806a3ab5120SLouis Dionne { } 807a3ab5120SLouis Dionne 808b4e88d4dSLouis Dionne template <class ..._Up, __enable_if_t< 809a3ab5120SLouis Dionne _And< 810a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Up) == sizeof...(_Tp)>, 811a3ab5120SLouis Dionne _EnableMoveFromOtherTuple<_Up...>, 812a3ab5120SLouis Dionne _Not<_Lazy<_And, is_convertible<_Up, _Tp>...> > // explicit check 813a3ab5120SLouis Dionne >::value 814a3ab5120SLouis Dionne , int> = 0> 815a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 816a3ab5120SLouis Dionne explicit tuple(tuple<_Up...>&& __t) 817a3ab5120SLouis Dionne _NOEXCEPT_((_And<is_nothrow_constructible<_Tp, _Up>...>::value)) 818a3ab5120SLouis Dionne : __base_(_VSTD::move(__t)) 819a3ab5120SLouis Dionne { } 820a3ab5120SLouis Dionne 821b4e88d4dSLouis Dionne template <class _Alloc, class ..._Up, __enable_if_t< 822a3ab5120SLouis Dionne _And< 823a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Up) == sizeof...(_Tp)>, 824a3ab5120SLouis Dionne _EnableMoveFromOtherTuple<_Up...>, 825a3ab5120SLouis Dionne is_convertible<_Up, _Tp>... // explicit check 826a3ab5120SLouis Dionne >::value 827a3ab5120SLouis Dionne , int> = 0> 828a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 829a3ab5120SLouis Dionne tuple(allocator_arg_t, const _Alloc& __a, tuple<_Up...>&& __t) 830a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __a, _VSTD::move(__t)) 831a3ab5120SLouis Dionne { } 832a3ab5120SLouis Dionne 833b4e88d4dSLouis Dionne template <class _Alloc, class ..._Up, __enable_if_t< 834a3ab5120SLouis Dionne _And< 835a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Up) == sizeof...(_Tp)>, 836a3ab5120SLouis Dionne _EnableMoveFromOtherTuple<_Up...>, 837a3ab5120SLouis Dionne _Not<_Lazy<_And, is_convertible<_Up, _Tp>...> > // explicit check 838a3ab5120SLouis Dionne >::value 839a3ab5120SLouis Dionne , int> = 0> 840a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 841a3ab5120SLouis Dionne explicit tuple(allocator_arg_t, const _Alloc& __a, tuple<_Up...>&& __t) 842a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __a, _VSTD::move(__t)) 843a3ab5120SLouis Dionne { } 844a3ab5120SLouis Dionne 845a3ab5120SLouis Dionne // tuple(const pair<U1, U2>&) constructors (including allocator_arg_t variants) 846a3ab5120SLouis Dionne template <class _Up1, class _Up2, class ..._DependentTp> 847a3ab5120SLouis Dionne struct _EnableImplicitCopyFromPair : _And< 848a3ab5120SLouis Dionne is_constructible<_FirstType<_DependentTp...>, const _Up1&>, 849a3ab5120SLouis Dionne is_constructible<_SecondType<_DependentTp...>, const _Up2&>, 850a3ab5120SLouis Dionne is_convertible<const _Up1&, _FirstType<_DependentTp...> >, // explicit check 851a3ab5120SLouis Dionne is_convertible<const _Up2&, _SecondType<_DependentTp...> > 852a3ab5120SLouis Dionne > { }; 853a3ab5120SLouis Dionne 854a3ab5120SLouis Dionne template <class _Up1, class _Up2, class ..._DependentTp> 855a3ab5120SLouis Dionne struct _EnableExplicitCopyFromPair : _And< 856a3ab5120SLouis Dionne is_constructible<_FirstType<_DependentTp...>, const _Up1&>, 857a3ab5120SLouis Dionne is_constructible<_SecondType<_DependentTp...>, const _Up2&>, 858a3ab5120SLouis Dionne _Not<is_convertible<const _Up1&, _FirstType<_DependentTp...> > >, // explicit check 859a3ab5120SLouis Dionne _Not<is_convertible<const _Up2&, _SecondType<_DependentTp...> > > 860a3ab5120SLouis Dionne > { }; 861a3ab5120SLouis Dionne 862b4e88d4dSLouis Dionne template <class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t< 863a3ab5120SLouis Dionne _And< 864a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Tp) == 2>, 865a3ab5120SLouis Dionne _EnableImplicitCopyFromPair<_Up1, _Up2, _Tp...> 866a3ab5120SLouis Dionne >::value 867a3ab5120SLouis Dionne , int> = 0> 868a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 869a3ab5120SLouis Dionne tuple(const pair<_Up1, _Up2>& __p) 870a3ab5120SLouis Dionne _NOEXCEPT_((_And< 871a3ab5120SLouis Dionne is_nothrow_constructible<_FirstType<_Tp...>, const _Up1&>, 872a3ab5120SLouis Dionne is_nothrow_constructible<_SecondType<_Tp...>, const _Up2&> 873a3ab5120SLouis Dionne >::value)) 874a3ab5120SLouis Dionne : __base_(__p) 875a3ab5120SLouis Dionne { } 876a3ab5120SLouis Dionne 877b4e88d4dSLouis Dionne template <class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t< 878a3ab5120SLouis Dionne _And< 879a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Tp) == 2>, 880a3ab5120SLouis Dionne _EnableExplicitCopyFromPair<_Up1, _Up2, _Tp...> 881a3ab5120SLouis Dionne >::value 882a3ab5120SLouis Dionne , int> = 0> 883a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 884a3ab5120SLouis Dionne explicit tuple(const pair<_Up1, _Up2>& __p) 885a3ab5120SLouis Dionne _NOEXCEPT_((_And< 886a3ab5120SLouis Dionne is_nothrow_constructible<_FirstType<_Tp...>, const _Up1&>, 887a3ab5120SLouis Dionne is_nothrow_constructible<_SecondType<_Tp...>, const _Up2&> 888a3ab5120SLouis Dionne >::value)) 889a3ab5120SLouis Dionne : __base_(__p) 890a3ab5120SLouis Dionne { } 891a3ab5120SLouis Dionne 892b4e88d4dSLouis Dionne template <class _Alloc, class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t< 893a3ab5120SLouis Dionne _And< 894a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Tp) == 2>, 895a3ab5120SLouis Dionne _EnableImplicitCopyFromPair<_Up1, _Up2, _Tp...> 896a3ab5120SLouis Dionne >::value 897a3ab5120SLouis Dionne , int> = 0> 898a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 899a3ab5120SLouis Dionne tuple(allocator_arg_t, const _Alloc& __a, const pair<_Up1, _Up2>& __p) 900a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __a, __p) 901a3ab5120SLouis Dionne { } 902a3ab5120SLouis Dionne 903b4e88d4dSLouis Dionne template <class _Alloc, class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t< 904a3ab5120SLouis Dionne _And< 905a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Tp) == 2>, 906a3ab5120SLouis Dionne _EnableExplicitCopyFromPair<_Up1, _Up2, _Tp...> 907a3ab5120SLouis Dionne >::value 908a3ab5120SLouis Dionne , int> = 0> 909a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 910a3ab5120SLouis Dionne explicit tuple(allocator_arg_t, const _Alloc& __a, const pair<_Up1, _Up2>& __p) 911a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __a, __p) 912a3ab5120SLouis Dionne { } 913a3ab5120SLouis Dionne 914a3ab5120SLouis Dionne // tuple(pair<U1, U2>&&) constructors (including allocator_arg_t variants) 915a3ab5120SLouis Dionne template <class _Up1, class _Up2, class ..._DependentTp> 916a3ab5120SLouis Dionne struct _EnableImplicitMoveFromPair : _And< 917a3ab5120SLouis Dionne is_constructible<_FirstType<_DependentTp...>, _Up1>, 918a3ab5120SLouis Dionne is_constructible<_SecondType<_DependentTp...>, _Up2>, 919a3ab5120SLouis Dionne is_convertible<_Up1, _FirstType<_DependentTp...> >, // explicit check 920a3ab5120SLouis Dionne is_convertible<_Up2, _SecondType<_DependentTp...> > 921a3ab5120SLouis Dionne > { }; 922a3ab5120SLouis Dionne 923a3ab5120SLouis Dionne template <class _Up1, class _Up2, class ..._DependentTp> 924a3ab5120SLouis Dionne struct _EnableExplicitMoveFromPair : _And< 925a3ab5120SLouis Dionne is_constructible<_FirstType<_DependentTp...>, _Up1>, 926a3ab5120SLouis Dionne is_constructible<_SecondType<_DependentTp...>, _Up2>, 927a3ab5120SLouis Dionne _Not<is_convertible<_Up1, _FirstType<_DependentTp...> > >, // explicit check 928a3ab5120SLouis Dionne _Not<is_convertible<_Up2, _SecondType<_DependentTp...> > > 929a3ab5120SLouis Dionne > { }; 930a3ab5120SLouis Dionne 931b4e88d4dSLouis Dionne template <class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t< 932a3ab5120SLouis Dionne _And< 933a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Tp) == 2>, 934a3ab5120SLouis Dionne _EnableImplicitMoveFromPair<_Up1, _Up2, _Tp...> 935a3ab5120SLouis Dionne >::value 936a3ab5120SLouis Dionne , int> = 0> 937ef89e8caSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 938a3ab5120SLouis Dionne tuple(pair<_Up1, _Up2>&& __p) 939a3ab5120SLouis Dionne _NOEXCEPT_((_And< 940a3ab5120SLouis Dionne is_nothrow_constructible<_FirstType<_Tp...>, _Up1>, 941a3ab5120SLouis Dionne is_nothrow_constructible<_SecondType<_Tp...>, _Up2> 942a3ab5120SLouis Dionne >::value)) 943a3ab5120SLouis Dionne : __base_(_VSTD::move(__p)) 944a3ab5120SLouis Dionne { } 945a3ab5120SLouis Dionne 946b4e88d4dSLouis Dionne template <class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t< 947a3ab5120SLouis Dionne _And< 948a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Tp) == 2>, 949a3ab5120SLouis Dionne _EnableExplicitMoveFromPair<_Up1, _Up2, _Tp...> 950a3ab5120SLouis Dionne >::value 951a3ab5120SLouis Dionne , int> = 0> 952ef89e8caSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 953a3ab5120SLouis Dionne explicit tuple(pair<_Up1, _Up2>&& __p) 954a3ab5120SLouis Dionne _NOEXCEPT_((_And< 955a3ab5120SLouis Dionne is_nothrow_constructible<_FirstType<_Tp...>, _Up1>, 956a3ab5120SLouis Dionne is_nothrow_constructible<_SecondType<_Tp...>, _Up2> 957a3ab5120SLouis Dionne >::value)) 958a3ab5120SLouis Dionne : __base_(_VSTD::move(__p)) 959a3ab5120SLouis Dionne { } 960a3ab5120SLouis Dionne 961b4e88d4dSLouis Dionne template <class _Alloc, class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t< 962a3ab5120SLouis Dionne _And< 963a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Tp) == 2>, 964a3ab5120SLouis Dionne _EnableImplicitMoveFromPair<_Up1, _Up2, _Tp...> 965a3ab5120SLouis Dionne >::value 966a3ab5120SLouis Dionne , int> = 0> 967a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 968a3ab5120SLouis Dionne tuple(allocator_arg_t, const _Alloc& __a, pair<_Up1, _Up2>&& __p) 969a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __a, _VSTD::move(__p)) 970a3ab5120SLouis Dionne { } 971a3ab5120SLouis Dionne 972b4e88d4dSLouis Dionne template <class _Alloc, class _Up1, class _Up2, template<class...> class _And = _And, __enable_if_t< 973a3ab5120SLouis Dionne _And< 974a3ab5120SLouis Dionne _BoolConstant<sizeof...(_Tp) == 2>, 975a3ab5120SLouis Dionne _EnableExplicitMoveFromPair<_Up1, _Up2, _Tp...> 976a3ab5120SLouis Dionne >::value 977a3ab5120SLouis Dionne , int> = 0> 978a3ab5120SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 979a3ab5120SLouis Dionne explicit tuple(allocator_arg_t, const _Alloc& __a, pair<_Up1, _Up2>&& __p) 980a3ab5120SLouis Dionne : __base_(allocator_arg_t(), __a, _VSTD::move(__p)) 981a3ab5120SLouis Dionne { } 9829795699aSEric Fiselier 983a0839b14SLouis Dionne // [tuple.assign] 98406e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 985a0839b14SLouis Dionne tuple& operator=(_If<_And<is_copy_assignable<_Tp>...>::value, tuple, __nat> const& __tuple) 986a0839b14SLouis Dionne _NOEXCEPT_((_And<is_nothrow_copy_assignable<_Tp>...>::value)) 987aedcbf89SEric Fiselier { 988a0839b14SLouis Dionne _VSTD::__memberwise_copy_assign(*this, __tuple, 989a0839b14SLouis Dionne typename __make_tuple_indices<sizeof...(_Tp)>::type()); 990aedcbf89SEric Fiselier return *this; 991aedcbf89SEric Fiselier } 992aedcbf89SEric Fiselier 99306e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 994a0839b14SLouis Dionne tuple& operator=(_If<_And<is_move_assignable<_Tp>...>::value, tuple, __nat>&& __tuple) 995a0839b14SLouis Dionne _NOEXCEPT_((_And<is_nothrow_move_assignable<_Tp>...>::value)) 996aedcbf89SEric Fiselier { 997a0839b14SLouis Dionne _VSTD::__memberwise_forward_assign(*this, _VSTD::move(__tuple), 998a0839b14SLouis Dionne __tuple_types<_Tp...>(), 999a0839b14SLouis Dionne typename __make_tuple_indices<sizeof...(_Tp)>::type()); 1000aedcbf89SEric Fiselier return *this; 1001aedcbf89SEric Fiselier } 1002aedcbf89SEric Fiselier 1003b4e88d4dSLouis Dionne template<class... _Up, __enable_if_t< 1004a0839b14SLouis Dionne _And< 1005a0839b14SLouis Dionne _BoolConstant<sizeof...(_Tp) == sizeof...(_Up)>, 1006a0839b14SLouis Dionne is_assignable<_Tp&, _Up const&>... 1007a0839b14SLouis Dionne >::value 1008a0839b14SLouis Dionne ,int> = 0> 100906e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 1010a0839b14SLouis Dionne tuple& operator=(tuple<_Up...> const& __tuple) 1011a0839b14SLouis Dionne _NOEXCEPT_((_And<is_nothrow_assignable<_Tp&, _Up const&>...>::value)) 10123e519524SHoward Hinnant { 1013a0839b14SLouis Dionne _VSTD::__memberwise_copy_assign(*this, __tuple, 1014a0839b14SLouis Dionne typename __make_tuple_indices<sizeof...(_Tp)>::type()); 10153e519524SHoward Hinnant return *this; 10163e519524SHoward Hinnant } 10173e519524SHoward Hinnant 1018b4e88d4dSLouis Dionne template<class... _Up, __enable_if_t< 1019a0839b14SLouis Dionne _And< 1020a0839b14SLouis Dionne _BoolConstant<sizeof...(_Tp) == sizeof...(_Up)>, 1021a0839b14SLouis Dionne is_assignable<_Tp&, _Up>... 1022a0839b14SLouis Dionne >::value 1023a0839b14SLouis Dionne ,int> = 0> 102406e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 1025a0839b14SLouis Dionne tuple& operator=(tuple<_Up...>&& __tuple) 1026a0839b14SLouis Dionne _NOEXCEPT_((_And<is_nothrow_assignable<_Tp&, _Up>...>::value)) 1027a0839b14SLouis Dionne { 1028a0839b14SLouis Dionne _VSTD::__memberwise_forward_assign(*this, _VSTD::move(__tuple), 1029a0839b14SLouis Dionne __tuple_types<_Up...>(), 1030a0839b14SLouis Dionne typename __make_tuple_indices<sizeof...(_Tp)>::type()); 1031a0839b14SLouis Dionne return *this; 1032a0839b14SLouis Dionne } 1033a0839b14SLouis Dionne 1034b4e88d4dSLouis Dionne template<class _Up1, class _Up2, class _Dep = true_type, __enable_if_t< 1035a0839b14SLouis Dionne _And<_Dep, 1036a0839b14SLouis Dionne _BoolConstant<sizeof...(_Tp) == 2>, 1037a0839b14SLouis Dionne is_assignable<_FirstType<_Tp..., _Dep>&, _Up1 const&>, 1038a0839b14SLouis Dionne is_assignable<_SecondType<_Tp..., _Dep>&, _Up2 const&> 1039a0839b14SLouis Dionne >::value 1040a0839b14SLouis Dionne ,int> = 0> 104106e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 1042a0839b14SLouis Dionne tuple& operator=(pair<_Up1, _Up2> const& __pair) 1043a0839b14SLouis Dionne _NOEXCEPT_((_And< 1044a0839b14SLouis Dionne is_nothrow_assignable<_FirstType<_Tp...>&, _Up1 const&>, 1045a0839b14SLouis Dionne is_nothrow_assignable<_SecondType<_Tp...>&, _Up2 const&> 1046a0839b14SLouis Dionne >::value)) 1047a0839b14SLouis Dionne { 1048a0839b14SLouis Dionne _VSTD::get<0>(*this) = __pair.first; 1049a0839b14SLouis Dionne _VSTD::get<1>(*this) = __pair.second; 1050a0839b14SLouis Dionne return *this; 1051a0839b14SLouis Dionne } 1052a0839b14SLouis Dionne 1053b4e88d4dSLouis Dionne template<class _Up1, class _Up2, class _Dep = true_type, __enable_if_t< 1054a0839b14SLouis Dionne _And<_Dep, 1055a0839b14SLouis Dionne _BoolConstant<sizeof...(_Tp) == 2>, 1056a0839b14SLouis Dionne is_assignable<_FirstType<_Tp..., _Dep>&, _Up1>, 1057a0839b14SLouis Dionne is_assignable<_SecondType<_Tp..., _Dep>&, _Up2> 1058a0839b14SLouis Dionne >::value 1059a0839b14SLouis Dionne ,int> = 0> 106006e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 1061a0839b14SLouis Dionne tuple& operator=(pair<_Up1, _Up2>&& __pair) 1062a0839b14SLouis Dionne _NOEXCEPT_((_And< 1063a0839b14SLouis Dionne is_nothrow_assignable<_FirstType<_Tp...>&, _Up1>, 1064a0839b14SLouis Dionne is_nothrow_assignable<_SecondType<_Tp...>&, _Up2> 1065a0839b14SLouis Dionne >::value)) 1066a0839b14SLouis Dionne { 1067618862e8SLouis Dionne _VSTD::get<0>(*this) = _VSTD::forward<_Up1>(__pair.first); 1068618862e8SLouis Dionne _VSTD::get<1>(*this) = _VSTD::forward<_Up2>(__pair.second); 1069a0839b14SLouis Dionne return *this; 1070a0839b14SLouis Dionne } 1071a0839b14SLouis Dionne 1072a0839b14SLouis Dionne // EXTENSION 1073b4e88d4dSLouis Dionne template<class _Up, size_t _Np, class = __enable_if_t< 1074a0839b14SLouis Dionne _And< 1075a0839b14SLouis Dionne _BoolConstant<_Np == sizeof...(_Tp)>, 1076a0839b14SLouis Dionne is_assignable<_Tp&, _Up const&>... 1077a0839b14SLouis Dionne >::value 1078a0839b14SLouis Dionne > > 107906e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 1080a0839b14SLouis Dionne tuple& operator=(array<_Up, _Np> const& __array) 1081a0839b14SLouis Dionne _NOEXCEPT_((_And<is_nothrow_assignable<_Tp&, _Up const&>...>::value)) 1082a0839b14SLouis Dionne { 1083a0839b14SLouis Dionne _VSTD::__memberwise_copy_assign(*this, __array, 1084a0839b14SLouis Dionne typename __make_tuple_indices<sizeof...(_Tp)>::type()); 1085a0839b14SLouis Dionne return *this; 1086a0839b14SLouis Dionne } 1087a0839b14SLouis Dionne 1088a0839b14SLouis Dionne // EXTENSION 1089b4e88d4dSLouis Dionne template<class _Up, size_t _Np, class = void, class = __enable_if_t< 1090a0839b14SLouis Dionne _And< 1091a0839b14SLouis Dionne _BoolConstant<_Np == sizeof...(_Tp)>, 1092a0839b14SLouis Dionne is_assignable<_Tp&, _Up>... 1093a0839b14SLouis Dionne >::value 1094a0839b14SLouis Dionne > > 109506e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 1096a0839b14SLouis Dionne tuple& operator=(array<_Up, _Np>&& __array) 1097a0839b14SLouis Dionne _NOEXCEPT_((_And<is_nothrow_assignable<_Tp&, _Up>...>::value)) 1098a0839b14SLouis Dionne { 1099a0839b14SLouis Dionne _VSTD::__memberwise_forward_assign(*this, _VSTD::move(__array), 1100a0839b14SLouis Dionne __tuple_types<_If<true, _Up, _Tp>...>(), 1101a0839b14SLouis Dionne typename __make_tuple_indices<sizeof...(_Tp)>::type()); 1102a0839b14SLouis Dionne return *this; 1103a0839b14SLouis Dionne } 1104a0839b14SLouis Dionne 1105a0839b14SLouis Dionne // [tuple.swap] 110606e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 110727d0a2a7SHoward Hinnant void swap(tuple& __t) _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value) 1108def3c375SEric Fiselier {__base_.swap(__t.__base_);} 11093e519524SHoward Hinnant}; 11103e519524SHoward Hinnant 11113e519524SHoward Hinnanttemplate <> 1112e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS tuple<> 11133e519524SHoward Hinnant{ 11143e519524SHoward Hinnantpublic: 111506e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY constexpr 111606e2b737SArthur O'Dwyer tuple() _NOEXCEPT = default; 11173e519524SHoward Hinnant template <class _Alloc> 111806e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 11198a9ee148SHoward Hinnant tuple(allocator_arg_t, const _Alloc&) _NOEXCEPT {} 11203e519524SHoward Hinnant template <class _Alloc> 112106e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 11228a9ee148SHoward Hinnant tuple(allocator_arg_t, const _Alloc&, const tuple&) _NOEXCEPT {} 1123c003db1fSHoward Hinnant template <class _Up> 112406e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 11258a9ee148SHoward Hinnant tuple(array<_Up, 0>) _NOEXCEPT {} 1126c003db1fSHoward Hinnant template <class _Alloc, class _Up> 112706e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 11288a9ee148SHoward Hinnant tuple(allocator_arg_t, const _Alloc&, array<_Up, 0>) _NOEXCEPT {} 112906e2b737SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 113027d0a2a7SHoward Hinnant void swap(tuple&) _NOEXCEPT {} 11313e519524SHoward Hinnant}; 11323e519524SHoward Hinnant 1133*d2baefaeSJoe Loser#if _LIBCPP_STD_VER > 20 1134311207bbSNikolas Klausertemplate <class... _TTypes, class... _UTypes, template<class> class _TQual, template<class> class _UQual> 1135311207bbSNikolas Klauser requires requires { typename tuple<common_reference_t<_TQual<_TTypes>, _UQual<_UTypes>>...>; } 1136311207bbSNikolas Klauserstruct basic_common_reference<tuple<_TTypes...>, tuple<_UTypes...>, _TQual, _UQual> { 1137311207bbSNikolas Klauser using type = tuple<common_reference_t<_TQual<_TTypes>, _UQual<_UTypes>>...>; 1138311207bbSNikolas Klauser}; 1139311207bbSNikolas Klauser 1140311207bbSNikolas Klausertemplate <class... _TTypes, class... _UTypes> 1141311207bbSNikolas Klauser requires requires { typename tuple<common_type_t<_TTypes, _UTypes>...>; } 1142311207bbSNikolas Klauserstruct common_type<tuple<_TTypes...>, tuple<_UTypes...>> { 1143311207bbSNikolas Klauser using type = tuple<common_type_t<_TTypes, _UTypes>...>; 1144311207bbSNikolas Klauser}; 1145*d2baefaeSJoe Loser#endif // _LIBCPP_STD_VER > 20 1146311207bbSNikolas Klauser 1147311207bbSNikolas Klauser#if _LIBCPP_STD_VER > 14 11481308011eSLouis Dionnetemplate <class ..._Tp> 11491308011eSLouis Dionnetuple(_Tp...) -> tuple<_Tp...>; 11501308011eSLouis Dionnetemplate <class _Tp1, class _Tp2> 11511308011eSLouis Dionnetuple(pair<_Tp1, _Tp2>) -> tuple<_Tp1, _Tp2>; 11521308011eSLouis Dionnetemplate <class _Alloc, class ..._Tp> 11531308011eSLouis Dionnetuple(allocator_arg_t, _Alloc, _Tp...) -> tuple<_Tp...>; 11541308011eSLouis Dionnetemplate <class _Alloc, class _Tp1, class _Tp2> 11551308011eSLouis Dionnetuple(allocator_arg_t, _Alloc, pair<_Tp1, _Tp2>) -> tuple<_Tp1, _Tp2>; 11561308011eSLouis Dionnetemplate <class _Alloc, class ..._Tp> 11571308011eSLouis Dionnetuple(allocator_arg_t, _Alloc, tuple<_Tp...>) -> tuple<_Tp...>; 1158baaee206SEric Fiselier#endif 1159baaee206SEric Fiselier 11603e519524SHoward Hinnanttemplate <class ..._Tp> 116106e2b737SArthur O'Dwyerinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 1162bc95cf0dSHoward Hinnanttypename enable_if 1163bc95cf0dSHoward Hinnant< 1164bc95cf0dSHoward Hinnant __all<__is_swappable<_Tp>::value...>::value, 11653e519524SHoward Hinnant void 1166bc95cf0dSHoward Hinnant>::type 116727d0a2a7SHoward Hinnantswap(tuple<_Tp...>& __t, tuple<_Tp...>& __u) 116827d0a2a7SHoward Hinnant _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value) 116927d0a2a7SHoward Hinnant {__t.swap(__u);} 11703e519524SHoward Hinnant 11713e519524SHoward Hinnant// get 11723e519524SHoward Hinnant 11733e519524SHoward Hinnanttemplate <size_t _Ip, class ..._Tp> 11748bf1f08aSMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 11753e519524SHoward Hinnanttypename tuple_element<_Ip, tuple<_Tp...> >::type& 1176c206366fSHoward Hinnantget(tuple<_Tp...>& __t) _NOEXCEPT 11773e519524SHoward Hinnant{ 11783557c7c1SLouis Dionne typedef _LIBCPP_NODEBUG typename tuple_element<_Ip, tuple<_Tp...> >::type type; 1179def3c375SEric Fiselier return static_cast<__tuple_leaf<_Ip, type>&>(__t.__base_).get(); 11803e519524SHoward Hinnant} 11813e519524SHoward Hinnant 11823e519524SHoward Hinnanttemplate <size_t _Ip, class ..._Tp> 11838bf1f08aSMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 11843e519524SHoward Hinnantconst typename tuple_element<_Ip, tuple<_Tp...> >::type& 1185c206366fSHoward Hinnantget(const tuple<_Tp...>& __t) _NOEXCEPT 11863e519524SHoward Hinnant{ 11873557c7c1SLouis Dionne typedef _LIBCPP_NODEBUG typename tuple_element<_Ip, tuple<_Tp...> >::type type; 1188def3c375SEric Fiselier return static_cast<const __tuple_leaf<_Ip, type>&>(__t.__base_).get(); 11893e519524SHoward Hinnant} 11903e519524SHoward Hinnant 1191601afb30SHoward Hinnanttemplate <size_t _Ip, class ..._Tp> 11928bf1f08aSMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1193601afb30SHoward Hinnanttypename tuple_element<_Ip, tuple<_Tp...> >::type&& 1194c206366fSHoward Hinnantget(tuple<_Tp...>&& __t) _NOEXCEPT 1195601afb30SHoward Hinnant{ 11963557c7c1SLouis Dionne typedef _LIBCPP_NODEBUG typename tuple_element<_Ip, tuple<_Tp...> >::type type; 11972a3f1bc1SHoward Hinnant return static_cast<type&&>( 1198def3c375SEric Fiselier static_cast<__tuple_leaf<_Ip, type>&&>(__t.__base_).get()); 1199601afb30SHoward Hinnant} 1200601afb30SHoward Hinnant 1201545b8861SEric Fiseliertemplate <size_t _Ip, class ..._Tp> 1202545b8861SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1203545b8861SEric Fiselierconst typename tuple_element<_Ip, tuple<_Tp...> >::type&& 1204545b8861SEric Fiselierget(const tuple<_Tp...>&& __t) _NOEXCEPT 1205545b8861SEric Fiselier{ 12063557c7c1SLouis Dionne typedef _LIBCPP_NODEBUG typename tuple_element<_Ip, tuple<_Tp...> >::type type; 1207545b8861SEric Fiselier return static_cast<const type&&>( 1208def3c375SEric Fiselier static_cast<const __tuple_leaf<_Ip, type>&&>(__t.__base_).get()); 1209545b8861SEric Fiselier} 1210545b8861SEric Fiselier 1211e99520c7SMarshall Clow#if _LIBCPP_STD_VER > 11 1212e99520c7SMarshall Clow 1213f447e62eSEric Fiseliernamespace __find_detail { 1214f447e62eSEric Fiselier 1215f86570cdSLouis Dionnestatic constexpr size_t __not_found = static_cast<size_t>(-1); 1216f447e62eSEric Fiselierstatic constexpr size_t __ambiguous = __not_found - 1; 1217f447e62eSEric Fiselier 1218f447e62eSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 1219f447e62eSEric Fiselierconstexpr size_t __find_idx_return(size_t __curr_i, size_t __res, bool __matches) { 1220f447e62eSEric Fiselier return !__matches ? __res : 1221f447e62eSEric Fiselier (__res == __not_found ? __curr_i : __ambiguous); 1222f447e62eSEric Fiselier} 1223f447e62eSEric Fiselier 1224f447e62eSEric Fiseliertemplate <size_t _Nx> 1225f447e62eSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 1226f447e62eSEric Fiselierconstexpr size_t __find_idx(size_t __i, const bool (&__matches)[_Nx]) { 1227f447e62eSEric Fiselier return __i == _Nx ? __not_found : 1228f447e62eSEric Fiselier __find_idx_return(__i, __find_idx(__i + 1, __matches), __matches[__i]); 1229f447e62eSEric Fiselier} 1230f447e62eSEric Fiselier 1231f447e62eSEric Fiseliertemplate <class _T1, class ..._Args> 1232f447e62eSEric Fiselierstruct __find_exactly_one_checked { 123300c872f3SCasey Carter static constexpr bool __matches[sizeof...(_Args)] = {is_same<_T1, _Args>::value...}; 1234f447e62eSEric Fiselier static constexpr size_t value = __find_detail::__find_idx(0, __matches); 1235f447e62eSEric Fiselier static_assert(value != __not_found, "type not found in type list" ); 1236f447e62eSEric Fiselier static_assert(value != __ambiguous, "type occurs more than once in type list"); 1237e99520c7SMarshall Clow}; 1238e99520c7SMarshall Clow 12394f905b8dSEric Fiseliertemplate <class _T1> 12404f905b8dSEric Fiselierstruct __find_exactly_one_checked<_T1> { 12414f905b8dSEric Fiselier static_assert(!is_same<_T1, _T1>::value, "type not in empty type list"); 12424f905b8dSEric Fiselier}; 12434f905b8dSEric Fiselier 1244d2b0df35SNikolas Klauser} // namespace __find_detail 1245e99520c7SMarshall Clow 1246e99520c7SMarshall Clowtemplate <typename _T1, typename... _Args> 1247f447e62eSEric Fiselierstruct __find_exactly_one_t 1248f447e62eSEric Fiselier : public __find_detail::__find_exactly_one_checked<_T1, _Args...> { 1249e99520c7SMarshall Clow}; 1250e99520c7SMarshall Clow 1251e99520c7SMarshall Clowtemplate <class _T1, class... _Args> 1252e99520c7SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 1253e99520c7SMarshall Clowconstexpr _T1& get(tuple<_Args...>& __tup) noexcept 1254e99520c7SMarshall Clow{ 1255e99520c7SMarshall Clow return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(__tup); 1256e99520c7SMarshall Clow} 1257e99520c7SMarshall Clow 1258e99520c7SMarshall Clowtemplate <class _T1, class... _Args> 1259e99520c7SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 1260e99520c7SMarshall Clowconstexpr _T1 const& get(tuple<_Args...> const& __tup) noexcept 1261e99520c7SMarshall Clow{ 1262e99520c7SMarshall Clow return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(__tup); 1263e99520c7SMarshall Clow} 1264e99520c7SMarshall Clow 1265e99520c7SMarshall Clowtemplate <class _T1, class... _Args> 1266e99520c7SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 1267e99520c7SMarshall Clowconstexpr _T1&& get(tuple<_Args...>&& __tup) noexcept 1268e99520c7SMarshall Clow{ 12691c682f0fSMarshall Clow return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(_VSTD::move(__tup)); 1270e99520c7SMarshall Clow} 1271e99520c7SMarshall Clow 1272545b8861SEric Fiseliertemplate <class _T1, class... _Args> 1273545b8861SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 1274545b8861SEric Fiselierconstexpr _T1 const&& get(tuple<_Args...> const&& __tup) noexcept 1275545b8861SEric Fiselier{ 1276545b8861SEric Fiselier return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(_VSTD::move(__tup)); 1277545b8861SEric Fiselier} 1278545b8861SEric Fiselier 1279e99520c7SMarshall Clow#endif 1280e99520c7SMarshall Clow 12813e519524SHoward Hinnant// tie 12823e519524SHoward Hinnant 12833e519524SHoward Hinnanttemplate <class ..._Tp> 12840d1560e1SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 12853e519524SHoward Hinnanttuple<_Tp&...> 12868a9ee148SHoward Hinnanttie(_Tp&... __t) _NOEXCEPT 12873e519524SHoward Hinnant{ 12883e519524SHoward Hinnant return tuple<_Tp&...>(__t...); 12893e519524SHoward Hinnant} 12903e519524SHoward Hinnant 12913e519524SHoward Hinnanttemplate <class _Up> 12923e519524SHoward Hinnantstruct __ignore_t 12933e519524SHoward Hinnant{ 12943e519524SHoward Hinnant template <class _Tp> 12959af60c4aSEric Fiselier _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 12963e519524SHoward Hinnant const __ignore_t& operator=(_Tp&&) const {return *this;} 12973e519524SHoward Hinnant}; 12983e519524SHoward Hinnant 12999af60c4aSEric Fiseliernamespace { 1300cb793e1aSLouis Dionne constexpr __ignore_t<unsigned char> ignore = __ignore_t<unsigned char>(); 1301d2b0df35SNikolas Klauser} // namespace 13023e519524SHoward Hinnant 13033e519524SHoward Hinnanttemplate <class... _Tp> 130475eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1305bb9ca6d0SLouis Dionnetuple<typename __unwrap_ref_decay<_Tp>::type...> 13063e519524SHoward Hinnantmake_tuple(_Tp&&... __t) 13073e519524SHoward Hinnant{ 1308bb9ca6d0SLouis Dionne return tuple<typename __unwrap_ref_decay<_Tp>::type...>(_VSTD::forward<_Tp>(__t)...); 13093e519524SHoward Hinnant} 13103e519524SHoward Hinnant 13111102fbbdSHoward Hinnanttemplate <class... _Tp> 131275eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 131375eff748SMarshall Clowtuple<_Tp&&...> 13148a9ee148SHoward Hinnantforward_as_tuple(_Tp&&... __t) _NOEXCEPT 13151102fbbdSHoward Hinnant{ 1316ce48a113SHoward Hinnant return tuple<_Tp&&...>(_VSTD::forward<_Tp>(__t)...); 13171102fbbdSHoward Hinnant} 13181102fbbdSHoward Hinnant 1319c003db1fSHoward Hinnanttemplate <size_t _Ip> 13203e519524SHoward Hinnantstruct __tuple_equal 13213e519524SHoward Hinnant{ 13223e519524SHoward Hinnant template <class _Tp, class _Up> 132375eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 13243e519524SHoward Hinnant bool operator()(const _Tp& __x, const _Up& __y) 13253e519524SHoward Hinnant { 1326f9af6140SMarshall Clow return __tuple_equal<_Ip - 1>()(__x, __y) && _VSTD::get<_Ip-1>(__x) == _VSTD::get<_Ip-1>(__y); 13273e519524SHoward Hinnant } 13283e519524SHoward Hinnant}; 13293e519524SHoward Hinnant 13303e519524SHoward Hinnanttemplate <> 13313e519524SHoward Hinnantstruct __tuple_equal<0> 13323e519524SHoward Hinnant{ 13333e519524SHoward Hinnant template <class _Tp, class _Up> 133475eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 13353e519524SHoward Hinnant bool operator()(const _Tp&, const _Up&) 13363e519524SHoward Hinnant { 13373e519524SHoward Hinnant return true; 13383e519524SHoward Hinnant } 13393e519524SHoward Hinnant}; 13403e519524SHoward Hinnant 13413e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up> 134275eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 13433e519524SHoward Hinnantbool 13443e519524SHoward Hinnantoperator==(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 13453e519524SHoward Hinnant{ 1346aa09911aSMarshall Clow static_assert (sizeof...(_Tp) == sizeof...(_Up), "Can't compare tuples of different sizes"); 13473e519524SHoward Hinnant return __tuple_equal<sizeof...(_Tp)>()(__x, __y); 13483e519524SHoward Hinnant} 13493e519524SHoward Hinnant 1350*d2baefaeSJoe Loser#if _LIBCPP_STD_VER > 17 1351b80f2dfdSKent Ross 1352b80f2dfdSKent Ross// operator<=> 1353b80f2dfdSKent Ross 1354b80f2dfdSKent Rosstemplate <class ..._Tp, class ..._Up, size_t ..._Is> 1355b80f2dfdSKent Ross_LIBCPP_HIDE_FROM_ABI constexpr 1356b80f2dfdSKent Rossauto 1357b80f2dfdSKent Ross__tuple_compare_three_way(const tuple<_Tp...>& __x, const tuple<_Up...>& __y, index_sequence<_Is...>) { 1358b80f2dfdSKent Ross common_comparison_category_t<__synth_three_way_result<_Tp, _Up>...> __result = strong_ordering::equal; 1359b80f2dfdSKent Ross static_cast<void>(((__result = _VSTD::__synth_three_way(_VSTD::get<_Is>(__x), _VSTD::get<_Is>(__y)), __result != 0) || ...)); 1360b80f2dfdSKent Ross return __result; 1361b80f2dfdSKent Ross} 1362b80f2dfdSKent Ross 1363b80f2dfdSKent Rosstemplate <class ..._Tp, class ..._Up> 1364b80f2dfdSKent Rossrequires (sizeof...(_Tp) == sizeof...(_Up)) 1365b80f2dfdSKent Ross_LIBCPP_HIDE_FROM_ABI constexpr 1366b80f2dfdSKent Rosscommon_comparison_category_t<__synth_three_way_result<_Tp, _Up>...> 1367b80f2dfdSKent Rossoperator<=>(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 1368b80f2dfdSKent Ross{ 1369b80f2dfdSKent Ross return _VSTD::__tuple_compare_three_way(__x, __y, index_sequence_for<_Tp...>{}); 1370b80f2dfdSKent Ross} 1371b80f2dfdSKent Ross 1372*d2baefaeSJoe Loser#else // _LIBCPP_STD_VER > 17 1373b80f2dfdSKent Ross 13743e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up> 137575eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 13763e519524SHoward Hinnantbool 13773e519524SHoward Hinnantoperator!=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 13783e519524SHoward Hinnant{ 13793e519524SHoward Hinnant return !(__x == __y); 13803e519524SHoward Hinnant} 13813e519524SHoward Hinnant 1382c003db1fSHoward Hinnanttemplate <size_t _Ip> 13833e519524SHoward Hinnantstruct __tuple_less 13843e519524SHoward Hinnant{ 13853e519524SHoward Hinnant template <class _Tp, class _Up> 138675eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 13873e519524SHoward Hinnant bool operator()(const _Tp& __x, const _Up& __y) 13883e519524SHoward Hinnant { 138953afae49SDuncan P. N. Exon Smith const size_t __idx = tuple_size<_Tp>::value - _Ip; 139053afae49SDuncan P. N. Exon Smith if (_VSTD::get<__idx>(__x) < _VSTD::get<__idx>(__y)) 139153afae49SDuncan P. N. Exon Smith return true; 139253afae49SDuncan P. N. Exon Smith if (_VSTD::get<__idx>(__y) < _VSTD::get<__idx>(__x)) 139353afae49SDuncan P. N. Exon Smith return false; 139453afae49SDuncan P. N. Exon Smith return __tuple_less<_Ip-1>()(__x, __y); 13953e519524SHoward Hinnant } 13963e519524SHoward Hinnant}; 13973e519524SHoward Hinnant 13983e519524SHoward Hinnanttemplate <> 13993e519524SHoward Hinnantstruct __tuple_less<0> 14003e519524SHoward Hinnant{ 14013e519524SHoward Hinnant template <class _Tp, class _Up> 140275eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 14033e519524SHoward Hinnant bool operator()(const _Tp&, const _Up&) 14043e519524SHoward Hinnant { 14053e519524SHoward Hinnant return false; 14063e519524SHoward Hinnant } 14073e519524SHoward Hinnant}; 14083e519524SHoward Hinnant 14093e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up> 141075eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 14113e519524SHoward Hinnantbool 14123e519524SHoward Hinnantoperator<(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 14133e519524SHoward Hinnant{ 1414aa09911aSMarshall Clow static_assert (sizeof...(_Tp) == sizeof...(_Up), "Can't compare tuples of different sizes"); 14153e519524SHoward Hinnant return __tuple_less<sizeof...(_Tp)>()(__x, __y); 14163e519524SHoward Hinnant} 14173e519524SHoward Hinnant 14183e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up> 141975eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 14203e519524SHoward Hinnantbool 14213e519524SHoward Hinnantoperator>(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 14223e519524SHoward Hinnant{ 14233e519524SHoward Hinnant return __y < __x; 14243e519524SHoward Hinnant} 14253e519524SHoward Hinnant 14263e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up> 142775eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 14283e519524SHoward Hinnantbool 14293e519524SHoward Hinnantoperator>=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 14303e519524SHoward Hinnant{ 14313e519524SHoward Hinnant return !(__x < __y); 14323e519524SHoward Hinnant} 14333e519524SHoward Hinnant 14343e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up> 143575eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 14363e519524SHoward Hinnantbool 14373e519524SHoward Hinnantoperator<=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 14383e519524SHoward Hinnant{ 14393e519524SHoward Hinnant return !(__y < __x); 14403e519524SHoward Hinnant} 14413e519524SHoward Hinnant 1442*d2baefaeSJoe Loser#endif // _LIBCPP_STD_VER > 17 1443b80f2dfdSKent Ross 14443e519524SHoward Hinnant// tuple_cat 14453e519524SHoward Hinnant 14467f64810bSHoward Hinnanttemplate <class _Tp, class _Up> struct __tuple_cat_type; 14477f64810bSHoward Hinnant 14487f64810bSHoward Hinnanttemplate <class ..._Ttypes, class ..._Utypes> 14497f64810bSHoward Hinnantstruct __tuple_cat_type<tuple<_Ttypes...>, __tuple_types<_Utypes...> > 14503e519524SHoward Hinnant{ 14513557c7c1SLouis Dionne typedef _LIBCPP_NODEBUG tuple<_Ttypes..., _Utypes...> type; 14527f64810bSHoward Hinnant}; 14537f64810bSHoward Hinnant 14547f64810bSHoward Hinnanttemplate <class _ResultTuple, bool _Is_Tuple0TupleLike, class ..._Tuples> 14557f64810bSHoward Hinnantstruct __tuple_cat_return_1 14567f64810bSHoward Hinnant{ 14577f64810bSHoward Hinnant}; 14587f64810bSHoward Hinnant 14597f64810bSHoward Hinnanttemplate <class ..._Types, class _Tuple0> 14607f64810bSHoward Hinnantstruct __tuple_cat_return_1<tuple<_Types...>, true, _Tuple0> 14617f64810bSHoward Hinnant{ 1462f7558068SNikolas Klauser using type _LIBCPP_NODEBUG = typename __tuple_cat_type< 1463f7558068SNikolas Klauser tuple<_Types...>, 1464f7558068SNikolas Klauser typename __make_tuple_types<__uncvref_t<_Tuple0> >::type 1465f7558068SNikolas Klauser >::type; 14667f64810bSHoward Hinnant}; 14677f64810bSHoward Hinnant 14687f64810bSHoward Hinnanttemplate <class ..._Types, class _Tuple0, class _Tuple1, class ..._Tuples> 14697f64810bSHoward Hinnantstruct __tuple_cat_return_1<tuple<_Types...>, true, _Tuple0, _Tuple1, _Tuples...> 14707f64810bSHoward Hinnant : public __tuple_cat_return_1< 14717f64810bSHoward Hinnant typename __tuple_cat_type< 14727f64810bSHoward Hinnant tuple<_Types...>, 1473f7558068SNikolas Klauser typename __make_tuple_types<__uncvref_t<_Tuple0> >::type 14747f64810bSHoward Hinnant >::type, 14757f64810bSHoward Hinnant __tuple_like<typename remove_reference<_Tuple1>::type>::value, 14767f64810bSHoward Hinnant _Tuple1, _Tuples...> 14777f64810bSHoward Hinnant{ 14787f64810bSHoward Hinnant}; 14797f64810bSHoward Hinnant 14807f64810bSHoward Hinnanttemplate <class ..._Tuples> struct __tuple_cat_return; 14817f64810bSHoward Hinnant 14827f64810bSHoward Hinnanttemplate <class _Tuple0, class ..._Tuples> 14837f64810bSHoward Hinnantstruct __tuple_cat_return<_Tuple0, _Tuples...> 14847f64810bSHoward Hinnant : public __tuple_cat_return_1<tuple<>, 14857f64810bSHoward Hinnant __tuple_like<typename remove_reference<_Tuple0>::type>::value, _Tuple0, 14867f64810bSHoward Hinnant _Tuples...> 14877f64810bSHoward Hinnant{ 14887f64810bSHoward Hinnant}; 14897f64810bSHoward Hinnant 14907f64810bSHoward Hinnanttemplate <> 14917f64810bSHoward Hinnantstruct __tuple_cat_return<> 14927f64810bSHoward Hinnant{ 14933557c7c1SLouis Dionne typedef _LIBCPP_NODEBUG tuple<> type; 14947f64810bSHoward Hinnant}; 14957f64810bSHoward Hinnant 149675eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 14977f64810bSHoward Hinnanttuple<> 14987f64810bSHoward Hinnanttuple_cat() 14997f64810bSHoward Hinnant{ 15007f64810bSHoward Hinnant return tuple<>(); 15013e519524SHoward Hinnant} 15023e519524SHoward Hinnant 1503c003db1fSHoward Hinnanttemplate <class _Rp, class _Indices, class _Tuple0, class ..._Tuples> 1504ba31cbdbSHoward Hinnantstruct __tuple_cat_return_ref_imp; 15053e519524SHoward Hinnant 1506ba31cbdbSHoward Hinnanttemplate <class ..._Types, size_t ..._I0, class _Tuple0> 1507ba31cbdbSHoward Hinnantstruct __tuple_cat_return_ref_imp<tuple<_Types...>, __tuple_indices<_I0...>, _Tuple0> 15083e519524SHoward Hinnant{ 15093557c7c1SLouis Dionne typedef _LIBCPP_NODEBUG typename remove_reference<_Tuple0>::type _T0; 1510ba31cbdbSHoward Hinnant typedef tuple<_Types..., typename __apply_cv<_Tuple0, 1511ba31cbdbSHoward Hinnant typename tuple_element<_I0, _T0>::type>::type&&...> type; 1512ba31cbdbSHoward Hinnant}; 1513ba31cbdbSHoward Hinnant 1514ba31cbdbSHoward Hinnanttemplate <class ..._Types, size_t ..._I0, class _Tuple0, class _Tuple1, class ..._Tuples> 1515ba31cbdbSHoward Hinnantstruct __tuple_cat_return_ref_imp<tuple<_Types...>, __tuple_indices<_I0...>, 1516ba31cbdbSHoward Hinnant _Tuple0, _Tuple1, _Tuples...> 1517ba31cbdbSHoward Hinnant : public __tuple_cat_return_ref_imp< 1518ba31cbdbSHoward Hinnant tuple<_Types..., typename __apply_cv<_Tuple0, 1519ba31cbdbSHoward Hinnant typename tuple_element<_I0, 1520ba31cbdbSHoward Hinnant typename remove_reference<_Tuple0>::type>::type>::type&&...>, 1521ba31cbdbSHoward Hinnant typename __make_tuple_indices<tuple_size<typename 1522ba31cbdbSHoward Hinnant remove_reference<_Tuple1>::type>::value>::type, 1523ba31cbdbSHoward Hinnant _Tuple1, _Tuples...> 1524ba31cbdbSHoward Hinnant{ 1525ba31cbdbSHoward Hinnant}; 1526ba31cbdbSHoward Hinnant 1527ba31cbdbSHoward Hinnanttemplate <class _Tuple0, class ..._Tuples> 1528ba31cbdbSHoward Hinnantstruct __tuple_cat_return_ref 1529ba31cbdbSHoward Hinnant : public __tuple_cat_return_ref_imp<tuple<>, 1530ba31cbdbSHoward Hinnant typename __make_tuple_indices< 1531ba31cbdbSHoward Hinnant tuple_size<typename remove_reference<_Tuple0>::type>::value 1532ba31cbdbSHoward Hinnant >::type, _Tuple0, _Tuples...> 1533ba31cbdbSHoward Hinnant{ 1534ba31cbdbSHoward Hinnant}; 1535ba31cbdbSHoward Hinnant 1536ba31cbdbSHoward Hinnanttemplate <class _Types, class _I0, class _J0> 1537ba31cbdbSHoward Hinnantstruct __tuple_cat; 1538ba31cbdbSHoward Hinnant 1539ba31cbdbSHoward Hinnanttemplate <class ..._Types, size_t ..._I0, size_t ..._J0> 1540ba31cbdbSHoward Hinnantstruct __tuple_cat<tuple<_Types...>, __tuple_indices<_I0...>, __tuple_indices<_J0...> > 1541ba31cbdbSHoward Hinnant{ 1542ba31cbdbSHoward Hinnant template <class _Tuple0> 154375eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1544ba31cbdbSHoward Hinnant typename __tuple_cat_return_ref<tuple<_Types...>&&, _Tuple0&&>::type 1545ba31cbdbSHoward Hinnant operator()(tuple<_Types...> __t, _Tuple0&& __t0) 1546ba31cbdbSHoward Hinnant { 1547e658b3ebSDavid Blaikie return _VSTD::forward_as_tuple( 1548e658b3ebSDavid Blaikie _VSTD::forward<_Types>(_VSTD::get<_I0>(__t))..., 1549f9af6140SMarshall Clow _VSTD::get<_J0>(_VSTD::forward<_Tuple0>(__t0))...); 15503e519524SHoward Hinnant } 15513e519524SHoward Hinnant 15527f64810bSHoward Hinnant template <class _Tuple0, class _Tuple1, class ..._Tuples> 155375eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1554ba31cbdbSHoward Hinnant typename __tuple_cat_return_ref<tuple<_Types...>&&, _Tuple0&&, _Tuple1&&, _Tuples&&...>::type 1555ba31cbdbSHoward Hinnant operator()(tuple<_Types...> __t, _Tuple0&& __t0, _Tuple1&& __t1, _Tuples&& ...__tpls) 15563e519524SHoward Hinnant { 15573557c7c1SLouis Dionne typedef _LIBCPP_NODEBUG typename remove_reference<_Tuple0>::type _T0; 15583557c7c1SLouis Dionne typedef _LIBCPP_NODEBUG typename remove_reference<_Tuple1>::type _T1; 1559ba31cbdbSHoward Hinnant return __tuple_cat< 1560e658b3ebSDavid Blaikie tuple<_Types..., 1561e658b3ebSDavid Blaikie typename __apply_cv<_Tuple0, typename tuple_element< 1562e658b3ebSDavid Blaikie _J0, _T0>::type>::type&&...>, 1563e658b3ebSDavid Blaikie typename __make_tuple_indices<sizeof...(_Types) + 1564e658b3ebSDavid Blaikie tuple_size<_T0>::value>::type, 1565e658b3ebSDavid Blaikie typename __make_tuple_indices<tuple_size<_T1>::value>::type>()( 1566e658b3ebSDavid Blaikie _VSTD::forward_as_tuple( 1567f9af6140SMarshall Clow _VSTD::forward<_Types>(_VSTD::get<_I0>(__t))..., 1568e658b3ebSDavid Blaikie _VSTD::get<_J0>(_VSTD::forward<_Tuple0>(__t0))...), 1569e658b3ebSDavid Blaikie _VSTD::forward<_Tuple1>(__t1), _VSTD::forward<_Tuples>(__tpls)...); 1570ba31cbdbSHoward Hinnant } 1571ba31cbdbSHoward Hinnant}; 1572ba31cbdbSHoward Hinnant 1573ba31cbdbSHoward Hinnanttemplate <class _Tuple0, class... _Tuples> 157475eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1575ba31cbdbSHoward Hinnanttypename __tuple_cat_return<_Tuple0, _Tuples...>::type 1576ba31cbdbSHoward Hinnanttuple_cat(_Tuple0&& __t0, _Tuples&&... __tpls) 1577ba31cbdbSHoward Hinnant{ 15783557c7c1SLouis Dionne typedef _LIBCPP_NODEBUG typename remove_reference<_Tuple0>::type _T0; 1579ba31cbdbSHoward Hinnant return __tuple_cat<tuple<>, __tuple_indices<>, 1580ba31cbdbSHoward Hinnant typename __make_tuple_indices<tuple_size<_T0>::value>::type>() 1581ce48a113SHoward Hinnant (tuple<>(), _VSTD::forward<_Tuple0>(__t0), 1582ce48a113SHoward Hinnant _VSTD::forward<_Tuples>(__tpls)...); 15833e519524SHoward Hinnant} 15843e519524SHoward Hinnant 15853e519524SHoward Hinnanttemplate <class ..._Tp, class _Alloc> 1586e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS uses_allocator<tuple<_Tp...>, _Alloc> 15873e519524SHoward Hinnant : true_type {}; 15883e519524SHoward Hinnant 15893e519524SHoward Hinnanttemplate <class _T1, class _T2> 15903e519524SHoward Hinnanttemplate <class... _Args1, class... _Args2, size_t ..._I1, size_t ..._I2> 1591737a4501SMichael Schellenberger Costainline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 15923e519524SHoward Hinnantpair<_T1, _T2>::pair(piecewise_construct_t, 15933e519524SHoward Hinnant tuple<_Args1...>& __first_args, tuple<_Args2...>& __second_args, 15943e519524SHoward Hinnant __tuple_indices<_I1...>, __tuple_indices<_I2...>) 1595f9af6140SMarshall Clow : first(_VSTD::forward<_Args1>(_VSTD::get<_I1>( __first_args))...), 1596f9af6140SMarshall Clow second(_VSTD::forward<_Args2>(_VSTD::get<_I2>(__second_args))...) 15973e519524SHoward Hinnant{ 15983e519524SHoward Hinnant} 15993e519524SHoward Hinnant 160003e29a29SEric Fiselier#if _LIBCPP_STD_VER > 14 160103e29a29SEric Fiseliertemplate <class _Tp> 1602cb793e1aSLouis Dionneinline constexpr size_t tuple_size_v = tuple_size<_Tp>::value; 160303e29a29SEric Fiselier 160403e29a29SEric Fiselier#define _LIBCPP_NOEXCEPT_RETURN(...) noexcept(noexcept(__VA_ARGS__)) { return __VA_ARGS__; } 160503e29a29SEric Fiselier 160603e29a29SEric Fiseliertemplate <class _Fn, class _Tuple, size_t ..._Id> 160703e29a29SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 160803e29a29SEric Fiselierconstexpr decltype(auto) __apply_tuple_impl(_Fn && __f, _Tuple && __t, 160903e29a29SEric Fiselier __tuple_indices<_Id...>) 161003e29a29SEric Fiselier_LIBCPP_NOEXCEPT_RETURN( 161103e29a29SEric Fiselier _VSTD::__invoke_constexpr( 161203e29a29SEric Fiselier _VSTD::forward<_Fn>(__f), 161303e29a29SEric Fiselier _VSTD::get<_Id>(_VSTD::forward<_Tuple>(__t))...) 161403e29a29SEric Fiselier) 161503e29a29SEric Fiselier 161603e29a29SEric Fiseliertemplate <class _Fn, class _Tuple> 161703e29a29SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 161803e29a29SEric Fiselierconstexpr decltype(auto) apply(_Fn && __f, _Tuple && __t) 161903e29a29SEric Fiselier_LIBCPP_NOEXCEPT_RETURN( 162003e29a29SEric Fiselier _VSTD::__apply_tuple_impl( 162103e29a29SEric Fiselier _VSTD::forward<_Fn>(__f), _VSTD::forward<_Tuple>(__t), 1622655c4695SMarshall Clow typename __make_tuple_indices<tuple_size_v<remove_reference_t<_Tuple>>>::type{}) 162303e29a29SEric Fiselier) 162403e29a29SEric Fiselier 162503e29a29SEric Fiseliertemplate <class _Tp, class _Tuple, size_t... _Idx> 162603e29a29SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 162703e29a29SEric Fiselierconstexpr _Tp __make_from_tuple_impl(_Tuple&& __t, __tuple_indices<_Idx...>) 162803e29a29SEric Fiselier_LIBCPP_NOEXCEPT_RETURN( 162903e29a29SEric Fiselier _Tp(_VSTD::get<_Idx>(_VSTD::forward<_Tuple>(__t))...) 163003e29a29SEric Fiselier) 163103e29a29SEric Fiselier 163203e29a29SEric Fiseliertemplate <class _Tp, class _Tuple> 163303e29a29SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 163403e29a29SEric Fiselierconstexpr _Tp make_from_tuple(_Tuple&& __t) 163503e29a29SEric Fiselier_LIBCPP_NOEXCEPT_RETURN( 163603e29a29SEric Fiselier _VSTD::__make_from_tuple_impl<_Tp>(_VSTD::forward<_Tuple>(__t), 1637655c4695SMarshall Clow typename __make_tuple_indices<tuple_size_v<remove_reference_t<_Tuple>>>::type{}) 163803e29a29SEric Fiselier) 163903e29a29SEric Fiselier 164003e29a29SEric Fiselier#undef _LIBCPP_NOEXCEPT_RETURN 164103e29a29SEric Fiselier 164203e29a29SEric Fiselier#endif // _LIBCPP_STD_VER > 14 164303e29a29SEric Fiselier 164429870871SEric Fiselier#endif // !defined(_LIBCPP_CXX03_LANG) 164529870871SEric Fiselier 16463e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 16473e519524SHoward Hinnant 16483e519524SHoward Hinnant#endif // _LIBCPP_TUPLE 1649