xref: /llvm-project-15.0.7/libcxx/include/tuple (revision d2baefae)
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