xref: /llvm-project-15.0.7/libcxx/include/tuple (revision e2f2d1ed)
13e519524SHoward Hinnant// -*- C++ -*-
23e519524SHoward Hinnant//===--------------------------- tuple ------------------------------------===//
33e519524SHoward Hinnant//
45b08a8a4SHoward Hinnant//                     The LLVM Compiler Infrastructure
53e519524SHoward Hinnant//
63e519524SHoward Hinnant// This file is distributed under the University of Illinois Open Source
73e519524SHoward Hinnant// License. See LICENSE.TXT for details.
83e519524SHoward Hinnant//
93e519524SHoward Hinnant//===----------------------------------------------------------------------===//
103e519524SHoward Hinnant
113e519524SHoward Hinnant#ifndef _LIBCPP_TUPLE
123e519524SHoward Hinnant#define _LIBCPP_TUPLE
133e519524SHoward Hinnant
143e519524SHoward Hinnant/*
153e519524SHoward Hinnant    tuple synopsis
163e519524SHoward Hinnant
173e519524SHoward Hinnantnamespace std
183e519524SHoward Hinnant{
193e519524SHoward Hinnant
203e519524SHoward Hinnanttemplate <class... T>
213e519524SHoward Hinnantclass tuple {
223e519524SHoward Hinnantpublic:
233e519524SHoward Hinnant    constexpr tuple();
2475eff748SMarshall Clow    explicit tuple(const T&...);  // constexpr in C++14
253e519524SHoward Hinnant    template <class... U>
2675eff748SMarshall Clow        explicit tuple(U&&...);  // constexpr in C++14
273e519524SHoward Hinnant    tuple(const tuple&) = default;
2827d0a2a7SHoward Hinnant    tuple(tuple&&) = default;
293e519524SHoward Hinnant    template <class... U>
3075eff748SMarshall Clow        tuple(const tuple<U...>&);  // constexpr in C++14
313e519524SHoward Hinnant    template <class... U>
3275eff748SMarshall Clow        tuple(tuple<U...>&&);  // constexpr in C++14
333e519524SHoward Hinnant    template <class U1, class U2>
3475eff748SMarshall Clow        tuple(const pair<U1, U2>&); // iff sizeof...(T) == 2 // constexpr in C++14
353e519524SHoward Hinnant    template <class U1, class U2>
3675eff748SMarshall Clow        tuple(pair<U1, U2>&&); // iff sizeof...(T) == 2  // constexpr in C++14
373e519524SHoward Hinnant
383e519524SHoward Hinnant    // allocator-extended constructors
393e519524SHoward Hinnant    template <class Alloc>
403e519524SHoward Hinnant        tuple(allocator_arg_t, const Alloc& a);
413e519524SHoward Hinnant    template <class Alloc>
423e519524SHoward Hinnant        tuple(allocator_arg_t, const Alloc& a, const T&...);
433e519524SHoward Hinnant    template <class Alloc, class... U>
443e519524SHoward Hinnant        tuple(allocator_arg_t, const Alloc& a, U&&...);
453e519524SHoward Hinnant    template <class Alloc>
463e519524SHoward Hinnant        tuple(allocator_arg_t, const Alloc& a, const tuple&);
473e519524SHoward Hinnant    template <class Alloc>
483e519524SHoward Hinnant        tuple(allocator_arg_t, const Alloc& a, tuple&&);
493e519524SHoward Hinnant    template <class Alloc, class... U>
503e519524SHoward Hinnant        tuple(allocator_arg_t, const Alloc& a, const tuple<U...>&);
513e519524SHoward Hinnant    template <class Alloc, class... U>
523e519524SHoward Hinnant        tuple(allocator_arg_t, const Alloc& a, tuple<U...>&&);
533e519524SHoward Hinnant    template <class Alloc, class U1, class U2>
543e519524SHoward Hinnant        tuple(allocator_arg_t, const Alloc& a, const pair<U1, U2>&);
553e519524SHoward Hinnant    template <class Alloc, class U1, class U2>
563e519524SHoward Hinnant        tuple(allocator_arg_t, const Alloc& a, pair<U1, U2>&&);
573e519524SHoward Hinnant
583e519524SHoward Hinnant    tuple& operator=(const tuple&);
5927d0a2a7SHoward Hinnant    tuple&
6027d0a2a7SHoward Hinnant        operator=(tuple&&) noexcept(AND(is_nothrow_move_assignable<T>::value ...));
613e519524SHoward Hinnant    template <class... U>
623e519524SHoward Hinnant        tuple& operator=(const tuple<U...>&);
633e519524SHoward Hinnant    template <class... U>
643e519524SHoward Hinnant        tuple& operator=(tuple<U...>&&);
653e519524SHoward Hinnant    template <class U1, class U2>
663e519524SHoward Hinnant        tuple& operator=(const pair<U1, U2>&); // iff sizeof...(T) == 2
673e519524SHoward Hinnant    template <class U1, class U2>
683e519524SHoward Hinnant        tuple& operator=(pair<U1, U2>&&); //iffsizeof...(T) == 2
693e519524SHoward Hinnant
7027d0a2a7SHoward Hinnant    void swap(tuple&) noexcept(AND(swap(declval<T&>(), declval<T&>())...));
713e519524SHoward Hinnant};
723e519524SHoward Hinnant
733e519524SHoward Hinnantconst unspecified ignore;
743e519524SHoward Hinnant
7575eff748SMarshall Clowtemplate <class... T> tuple<V...>  make_tuple(T&&...); // constexpr in C++14
76de9320aaSMarshall Clowtemplate <class... T> tuple<ATypes...> forward_as_tuple(T&&...) noexcept; // constexpr in C++14
770d1560e1SMarshall Clowtemplate <class... T> tuple<T&...> tie(T&...) noexcept; // constexpr in C++14
7875eff748SMarshall Clowtemplate <class... Tuples> tuple<CTypes...> tuple_cat(Tuples&&... tpls); // constexpr in C++14
793e519524SHoward Hinnant
8003e29a29SEric Fiselier// [tuple.apply], calling a function with a tuple of arguments:
8103e29a29SEric Fiseliertemplate <class F, class Tuple>
8203e29a29SEric Fiselier  constexpr decltype(auto) apply(F&& f, Tuple&& t); // C++17
8303e29a29SEric Fiseliertemplate <class T, class Tuple>
8403e29a29SEric Fiselier  constexpr T make_from_tuple(Tuple&& t); // C++17
8503e29a29SEric Fiselier
863e519524SHoward Hinnant// 20.4.1.4, tuple helper classes:
871013fe3cSEric Fiseliertemplate <class T> class tuple_size; // undefined
883e519524SHoward Hinnanttemplate <class... T> class tuple_size<tuple<T...>>;
8903e29a29SEric Fiseliertemplate <class T>
9003e29a29SEric Fiselier constexpr size_t tuple_size_v = tuple_size<T>::value; // C++17
91bfb3f2bfSMarshall Clowtemplate <size_t I, class T> class tuple_element; // undefined
92bfb3f2bfSMarshall Clowtemplate <size_t I, class... T> class tuple_element<I, tuple<T...>>;
93bfb3f2bfSMarshall Clowtemplate <size_t I, class T>
94bfb3f2bfSMarshall Clow  using tuple_element_t = typename tuple_element <I, T>::type; // C++14
953e519524SHoward Hinnant
963e519524SHoward Hinnant// 20.4.1.5, element access:
97bfb3f2bfSMarshall Clowtemplate <size_t I, class... T>
9827d0a2a7SHoward Hinnant    typename tuple_element<I, tuple<T...>>::type&
998bf1f08aSMarshall Clow    get(tuple<T...>&) noexcept; // constexpr in C++14
100bfb3f2bfSMarshall Clowtemplate <size_t I, class... T>
101bfb3f2bfSMarshall Clow    const typename tuple_element<I, tuple<T...>>::type&
1028bf1f08aSMarshall Clow    get(const tuple<T...>&) noexcept; // constexpr in C++14
103bfb3f2bfSMarshall Clowtemplate <size_t I, class... T>
10427d0a2a7SHoward Hinnant    typename tuple_element<I, tuple<T...>>::type&&
1058bf1f08aSMarshall Clow    get(tuple<T...>&&) noexcept; // constexpr in C++14
106545b8861SEric Fiseliertemplate <size_t I, class... T>
107545b8861SEric Fiselier    const typename tuple_element<I, tuple<T...>>::type&&
108545b8861SEric Fiselier    get(const tuple<T...>&&) noexcept; // constexpr in C++14
1093e519524SHoward Hinnant
110e99520c7SMarshall Clowtemplate <class T1, class... T>
111e99520c7SMarshall Clow    constexpr T1& get(tuple<T...>&) noexcept;  // C++14
112e99520c7SMarshall Clowtemplate <class T1, class... T>
113bfb3f2bfSMarshall Clow    constexpr const T1& get(const tuple<T...>&) noexcept;   // C++14
114e99520c7SMarshall Clowtemplate <class T1, class... T>
115e99520c7SMarshall Clow    constexpr T1&& get(tuple<T...>&&) noexcept;   // C++14
116545b8861SEric Fiseliertemplate <class T1, class... T>
117545b8861SEric Fiselier    constexpr const T1&& get(const tuple<T...>&&) noexcept;   // C++14
118e99520c7SMarshall Clow
1193e519524SHoward Hinnant// 20.4.1.6, relational operators:
12075eff748SMarshall Clowtemplate<class... T, class... U> bool operator==(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14
12175eff748SMarshall Clowtemplate<class... T, class... U> bool operator<(const tuple<T...>&, const tuple<U...>&);  // constexpr in C++14
12275eff748SMarshall Clowtemplate<class... T, class... U> bool operator!=(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14
12375eff748SMarshall Clowtemplate<class... T, class... U> bool operator>(const tuple<T...>&, const tuple<U...>&);  // constexpr in C++14
12475eff748SMarshall Clowtemplate<class... T, class... U> bool operator<=(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14
12575eff748SMarshall Clowtemplate<class... T, class... U> bool operator>=(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14
1263e519524SHoward Hinnant
1273e519524SHoward Hinnanttemplate <class... Types, class Alloc>
1283e519524SHoward Hinnant  struct uses_allocator<tuple<Types...>, Alloc>;
1293e519524SHoward Hinnant
1303e519524SHoward Hinnanttemplate <class... Types>
13127d0a2a7SHoward Hinnant  void
13227d0a2a7SHoward Hinnant  swap(tuple<Types...>& x, tuple<Types...>& y) noexcept(noexcept(x.swap(y)));
1333e519524SHoward Hinnant
1343e519524SHoward Hinnant}  // std
1353e519524SHoward Hinnant
1363e519524SHoward Hinnant*/
1373e519524SHoward Hinnant
1383e519524SHoward Hinnant#include <__config>
1393e519524SHoward Hinnant#include <__tuple>
1403e519524SHoward Hinnant#include <cstddef>
1413e519524SHoward Hinnant#include <type_traits>
142a87b5e34SHoward Hinnant#include <__functional_base>
143a87b5e34SHoward Hinnant#include <utility>
1443e519524SHoward Hinnant
145073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1463e519524SHoward Hinnant#pragma GCC system_header
147073458b1SHoward Hinnant#endif
1483e519524SHoward Hinnant
1493e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
1503e519524SHoward Hinnant
1513e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS
1523e519524SHoward Hinnant
15305c8dad2SMarshall Clow
1543e519524SHoward Hinnant// __tuple_leaf
1553e519524SHoward Hinnant
156ee187e24SEric Fiseliertemplate <size_t _Ip, class _Hp,
157ee187e24SEric Fiselier          bool=is_empty<_Hp>::value && !__libcpp_is_final<_Hp>::value
15842b8bb50SHoward Hinnant         >
1593e519524SHoward Hinnantclass __tuple_leaf;
1603e519524SHoward Hinnant
1613e519524SHoward Hinnanttemplate <size_t _Ip, class _Hp, bool _Ep>
162789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1633e519524SHoward Hinnantvoid swap(__tuple_leaf<_Ip, _Hp, _Ep>& __x, __tuple_leaf<_Ip, _Hp, _Ep>& __y)
16427d0a2a7SHoward Hinnant    _NOEXCEPT_(__is_nothrow_swappable<_Hp>::value)
1653e519524SHoward Hinnant{
1663e519524SHoward Hinnant    swap(__x.get(), __y.get());
1673e519524SHoward Hinnant}
1683e519524SHoward Hinnant
1693e519524SHoward Hinnanttemplate <size_t _Ip, class _Hp, bool>
1703e519524SHoward Hinnantclass __tuple_leaf
1713e519524SHoward Hinnant{
1723e519524SHoward Hinnant    _Hp value;
1733e519524SHoward Hinnant
174074f8d77SEric Fiselier    template <class _Tp>
175074f8d77SEric Fiselier    static constexpr bool __can_bind_reference() {
176074f8d77SEric Fiselier        using _RawTp = typename remove_reference<_Tp>::type;
177074f8d77SEric Fiselier        using _RawHp = typename remove_reference<_Hp>::type;
178074f8d77SEric Fiselier        using _CheckLValueArg = integral_constant<bool,
179074f8d77SEric Fiselier            is_lvalue_reference<_Tp>::value
180074f8d77SEric Fiselier        ||  is_same<_RawTp, reference_wrapper<_RawHp>>::value
181074f8d77SEric Fiselier        ||  is_same<_RawTp, reference_wrapper<typename remove_const<_RawHp>::type>>::value
182074f8d77SEric Fiselier        >;
183074f8d77SEric Fiselier        return  !is_reference<_Hp>::value
184074f8d77SEric Fiselier            || (is_lvalue_reference<_Hp>::value && _CheckLValueArg::value)
185074f8d77SEric Fiselier            || (is_rvalue_reference<_Hp>::value && !is_lvalue_reference<_Tp>::value);
186074f8d77SEric Fiselier    }
187074f8d77SEric Fiselier
1883e519524SHoward Hinnant    __tuple_leaf& operator=(const __tuple_leaf&);
1893e519524SHoward Hinnantpublic:
190a0f4c45cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR __tuple_leaf()
191a0f4c45cSHoward Hinnant             _NOEXCEPT_(is_nothrow_default_constructible<_Hp>::value) : value()
1923e519524SHoward Hinnant       {static_assert(!is_reference<_Hp>::value,
1933e519524SHoward Hinnant              "Attempted to default construct a reference element in a tuple");}
1943e519524SHoward Hinnant
1953e519524SHoward Hinnant    template <class _Alloc>
1963e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1973e519524SHoward Hinnant        __tuple_leaf(integral_constant<int, 0>, const _Alloc&)
1983e519524SHoward Hinnant            : value()
1993e519524SHoward Hinnant        {static_assert(!is_reference<_Hp>::value,
2003e519524SHoward Hinnant              "Attempted to default construct a reference element in a tuple");}
2013e519524SHoward Hinnant
2023e519524SHoward Hinnant    template <class _Alloc>
2033e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2043e519524SHoward Hinnant        __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a)
2053e519524SHoward Hinnant            : value(allocator_arg_t(), __a)
2063e519524SHoward Hinnant        {static_assert(!is_reference<_Hp>::value,
2073e519524SHoward Hinnant              "Attempted to default construct a reference element in a tuple");}
2083e519524SHoward Hinnant
2093e519524SHoward Hinnant    template <class _Alloc>
2103e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2113e519524SHoward Hinnant        __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a)
2123e519524SHoward Hinnant            : value(__a)
2133e519524SHoward Hinnant        {static_assert(!is_reference<_Hp>::value,
2143e519524SHoward Hinnant              "Attempted to default construct a reference element in a tuple");}
2153e519524SHoward Hinnant
21630ad985bSHoward Hinnant    template <class _Tp,
217567bb79bSEric Fiselier              class = typename enable_if<
218567bb79bSEric Fiselier                  __lazy_and<
219567bb79bSEric Fiselier                      __lazy_not<is_same<typename decay<_Tp>::type, __tuple_leaf>>
220567bb79bSEric Fiselier                    , is_constructible<_Hp, _Tp>
221567bb79bSEric Fiselier                    >::value
222567bb79bSEric Fiselier                >::type
223567bb79bSEric Fiselier            >
22475eff748SMarshall Clow        _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
2258a9ee148SHoward Hinnant        explicit __tuple_leaf(_Tp&& __t) _NOEXCEPT_((is_nothrow_constructible<_Hp, _Tp>::value))
226ce48a113SHoward Hinnant            : value(_VSTD::forward<_Tp>(__t))
227074f8d77SEric Fiselier        {static_assert(__can_bind_reference<_Tp>(),
2283e519524SHoward Hinnant       "Attempted to construct a reference element in a tuple with an rvalue");}
2293e519524SHoward Hinnant
2303e519524SHoward Hinnant    template <class _Tp, class _Alloc>
2313e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2323e519524SHoward Hinnant        explicit __tuple_leaf(integral_constant<int, 0>, const _Alloc&, _Tp&& __t)
233ce48a113SHoward Hinnant            : value(_VSTD::forward<_Tp>(__t))
234074f8d77SEric Fiselier        {static_assert(__can_bind_reference<_Tp>(),
2353e519524SHoward Hinnant       "Attempted to construct a reference element in a tuple with an rvalue");}
2363e519524SHoward Hinnant
2373e519524SHoward Hinnant    template <class _Tp, class _Alloc>
2383e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2393e519524SHoward Hinnant        explicit __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a, _Tp&& __t)
240ce48a113SHoward Hinnant            : value(allocator_arg_t(), __a, _VSTD::forward<_Tp>(__t))
241074f8d77SEric Fiselier        {static_assert(!is_reference<_Hp>::value,
242074f8d77SEric Fiselier            "Attempted to uses-allocator construct a reference element in a tuple");}
2433e519524SHoward Hinnant
2443e519524SHoward Hinnant    template <class _Tp, class _Alloc>
2453e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2463e519524SHoward Hinnant        explicit __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a, _Tp&& __t)
247ce48a113SHoward Hinnant            : value(_VSTD::forward<_Tp>(__t), __a)
248074f8d77SEric Fiselier        {static_assert(!is_reference<_Hp>::value,
249074f8d77SEric Fiselier           "Attempted to uses-allocator construct a reference element in a tuple");}
2503e519524SHoward Hinnant
2517546a111SMarshall Clow    __tuple_leaf(const __tuple_leaf& __t) = default;
2527546a111SMarshall Clow    __tuple_leaf(__tuple_leaf&& __t) = default;
2533e519524SHoward Hinnant
2543e519524SHoward Hinnant    template <class _Tp>
2553e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2563e519524SHoward Hinnant        __tuple_leaf&
2578a9ee148SHoward Hinnant        operator=(_Tp&& __t) _NOEXCEPT_((is_nothrow_assignable<_Hp&, _Tp>::value))
2583e519524SHoward Hinnant        {
259ce48a113SHoward Hinnant            value = _VSTD::forward<_Tp>(__t);
2603e519524SHoward Hinnant            return *this;
2613e519524SHoward Hinnant        }
2623e519524SHoward Hinnant
2633e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
26427d0a2a7SHoward Hinnant    int swap(__tuple_leaf& __t) _NOEXCEPT_(__is_nothrow_swappable<__tuple_leaf>::value)
2653e519524SHoward Hinnant    {
266ce48a113SHoward Hinnant        _VSTD::swap(*this, __t);
2673e519524SHoward Hinnant        return 0;
2683e519524SHoward Hinnant    }
2693e519524SHoward Hinnant
27075eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11       _Hp& get()       _NOEXCEPT {return value;}
27175eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const _Hp& get() const _NOEXCEPT {return value;}
2723e519524SHoward Hinnant};
2733e519524SHoward Hinnant
2743e519524SHoward Hinnanttemplate <size_t _Ip, class _Hp>
2753e519524SHoward Hinnantclass __tuple_leaf<_Ip, _Hp, true>
2763e519524SHoward Hinnant    : private _Hp
2773e519524SHoward Hinnant{
2783e519524SHoward Hinnant
2793e519524SHoward Hinnant    __tuple_leaf& operator=(const __tuple_leaf&);
2803e519524SHoward Hinnantpublic:
281a0f4c45cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR __tuple_leaf()
282a0f4c45cSHoward Hinnant             _NOEXCEPT_(is_nothrow_default_constructible<_Hp>::value) {}
2833e519524SHoward Hinnant
2843e519524SHoward Hinnant    template <class _Alloc>
2853e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2863e519524SHoward Hinnant        __tuple_leaf(integral_constant<int, 0>, const _Alloc&) {}
2873e519524SHoward Hinnant
2883e519524SHoward Hinnant    template <class _Alloc>
2893e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2903e519524SHoward Hinnant        __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a)
2913e519524SHoward Hinnant            : _Hp(allocator_arg_t(), __a) {}
2923e519524SHoward Hinnant
2933e519524SHoward Hinnant    template <class _Alloc>
2943e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2953e519524SHoward Hinnant        __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a)
2963e519524SHoward Hinnant            : _Hp(__a) {}
2973e519524SHoward Hinnant
29830ad985bSHoward Hinnant    template <class _Tp,
299567bb79bSEric Fiselier              class = typename enable_if<
300567bb79bSEric Fiselier                  __lazy_and<
301567bb79bSEric Fiselier                        __lazy_not<is_same<typename decay<_Tp>::type, __tuple_leaf>>
302567bb79bSEric Fiselier                      , is_constructible<_Hp, _Tp>
303567bb79bSEric Fiselier                    >::value
304567bb79bSEric Fiselier                >::type
305567bb79bSEric Fiselier            >
30675eff748SMarshall Clow        _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
3078a9ee148SHoward Hinnant        explicit __tuple_leaf(_Tp&& __t) _NOEXCEPT_((is_nothrow_constructible<_Hp, _Tp>::value))
308ce48a113SHoward Hinnant            : _Hp(_VSTD::forward<_Tp>(__t)) {}
3093e519524SHoward Hinnant
3103e519524SHoward Hinnant    template <class _Tp, class _Alloc>
3113e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
3123e519524SHoward Hinnant        explicit __tuple_leaf(integral_constant<int, 0>, const _Alloc&, _Tp&& __t)
313ce48a113SHoward Hinnant            : _Hp(_VSTD::forward<_Tp>(__t)) {}
3143e519524SHoward Hinnant
3153e519524SHoward Hinnant    template <class _Tp, class _Alloc>
3163e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
3173e519524SHoward Hinnant        explicit __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a, _Tp&& __t)
318ce48a113SHoward Hinnant            : _Hp(allocator_arg_t(), __a, _VSTD::forward<_Tp>(__t)) {}
3193e519524SHoward Hinnant
3203e519524SHoward Hinnant    template <class _Tp, class _Alloc>
3213e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
3223e519524SHoward Hinnant        explicit __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a, _Tp&& __t)
323ce48a113SHoward Hinnant            : _Hp(_VSTD::forward<_Tp>(__t), __a) {}
3243e519524SHoward Hinnant
325567bb79bSEric Fiselier    __tuple_leaf(__tuple_leaf const &) = default;
326567bb79bSEric Fiselier    __tuple_leaf(__tuple_leaf &&) = default;
327567bb79bSEric Fiselier
3283e519524SHoward Hinnant    template <class _Tp>
3293e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
3303e519524SHoward Hinnant        __tuple_leaf&
3318a9ee148SHoward Hinnant        operator=(_Tp&& __t) _NOEXCEPT_((is_nothrow_assignable<_Hp&, _Tp>::value))
3323e519524SHoward Hinnant        {
333ce48a113SHoward Hinnant            _Hp::operator=(_VSTD::forward<_Tp>(__t));
3343e519524SHoward Hinnant            return *this;
3353e519524SHoward Hinnant        }
3363e519524SHoward Hinnant
33727d0a2a7SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
33827d0a2a7SHoward Hinnant    int
33927d0a2a7SHoward Hinnant    swap(__tuple_leaf& __t) _NOEXCEPT_(__is_nothrow_swappable<__tuple_leaf>::value)
3403e519524SHoward Hinnant    {
341ce48a113SHoward Hinnant        _VSTD::swap(*this, __t);
3423e519524SHoward Hinnant        return 0;
3433e519524SHoward Hinnant    }
3443e519524SHoward Hinnant
34575eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11       _Hp& get()       _NOEXCEPT {return static_cast<_Hp&>(*this);}
34675eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const _Hp& get() const _NOEXCEPT {return static_cast<const _Hp&>(*this);}
3473e519524SHoward Hinnant};
3483e519524SHoward Hinnant
349789847ddSHoward Hinnanttemplate <class ..._Tp>
350789847ddSHoward Hinnant_LIBCPP_INLINE_VISIBILITY
3518a9ee148SHoward Hinnantvoid __swallow(_Tp&&...) _NOEXCEPT {}
3523e519524SHoward Hinnant
35390fb2bafSEric Fiseliertemplate <class ..._Tp>
35490fb2bafSEric Fiselierstruct __lazy_all : __all<_Tp::value...> {};
35590fb2bafSEric Fiselier
35614c5ec51SMarshall Clowtemplate <class _Tp>
35714c5ec51SMarshall Clowstruct __all_default_constructible;
35827d0a2a7SHoward Hinnant
35914c5ec51SMarshall Clowtemplate <class ..._Tp>
36014c5ec51SMarshall Clowstruct __all_default_constructible<__tuple_types<_Tp...>>
36114c5ec51SMarshall Clow    : __all<is_default_constructible<_Tp>::value...>
36214c5ec51SMarshall Clow{ };
36327d0a2a7SHoward Hinnant
3643e519524SHoward Hinnant// __tuple_impl
3653e519524SHoward Hinnant
3663e519524SHoward Hinnanttemplate<class _Indx, class ..._Tp> struct __tuple_impl;
3673e519524SHoward Hinnant
3683e519524SHoward Hinnanttemplate<size_t ..._Indx, class ..._Tp>
3693e519524SHoward Hinnantstruct __tuple_impl<__tuple_indices<_Indx...>, _Tp...>
3703e519524SHoward Hinnant    : public __tuple_leaf<_Indx, _Tp>...
3713e519524SHoward Hinnant{
372a62ebe04SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
373a0f4c45cSHoward Hinnant    _LIBCPP_CONSTEXPR __tuple_impl()
374a0f4c45cSHoward Hinnant        _NOEXCEPT_(__all<is_nothrow_default_constructible<_Tp>::value...>::value) {}
375a62ebe04SHoward Hinnant
3763e519524SHoward Hinnant    template <size_t ..._Uf, class ..._Tf,
3773e519524SHoward Hinnant              size_t ..._Ul, class ..._Tl, class ..._Up>
37875eff748SMarshall Clow        _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
3793e519524SHoward Hinnant        explicit
3803e519524SHoward Hinnant        __tuple_impl(__tuple_indices<_Uf...>, __tuple_types<_Tf...>,
3813e519524SHoward Hinnant                     __tuple_indices<_Ul...>, __tuple_types<_Tl...>,
3828a9ee148SHoward Hinnant                     _Up&&... __u)
3838a9ee148SHoward Hinnant                     _NOEXCEPT_((__all<is_nothrow_constructible<_Tf, _Up>::value...>::value &&
3848a9ee148SHoward Hinnant                                 __all<is_nothrow_default_constructible<_Tl>::value...>::value)) :
385ce48a113SHoward Hinnant            __tuple_leaf<_Uf, _Tf>(_VSTD::forward<_Up>(__u))...,
3863e519524SHoward Hinnant            __tuple_leaf<_Ul, _Tl>()...
3873e519524SHoward Hinnant            {}
3883e519524SHoward Hinnant
3893e519524SHoward Hinnant    template <class _Alloc, size_t ..._Uf, class ..._Tf,
3903e519524SHoward Hinnant              size_t ..._Ul, class ..._Tl, class ..._Up>
391789847ddSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
3923e519524SHoward Hinnant        explicit
3933e519524SHoward Hinnant        __tuple_impl(allocator_arg_t, const _Alloc& __a,
3943e519524SHoward Hinnant                     __tuple_indices<_Uf...>, __tuple_types<_Tf...>,
3953e519524SHoward Hinnant                     __tuple_indices<_Ul...>, __tuple_types<_Tl...>,
3963e519524SHoward Hinnant                     _Up&&... __u) :
3973e519524SHoward Hinnant            __tuple_leaf<_Uf, _Tf>(__uses_alloc_ctor<_Tf, _Alloc, _Up>(), __a,
398ce48a113SHoward Hinnant            _VSTD::forward<_Up>(__u))...,
3993e519524SHoward Hinnant            __tuple_leaf<_Ul, _Tl>(__uses_alloc_ctor<_Tl, _Alloc>(), __a)...
4003e519524SHoward Hinnant            {}
4013e519524SHoward Hinnant
4023e519524SHoward Hinnant    template <class _Tuple,
4033e519524SHoward Hinnant              class = typename enable_if
4043e519524SHoward Hinnant                      <
405f3b02b17SHoward Hinnant                         __tuple_constructible<_Tuple, tuple<_Tp...> >::value
4063e519524SHoward Hinnant                      >::type
4073e519524SHoward Hinnant             >
40875eff748SMarshall Clow        _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
4098a9ee148SHoward Hinnant        __tuple_impl(_Tuple&& __t) _NOEXCEPT_((__all<is_nothrow_constructible<_Tp, typename tuple_element<_Indx,
4108a9ee148SHoward Hinnant                                       typename __make_tuple_types<_Tuple>::type>::type>::value...>::value))
411ce48a113SHoward Hinnant            : __tuple_leaf<_Indx, _Tp>(_VSTD::forward<typename tuple_element<_Indx,
412ce48a113SHoward Hinnant                                       typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<_Indx>(__t)))...
4133e519524SHoward Hinnant            {}
4143e519524SHoward Hinnant
4153e519524SHoward Hinnant    template <class _Alloc, class _Tuple,
4163e519524SHoward Hinnant              class = typename enable_if
4173e519524SHoward Hinnant                      <
4189795699aSEric Fiselier                         __tuple_constructible<_Tuple, tuple<_Tp...> >::value
4193e519524SHoward Hinnant                      >::type
4203e519524SHoward Hinnant             >
421789847ddSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
4223e519524SHoward Hinnant        __tuple_impl(allocator_arg_t, const _Alloc& __a, _Tuple&& __t)
4233e519524SHoward Hinnant            : __tuple_leaf<_Indx, _Tp>(__uses_alloc_ctor<_Tp, _Alloc, typename tuple_element<_Indx,
4243e519524SHoward Hinnant                                       typename __make_tuple_types<_Tuple>::type>::type>(), __a,
425ce48a113SHoward Hinnant                                       _VSTD::forward<typename tuple_element<_Indx,
426ce48a113SHoward Hinnant                                       typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<_Indx>(__t)))...
4273e519524SHoward Hinnant            {}
4283e519524SHoward Hinnant
4293e519524SHoward Hinnant    template <class _Tuple>
430789847ddSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
4313e519524SHoward Hinnant        typename enable_if
4323e519524SHoward Hinnant        <
4333e519524SHoward Hinnant            __tuple_assignable<_Tuple, tuple<_Tp...> >::value,
4343e519524SHoward Hinnant            __tuple_impl&
4353e519524SHoward Hinnant        >::type
4368a9ee148SHoward Hinnant        operator=(_Tuple&& __t) _NOEXCEPT_((__all<is_nothrow_assignable<_Tp&, typename tuple_element<_Indx,
4378a9ee148SHoward Hinnant                                       typename __make_tuple_types<_Tuple>::type>::type>::value...>::value))
4383e519524SHoward Hinnant        {
439ce48a113SHoward Hinnant            __swallow(__tuple_leaf<_Indx, _Tp>::operator=(_VSTD::forward<typename tuple_element<_Indx,
440ce48a113SHoward Hinnant                                       typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<_Indx>(__t)))...);
4413e519524SHoward Hinnant            return *this;
4423e519524SHoward Hinnant        }
4433e519524SHoward Hinnant
4444478b25aSHoward Hinnant    __tuple_impl(const __tuple_impl&) = default;
4454478b25aSHoward Hinnant    __tuple_impl(__tuple_impl&&) = default;
4464478b25aSHoward Hinnant
447789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
448fa8df7dbSHoward Hinnant    __tuple_impl&
4498a9ee148SHoward Hinnant    operator=(const __tuple_impl& __t) _NOEXCEPT_((__all<is_nothrow_copy_assignable<_Tp>::value...>::value))
450fa8df7dbSHoward Hinnant    {
451fa8df7dbSHoward Hinnant        __swallow(__tuple_leaf<_Indx, _Tp>::operator=(static_cast<const __tuple_leaf<_Indx, _Tp>&>(__t).get())...);
452fa8df7dbSHoward Hinnant        return *this;
453fa8df7dbSHoward Hinnant    }
454fa8df7dbSHoward Hinnant
455fa8df7dbSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4564478b25aSHoward Hinnant    __tuple_impl&
4574478b25aSHoward Hinnant    operator=(__tuple_impl&& __t) _NOEXCEPT_((__all<is_nothrow_move_assignable<_Tp>::value...>::value))
4584478b25aSHoward Hinnant    {
4594478b25aSHoward Hinnant        __swallow(__tuple_leaf<_Indx, _Tp>::operator=(_VSTD::forward<_Tp>(static_cast<__tuple_leaf<_Indx, _Tp>&>(__t).get()))...);
4604478b25aSHoward Hinnant        return *this;
4614478b25aSHoward Hinnant    }
4624478b25aSHoward Hinnant
4634478b25aSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4643e519524SHoward Hinnant    void swap(__tuple_impl& __t)
46527d0a2a7SHoward Hinnant        _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value)
4663e519524SHoward Hinnant    {
4673e519524SHoward Hinnant        __swallow(__tuple_leaf<_Indx, _Tp>::swap(static_cast<__tuple_leaf<_Indx, _Tp>&>(__t))...);
4683e519524SHoward Hinnant    }
4693e519524SHoward Hinnant};
4703e519524SHoward Hinnant
47174cba642SEric Fiselier
47274cba642SEric Fiselier
4733e519524SHoward Hinnanttemplate <class ..._Tp>
474*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS tuple
4753e519524SHoward Hinnant{
4763e519524SHoward Hinnant    typedef __tuple_impl<typename __make_tuple_indices<sizeof...(_Tp)>::type, _Tp...> base;
4773e519524SHoward Hinnant
4783e519524SHoward Hinnant    base base_;
4793e519524SHoward Hinnant
480bd688258SEric Fiselier#if defined(_LIBCPP_ENABLE_TUPLE_IMPLICIT_REDUCED_ARITY_EXTENSION)
481bd688258SEric Fiselier    static constexpr bool _EnableImplicitReducedArityExtension = true;
482bd688258SEric Fiselier#else
483bd688258SEric Fiselier    static constexpr bool _EnableImplicitReducedArityExtension = false;
484bd688258SEric Fiselier#endif
485bd688258SEric Fiselier
48674cba642SEric Fiselier    template <class ..._Args>
48774cba642SEric Fiselier    struct _PackExpandsToThisTuple : false_type {};
48874cba642SEric Fiselier
48974cba642SEric Fiselier    template <class _Arg>
49074cba642SEric Fiselier    struct _PackExpandsToThisTuple<_Arg>
49174cba642SEric Fiselier        : is_same<typename __uncvref<_Arg>::type, tuple> {};
49274cba642SEric Fiselier
49374cba642SEric Fiselier    template <bool _MaybeEnable, class _Dummy = void>
49474cba642SEric Fiselier    struct _CheckArgsConstructor : __check_tuple_constructor_fail {};
49574cba642SEric Fiselier
49674cba642SEric Fiselier    template <class _Dummy>
49774cba642SEric Fiselier    struct _CheckArgsConstructor<true, _Dummy>
49874cba642SEric Fiselier    {
49974cba642SEric Fiselier        template <class ..._Args>
5004927c295SEric Fiselier        static constexpr bool __enable_default() {
5014927c295SEric Fiselier            return __all<is_default_constructible<_Args>::value...>::value;
5024927c295SEric Fiselier        }
5034927c295SEric Fiselier
5044927c295SEric Fiselier        template <class ..._Args>
50574cba642SEric Fiselier        static constexpr bool __enable_explicit() {
50674cba642SEric Fiselier            return
50774cba642SEric Fiselier                __tuple_constructible<
50874cba642SEric Fiselier                    tuple<_Args...>,
50974cba642SEric Fiselier                    typename __make_tuple_types<tuple,
51074cba642SEric Fiselier                             sizeof...(_Args) < sizeof...(_Tp) ?
51174cba642SEric Fiselier                                 sizeof...(_Args) :
51274cba642SEric Fiselier                                 sizeof...(_Tp)>::type
51374cba642SEric Fiselier                >::value &&
51474cba642SEric Fiselier                !__tuple_convertible<
51574cba642SEric Fiselier                    tuple<_Args...>,
51674cba642SEric Fiselier                    typename __make_tuple_types<tuple,
51774cba642SEric Fiselier                             sizeof...(_Args) < sizeof...(_Tp) ?
51874cba642SEric Fiselier                                 sizeof...(_Args) :
51974cba642SEric Fiselier                                 sizeof...(_Tp)>::type
52074cba642SEric Fiselier                >::value &&
52174cba642SEric Fiselier                __all_default_constructible<
52274cba642SEric Fiselier                    typename __make_tuple_types<tuple, sizeof...(_Tp),
52374cba642SEric Fiselier                             sizeof...(_Args) < sizeof...(_Tp) ?
52474cba642SEric Fiselier                                 sizeof...(_Args) :
52574cba642SEric Fiselier                                 sizeof...(_Tp)>::type
52674cba642SEric Fiselier                >::value;
52774cba642SEric Fiselier        }
52874cba642SEric Fiselier
52974cba642SEric Fiselier        template <class ..._Args>
53074cba642SEric Fiselier        static constexpr bool __enable_implicit() {
53174cba642SEric Fiselier            return
53274cba642SEric Fiselier                __tuple_convertible<
53374cba642SEric Fiselier                    tuple<_Args...>,
53474cba642SEric Fiselier                    typename __make_tuple_types<tuple,
53574cba642SEric Fiselier                             sizeof...(_Args) < sizeof...(_Tp) ?
53674cba642SEric Fiselier                                 sizeof...(_Args) :
53774cba642SEric Fiselier                                 sizeof...(_Tp)>::type
53874cba642SEric Fiselier                >::value &&
53974cba642SEric Fiselier                __all_default_constructible<
54074cba642SEric Fiselier                    typename __make_tuple_types<tuple, sizeof...(_Tp),
54174cba642SEric Fiselier                             sizeof...(_Args) < sizeof...(_Tp) ?
54274cba642SEric Fiselier                                 sizeof...(_Args) :
54374cba642SEric Fiselier                                 sizeof...(_Tp)>::type
54474cba642SEric Fiselier                >::value;
54574cba642SEric Fiselier        }
54674cba642SEric Fiselier    };
54774cba642SEric Fiselier
54874cba642SEric Fiselier    template <bool _MaybeEnable,
54974cba642SEric Fiselier              bool = sizeof...(_Tp) == 1,
55074cba642SEric Fiselier              class _Dummy = void>
55174cba642SEric Fiselier    struct _CheckTupleLikeConstructor : __check_tuple_constructor_fail {};
55274cba642SEric Fiselier
55374cba642SEric Fiselier    template <class _Dummy>
55474cba642SEric Fiselier    struct _CheckTupleLikeConstructor<true, false, _Dummy>
55574cba642SEric Fiselier    {
55674cba642SEric Fiselier        template <class _Tuple>
55774cba642SEric Fiselier        static constexpr bool __enable_implicit() {
558347a1cc2SEric Fiselier            return __tuple_convertible<_Tuple, tuple>::value;
55974cba642SEric Fiselier        }
56074cba642SEric Fiselier
56174cba642SEric Fiselier        template <class _Tuple>
56274cba642SEric Fiselier        static constexpr bool __enable_explicit() {
563347a1cc2SEric Fiselier            return __tuple_constructible<_Tuple, tuple>::value
564347a1cc2SEric Fiselier               && !__tuple_convertible<_Tuple, tuple>::value;
56574cba642SEric Fiselier        }
56674cba642SEric Fiselier    };
56774cba642SEric Fiselier
56874cba642SEric Fiselier    template <class _Dummy>
56974cba642SEric Fiselier    struct _CheckTupleLikeConstructor<true, true, _Dummy>
57074cba642SEric Fiselier    {
57174cba642SEric Fiselier        // This trait is used to disable the tuple-like constructor when
57274cba642SEric Fiselier        // the UTypes... constructor should be selected instead.
57374cba642SEric Fiselier        // See LWG issue #2549.
57474cba642SEric Fiselier        template <class _Tuple>
57574cba642SEric Fiselier        using _PreferTupleLikeConstructor = __lazy_or<
57674cba642SEric Fiselier            // Don't attempt the two checks below if the tuple we are given
57774cba642SEric Fiselier            // has the same type as this tuple.
57874cba642SEric Fiselier            is_same<typename __uncvref<_Tuple>::type, tuple>,
57974cba642SEric Fiselier            __lazy_and<
58074cba642SEric Fiselier                __lazy_not<is_constructible<_Tp..., _Tuple>>,
58174cba642SEric Fiselier                __lazy_not<is_convertible<_Tuple, _Tp...>>
58274cba642SEric Fiselier            >
58374cba642SEric Fiselier        >;
58474cba642SEric Fiselier
58574cba642SEric Fiselier        template <class _Tuple>
58674cba642SEric Fiselier        static constexpr bool __enable_implicit() {
58774cba642SEric Fiselier            return __lazy_and<
58874cba642SEric Fiselier                __tuple_convertible<_Tuple, tuple>,
58974cba642SEric Fiselier                _PreferTupleLikeConstructor<_Tuple>
59074cba642SEric Fiselier            >::value;
59174cba642SEric Fiselier        }
59274cba642SEric Fiselier
59374cba642SEric Fiselier        template <class _Tuple>
59474cba642SEric Fiselier        static constexpr bool __enable_explicit() {
59574cba642SEric Fiselier            return __lazy_and<
59674cba642SEric Fiselier                __tuple_constructible<_Tuple, tuple>,
59774cba642SEric Fiselier                _PreferTupleLikeConstructor<_Tuple>,
59874cba642SEric Fiselier                __lazy_not<__tuple_convertible<_Tuple, tuple>>
59974cba642SEric Fiselier            >::value;
60074cba642SEric Fiselier        }
60174cba642SEric Fiselier    };
60274cba642SEric Fiselier
6038bf1f08aSMarshall Clow    template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11
604c206366fSHoward Hinnant        typename tuple_element<_Jp, tuple<_Up...> >::type& get(tuple<_Up...>&) _NOEXCEPT;
6058bf1f08aSMarshall Clow    template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11
606c206366fSHoward Hinnant        const typename tuple_element<_Jp, tuple<_Up...> >::type& get(const tuple<_Up...>&) _NOEXCEPT;
6078bf1f08aSMarshall Clow    template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11
608c206366fSHoward Hinnant        typename tuple_element<_Jp, tuple<_Up...> >::type&& get(tuple<_Up...>&&) _NOEXCEPT;
609545b8861SEric Fiselier    template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11
610545b8861SEric Fiselier        const typename tuple_element<_Jp, tuple<_Up...> >::type&& get(const tuple<_Up...>&&) _NOEXCEPT;
6113e519524SHoward Hinnantpublic:
6123e519524SHoward Hinnant
61365500d4bSEric Fiselier    template <bool _Dummy = true, class = typename enable_if<
6144927c295SEric Fiselier        _CheckArgsConstructor<_Dummy>::template __enable_default<_Tp...>()
61514c5ec51SMarshall Clow    >::type>
616789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
617a0f4c45cSHoward Hinnant    _LIBCPP_CONSTEXPR tuple()
618a0f4c45cSHoward Hinnant        _NOEXCEPT_(__all<is_nothrow_default_constructible<_Tp>::value...>::value) {}
619a62ebe04SHoward Hinnant
620aedcbf89SEric Fiselier    tuple(tuple const&) = default;
621aedcbf89SEric Fiselier    tuple(tuple&&) = default;
622aedcbf89SEric Fiselier
62390fb2bafSEric Fiselier    template <class _AllocArgT, class _Alloc, bool _Dummy = true, class = typename enable_if<
62490fb2bafSEric Fiselier        __lazy_and<
62509238677SEric Fiselier            is_same<allocator_arg_t, _AllocArgT>,
62690fb2bafSEric Fiselier            __lazy_all<__dependent_type<is_default_constructible<_Tp>, _Dummy>...>
62790fb2bafSEric Fiselier       >::value
62890fb2bafSEric Fiselier    >::type>
62990fb2bafSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
63090fb2bafSEric Fiselier    tuple(_AllocArgT, _Alloc const& __a)
63190fb2bafSEric Fiselier      : base_(allocator_arg_t(), __a,
63290fb2bafSEric Fiselier                    __tuple_indices<>(), __tuple_types<>(),
63390fb2bafSEric Fiselier                    typename __make_tuple_indices<sizeof...(_Tp), 0>::type(),
63490fb2bafSEric Fiselier                    __tuple_types<_Tp...>()) {}
63590fb2bafSEric Fiselier
6369795699aSEric Fiselier    template <bool _Dummy = true,
6379795699aSEric Fiselier              typename enable_if
6389795699aSEric Fiselier                      <
6399795699aSEric Fiselier                         _CheckArgsConstructor<
6409795699aSEric Fiselier                            _Dummy
64140905833SEric Fiselier                         >::template __enable_implicit<_Tp const&...>(),
6429795699aSEric Fiselier                         bool
6439795699aSEric Fiselier                      >::type = false
6449795699aSEric Fiselier        >
6459795699aSEric Fiselier    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
6469795699aSEric Fiselier    tuple(const _Tp& ... __t) _NOEXCEPT_((__all<is_nothrow_copy_constructible<_Tp>::value...>::value))
6479795699aSEric Fiselier        : base_(typename __make_tuple_indices<sizeof...(_Tp)>::type(),
6489795699aSEric Fiselier                typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(),
6499795699aSEric Fiselier                typename __make_tuple_indices<0>::type(),
6509795699aSEric Fiselier                typename __make_tuple_types<tuple, 0>::type(),
6519795699aSEric Fiselier                __t...
6529795699aSEric Fiselier               ) {}
6539795699aSEric Fiselier
6549795699aSEric Fiselier    template <bool _Dummy = true,
6559795699aSEric Fiselier              typename enable_if
6569795699aSEric Fiselier                      <
6579795699aSEric Fiselier                         _CheckArgsConstructor<
6589795699aSEric Fiselier                            _Dummy
65940905833SEric Fiselier                         >::template __enable_explicit<_Tp const&...>(),
6609795699aSEric Fiselier                         bool
6619795699aSEric Fiselier                      >::type = false
6629795699aSEric Fiselier        >
66375eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
6648a9ee148SHoward Hinnant    explicit tuple(const _Tp& ... __t) _NOEXCEPT_((__all<is_nothrow_copy_constructible<_Tp>::value...>::value))
6653e519524SHoward Hinnant        : base_(typename __make_tuple_indices<sizeof...(_Tp)>::type(),
6663e519524SHoward Hinnant                typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(),
6673e519524SHoward Hinnant                typename __make_tuple_indices<0>::type(),
6683e519524SHoward Hinnant                typename __make_tuple_types<tuple, 0>::type(),
6693e519524SHoward Hinnant                __t...
6703e519524SHoward Hinnant               ) {}
6713e519524SHoward Hinnant
6729795699aSEric Fiselier    template <class _Alloc, bool _Dummy = true,
6739795699aSEric Fiselier              typename enable_if
6749795699aSEric Fiselier                      <
6759795699aSEric Fiselier                         _CheckArgsConstructor<
6769795699aSEric Fiselier                            _Dummy
67740905833SEric Fiselier                         >::template __enable_implicit<_Tp const&...>(),
6789795699aSEric Fiselier                         bool
6799795699aSEric Fiselier                      >::type = false
6809795699aSEric Fiselier        >
681789847ddSHoward Hinnant      _LIBCPP_INLINE_VISIBILITY
6823e519524SHoward Hinnant      tuple(allocator_arg_t, const _Alloc& __a, const _Tp& ... __t)
6833e519524SHoward Hinnant        : base_(allocator_arg_t(), __a,
6843e519524SHoward Hinnant                typename __make_tuple_indices<sizeof...(_Tp)>::type(),
6853e519524SHoward Hinnant                typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(),
6863e519524SHoward Hinnant                typename __make_tuple_indices<0>::type(),
6873e519524SHoward Hinnant                typename __make_tuple_types<tuple, 0>::type(),
6883e519524SHoward Hinnant                __t...
6893e519524SHoward Hinnant               ) {}
6903e519524SHoward Hinnant
6919795699aSEric Fiselier    template <class _Alloc, bool _Dummy = true,
6929795699aSEric Fiselier              typename enable_if
6939795699aSEric Fiselier                      <
6949795699aSEric Fiselier                         _CheckArgsConstructor<
6959795699aSEric Fiselier                            _Dummy
69640905833SEric Fiselier                         >::template __enable_explicit<_Tp const&...>(),
6979795699aSEric Fiselier                         bool
6989795699aSEric Fiselier                      >::type = false
6999795699aSEric Fiselier        >
7009795699aSEric Fiselier      _LIBCPP_INLINE_VISIBILITY
7019795699aSEric Fiselier      explicit
7029795699aSEric Fiselier      tuple(allocator_arg_t, const _Alloc& __a, const _Tp& ... __t)
7039795699aSEric Fiselier        : base_(allocator_arg_t(), __a,
7049795699aSEric Fiselier                typename __make_tuple_indices<sizeof...(_Tp)>::type(),
7059795699aSEric Fiselier                typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(),
7069795699aSEric Fiselier                typename __make_tuple_indices<0>::type(),
7079795699aSEric Fiselier                typename __make_tuple_types<tuple, 0>::type(),
7089795699aSEric Fiselier                __t...
7099795699aSEric Fiselier               ) {}
7109795699aSEric Fiselier
7113e519524SHoward Hinnant    template <class ..._Up,
712bd688258SEric Fiselier              bool _PackIsTuple = _PackExpandsToThisTuple<_Up...>::value,
7130527c620SHoward Hinnant              typename enable_if
7143e519524SHoward Hinnant                      <
71574cba642SEric Fiselier                         _CheckArgsConstructor<
716bd688258SEric Fiselier                             sizeof...(_Up) == sizeof...(_Tp)
717bd688258SEric Fiselier                             && !_PackIsTuple
718bd688258SEric Fiselier                         >::template __enable_implicit<_Up...>() ||
719bd688258SEric Fiselier                        _CheckArgsConstructor<
720bd688258SEric Fiselier                            _EnableImplicitReducedArityExtension
721bd688258SEric Fiselier                            && sizeof...(_Up) < sizeof...(_Tp)
722bd688258SEric Fiselier                            && !_PackIsTuple
72374cba642SEric Fiselier                         >::template __enable_implicit<_Up...>(),
7240527c620SHoward Hinnant                         bool
7250527c620SHoward Hinnant                      >::type = false
7260527c620SHoward Hinnant             >
72775eff748SMarshall Clow        _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
7280527c620SHoward Hinnant        tuple(_Up&&... __u)
7298a9ee148SHoward Hinnant            _NOEXCEPT_((
73010a65e2eSMarshall Clow                is_nothrow_constructible<base,
7318a9ee148SHoward Hinnant                    typename __make_tuple_indices<sizeof...(_Up)>::type,
7328a9ee148SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Up)>::type,
7338a9ee148SHoward Hinnant                    typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type,
7348a9ee148SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type,
73510a65e2eSMarshall Clow                    _Up...
7368a9ee148SHoward Hinnant                >::value
7378a9ee148SHoward Hinnant            ))
7380527c620SHoward Hinnant            : base_(typename __make_tuple_indices<sizeof...(_Up)>::type(),
7390527c620SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Up)>::type(),
7400527c620SHoward Hinnant                    typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(),
7410527c620SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(),
7420527c620SHoward Hinnant                    _VSTD::forward<_Up>(__u)...) {}
7430527c620SHoward Hinnant
7440527c620SHoward Hinnant    template <class ..._Up,
7450527c620SHoward Hinnant              typename enable_if
7460527c620SHoward Hinnant                      <
74774cba642SEric Fiselier                         _CheckArgsConstructor<
74874cba642SEric Fiselier                             sizeof...(_Up) <= sizeof...(_Tp)
74974cba642SEric Fiselier                             && !_PackExpandsToThisTuple<_Up...>::value
750bd688258SEric Fiselier                         >::template __enable_explicit<_Up...>() ||
751bd688258SEric Fiselier                         _CheckArgsConstructor<
752bd688258SEric Fiselier                            !_EnableImplicitReducedArityExtension
753bd688258SEric Fiselier                            && sizeof...(_Up) < sizeof...(_Tp)
754bd688258SEric Fiselier                            && !_PackExpandsToThisTuple<_Up...>()
755bd688258SEric Fiselier                         >::template __enable_implicit<_Up...>(),
7560527c620SHoward Hinnant                         bool
7570527c620SHoward Hinnant                      >::type = false
7583e519524SHoward Hinnant             >
75975eff748SMarshall Clow        _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
7603e519524SHoward Hinnant        explicit
7613e519524SHoward Hinnant        tuple(_Up&&... __u)
7628a9ee148SHoward Hinnant            _NOEXCEPT_((
76310a65e2eSMarshall Clow                is_nothrow_constructible<base,
7648a9ee148SHoward Hinnant                    typename __make_tuple_indices<sizeof...(_Up)>::type,
7658a9ee148SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Up)>::type,
7668a9ee148SHoward Hinnant                    typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type,
7678a9ee148SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type,
7688a9ee148SHoward Hinnant                    _Up...
7698a9ee148SHoward Hinnant                >::value
7708a9ee148SHoward Hinnant            ))
7713e519524SHoward Hinnant            : base_(typename __make_tuple_indices<sizeof...(_Up)>::type(),
7723e519524SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Up)>::type(),
7733e519524SHoward Hinnant                    typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(),
7743e519524SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(),
775ce48a113SHoward Hinnant                    _VSTD::forward<_Up>(__u)...) {}
7763e519524SHoward Hinnant
7773e519524SHoward Hinnant    template <class _Alloc, class ..._Up,
7789795699aSEric Fiselier              typename enable_if
7793e519524SHoward Hinnant                      <
78074cba642SEric Fiselier                         _CheckArgsConstructor<
78190fb2bafSEric Fiselier                             sizeof...(_Up) == sizeof...(_Tp) &&
78274cba642SEric Fiselier                             !_PackExpandsToThisTuple<_Up...>::value
7839795699aSEric Fiselier                         >::template __enable_implicit<_Up...>(),
7849795699aSEric Fiselier                         bool
7859795699aSEric Fiselier                      >::type = false
7863e519524SHoward Hinnant             >
787789847ddSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
7883e519524SHoward Hinnant        tuple(allocator_arg_t, const _Alloc& __a, _Up&&... __u)
7893e519524SHoward Hinnant            : base_(allocator_arg_t(), __a,
7903e519524SHoward Hinnant                    typename __make_tuple_indices<sizeof...(_Up)>::type(),
7913e519524SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Up)>::type(),
7923e519524SHoward Hinnant                    typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(),
7933e519524SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(),
794ce48a113SHoward Hinnant                    _VSTD::forward<_Up>(__u)...) {}
7953e519524SHoward Hinnant
7969795699aSEric Fiselier    template <class _Alloc, class ..._Up,
7979795699aSEric Fiselier              typename enable_if
7989795699aSEric Fiselier                      <
7999795699aSEric Fiselier                         _CheckArgsConstructor<
8009795699aSEric Fiselier                             sizeof...(_Up) == sizeof...(_Tp) &&
8019795699aSEric Fiselier                             !_PackExpandsToThisTuple<_Up...>::value
8029795699aSEric Fiselier                         >::template __enable_explicit<_Up...>(),
8039795699aSEric Fiselier                         bool
8049795699aSEric Fiselier                      >::type = false
8059795699aSEric Fiselier             >
8069795699aSEric Fiselier        _LIBCPP_INLINE_VISIBILITY
8079795699aSEric Fiselier        explicit
8089795699aSEric Fiselier        tuple(allocator_arg_t, const _Alloc& __a, _Up&&... __u)
8099795699aSEric Fiselier            : base_(allocator_arg_t(), __a,
8109795699aSEric Fiselier                    typename __make_tuple_indices<sizeof...(_Up)>::type(),
8119795699aSEric Fiselier                    typename __make_tuple_types<tuple, sizeof...(_Up)>::type(),
8129795699aSEric Fiselier                    typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(),
8139795699aSEric Fiselier                    typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(),
8149795699aSEric Fiselier                    _VSTD::forward<_Up>(__u)...) {}
8159795699aSEric Fiselier
8163e519524SHoward Hinnant    template <class _Tuple,
8170527c620SHoward Hinnant              typename enable_if
8183e519524SHoward Hinnant                      <
81974cba642SEric Fiselier                         _CheckTupleLikeConstructor<
820347a1cc2SEric Fiselier                             __tuple_like_with_size<_Tuple, sizeof...(_Tp)>::value
821347a1cc2SEric Fiselier                             && !_PackExpandsToThisTuple<_Tuple>::value
822347a1cc2SEric Fiselier                         >::template __enable_implicit<_Tuple>(),
8230527c620SHoward Hinnant                         bool
8240527c620SHoward Hinnant                      >::type = false
8253e519524SHoward Hinnant             >
82675eff748SMarshall Clow        _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
827347a1cc2SEric Fiselier        tuple(_Tuple&& __t) _NOEXCEPT_((is_nothrow_constructible<base, _Tuple>::value))
828347a1cc2SEric Fiselier            : base_(_VSTD::forward<_Tuple>(__t)) {}
8293e519524SHoward Hinnant
8300527c620SHoward Hinnant    template <class _Tuple,
8310527c620SHoward Hinnant              typename enable_if
8320527c620SHoward Hinnant                      <
83374cba642SEric Fiselier                         _CheckTupleLikeConstructor<
834347a1cc2SEric Fiselier                             __tuple_like_with_size<_Tuple, sizeof...(_Tp)>::value
835347a1cc2SEric Fiselier                             && !_PackExpandsToThisTuple<_Tuple>::value
836347a1cc2SEric Fiselier                         >::template __enable_explicit<_Tuple>(),
8370527c620SHoward Hinnant                         bool
8380527c620SHoward Hinnant                      >::type = false
8390527c620SHoward Hinnant             >
84075eff748SMarshall Clow        _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
8410527c620SHoward Hinnant        explicit
842347a1cc2SEric Fiselier        tuple(_Tuple&& __t) _NOEXCEPT_((is_nothrow_constructible<base, _Tuple>::value))
843347a1cc2SEric Fiselier            : base_(_VSTD::forward<_Tuple>(__t)) {}
8440527c620SHoward Hinnant
8453e519524SHoward Hinnant    template <class _Alloc, class _Tuple,
8469795699aSEric Fiselier              typename enable_if
8473e519524SHoward Hinnant                      <
84874cba642SEric Fiselier                         _CheckTupleLikeConstructor<
849347a1cc2SEric Fiselier                             __tuple_like_with_size<_Tuple, sizeof...(_Tp)>::value
850347a1cc2SEric Fiselier                         >::template __enable_implicit<_Tuple>(),
8519795699aSEric Fiselier                         bool
8529795699aSEric Fiselier                      >::type = false
8533e519524SHoward Hinnant             >
854789847ddSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
8553e519524SHoward Hinnant        tuple(allocator_arg_t, const _Alloc& __a, _Tuple&& __t)
856347a1cc2SEric Fiselier            : base_(allocator_arg_t(), __a, _VSTD::forward<_Tuple>(__t)) {}
8573e519524SHoward Hinnant
8589795699aSEric Fiselier    template <class _Alloc, class _Tuple,
8599795699aSEric Fiselier              typename enable_if
8609795699aSEric Fiselier                      <
8619795699aSEric Fiselier                         _CheckTupleLikeConstructor<
862347a1cc2SEric Fiselier                             __tuple_like_with_size<_Tuple, sizeof...(_Tp)>::value
863347a1cc2SEric Fiselier                         >::template __enable_explicit<_Tuple>(),
8649795699aSEric Fiselier                         bool
8659795699aSEric Fiselier                      >::type = false
8669795699aSEric Fiselier             >
8679795699aSEric Fiselier        _LIBCPP_INLINE_VISIBILITY
8689795699aSEric Fiselier        explicit
8699795699aSEric Fiselier        tuple(allocator_arg_t, const _Alloc& __a, _Tuple&& __t)
870347a1cc2SEric Fiselier            : base_(allocator_arg_t(), __a, _VSTD::forward<_Tuple>(__t)) {}
8719795699aSEric Fiselier
872aedcbf89SEric Fiselier    using _CanCopyAssign = __all<is_copy_assignable<_Tp>::value...>;
873aedcbf89SEric Fiselier    using _CanMoveAssign = __all<is_move_assignable<_Tp>::value...>;
874aedcbf89SEric Fiselier
875aedcbf89SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
876347a1cc2SEric Fiselier    tuple& operator=(typename conditional<_CanCopyAssign::value, tuple, __nat>::type const& __t)
877aedcbf89SEric Fiselier        _NOEXCEPT_((__all<is_nothrow_copy_assignable<_Tp>::value...>::value))
878aedcbf89SEric Fiselier    {
879aedcbf89SEric Fiselier        base_.operator=(__t.base_);
880aedcbf89SEric Fiselier        return *this;
881aedcbf89SEric Fiselier    }
882aedcbf89SEric Fiselier
883aedcbf89SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
884aedcbf89SEric Fiselier    tuple& operator=(typename conditional<_CanMoveAssign::value, tuple, __nat>::type&& __t)
885aedcbf89SEric Fiselier        _NOEXCEPT_((__all<is_nothrow_move_assignable<_Tp>::value...>::value))
886aedcbf89SEric Fiselier    {
887aedcbf89SEric Fiselier        base_.operator=(static_cast<base&&>(__t.base_));
888aedcbf89SEric Fiselier        return *this;
889aedcbf89SEric Fiselier    }
890aedcbf89SEric Fiselier
8913e519524SHoward Hinnant    template <class _Tuple,
8923e519524SHoward Hinnant              class = typename enable_if
8933e519524SHoward Hinnant                      <
894347a1cc2SEric Fiselier                         __tuple_assignable<_Tuple, tuple>::value
8953e519524SHoward Hinnant                      >::type
8963e519524SHoward Hinnant             >
897789847ddSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
8983e519524SHoward Hinnant        tuple&
899347a1cc2SEric Fiselier        operator=(_Tuple&& __t) _NOEXCEPT_((is_nothrow_assignable<base&, _Tuple>::value))
9003e519524SHoward Hinnant        {
901347a1cc2SEric Fiselier            base_.operator=(_VSTD::forward<_Tuple>(__t));
9023e519524SHoward Hinnant            return *this;
9033e519524SHoward Hinnant        }
9043e519524SHoward Hinnant
905789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
90627d0a2a7SHoward Hinnant    void swap(tuple& __t) _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value)
90727d0a2a7SHoward Hinnant        {base_.swap(__t.base_);}
9083e519524SHoward Hinnant};
9093e519524SHoward Hinnant
9103e519524SHoward Hinnanttemplate <>
911*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS tuple<>
9123e519524SHoward Hinnant{
9133e519524SHoward Hinnantpublic:
914789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
915a0f4c45cSHoward Hinnant    _LIBCPP_CONSTEXPR tuple() _NOEXCEPT {}
9163e519524SHoward Hinnant    template <class _Alloc>
917789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9188a9ee148SHoward Hinnant        tuple(allocator_arg_t, const _Alloc&) _NOEXCEPT {}
9193e519524SHoward Hinnant    template <class _Alloc>
920789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9218a9ee148SHoward Hinnant        tuple(allocator_arg_t, const _Alloc&, const tuple&) _NOEXCEPT {}
922c003db1fSHoward Hinnant    template <class _Up>
923789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9248a9ee148SHoward Hinnant        tuple(array<_Up, 0>) _NOEXCEPT {}
925c003db1fSHoward Hinnant    template <class _Alloc, class _Up>
926789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9278a9ee148SHoward Hinnant        tuple(allocator_arg_t, const _Alloc&, array<_Up, 0>) _NOEXCEPT {}
928789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
92927d0a2a7SHoward Hinnant    void swap(tuple&) _NOEXCEPT {}
9303e519524SHoward Hinnant};
9313e519524SHoward Hinnant
9323e519524SHoward Hinnanttemplate <class ..._Tp>
9333e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
934bc95cf0dSHoward Hinnanttypename enable_if
935bc95cf0dSHoward Hinnant<
936bc95cf0dSHoward Hinnant    __all<__is_swappable<_Tp>::value...>::value,
9373e519524SHoward Hinnant    void
938bc95cf0dSHoward Hinnant>::type
93927d0a2a7SHoward Hinnantswap(tuple<_Tp...>& __t, tuple<_Tp...>& __u)
94027d0a2a7SHoward Hinnant                 _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value)
94127d0a2a7SHoward Hinnant    {__t.swap(__u);}
9423e519524SHoward Hinnant
9433e519524SHoward Hinnant// get
9443e519524SHoward Hinnant
9453e519524SHoward Hinnanttemplate <size_t _Ip, class ..._Tp>
9468bf1f08aSMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
9473e519524SHoward Hinnanttypename tuple_element<_Ip, tuple<_Tp...> >::type&
948c206366fSHoward Hinnantget(tuple<_Tp...>& __t) _NOEXCEPT
9493e519524SHoward Hinnant{
9503e519524SHoward Hinnant    typedef typename tuple_element<_Ip, tuple<_Tp...> >::type type;
9513e519524SHoward Hinnant    return static_cast<__tuple_leaf<_Ip, type>&>(__t.base_).get();
9523e519524SHoward Hinnant}
9533e519524SHoward Hinnant
9543e519524SHoward Hinnanttemplate <size_t _Ip, class ..._Tp>
9558bf1f08aSMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
9563e519524SHoward Hinnantconst typename tuple_element<_Ip, tuple<_Tp...> >::type&
957c206366fSHoward Hinnantget(const tuple<_Tp...>& __t) _NOEXCEPT
9583e519524SHoward Hinnant{
9593e519524SHoward Hinnant    typedef typename tuple_element<_Ip, tuple<_Tp...> >::type type;
9603e519524SHoward Hinnant    return static_cast<const __tuple_leaf<_Ip, type>&>(__t.base_).get();
9613e519524SHoward Hinnant}
9623e519524SHoward Hinnant
963601afb30SHoward Hinnanttemplate <size_t _Ip, class ..._Tp>
9648bf1f08aSMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
965601afb30SHoward Hinnanttypename tuple_element<_Ip, tuple<_Tp...> >::type&&
966c206366fSHoward Hinnantget(tuple<_Tp...>&& __t) _NOEXCEPT
967601afb30SHoward Hinnant{
968601afb30SHoward Hinnant    typedef typename tuple_element<_Ip, tuple<_Tp...> >::type type;
9692a3f1bc1SHoward Hinnant    return static_cast<type&&>(
970912e161cSDouglas Gregor             static_cast<__tuple_leaf<_Ip, type>&&>(__t.base_).get());
971601afb30SHoward Hinnant}
972601afb30SHoward Hinnant
973545b8861SEric Fiseliertemplate <size_t _Ip, class ..._Tp>
974545b8861SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
975545b8861SEric Fiselierconst typename tuple_element<_Ip, tuple<_Tp...> >::type&&
976545b8861SEric Fiselierget(const tuple<_Tp...>&& __t) _NOEXCEPT
977545b8861SEric Fiselier{
978545b8861SEric Fiselier    typedef typename tuple_element<_Ip, tuple<_Tp...> >::type type;
979545b8861SEric Fiselier    return static_cast<const type&&>(
980545b8861SEric Fiselier             static_cast<const __tuple_leaf<_Ip, type>&&>(__t.base_).get());
981545b8861SEric Fiselier}
982545b8861SEric Fiselier
983e99520c7SMarshall Clow#if _LIBCPP_STD_VER > 11
984e99520c7SMarshall Clow
985f447e62eSEric Fiseliernamespace __find_detail {
986f447e62eSEric Fiselier
987f447e62eSEric Fiselierstatic constexpr size_t __not_found = -1;
988f447e62eSEric Fiselierstatic constexpr size_t __ambiguous = __not_found - 1;
989f447e62eSEric Fiselier
990f447e62eSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
991f447e62eSEric Fiselierconstexpr size_t __find_idx_return(size_t __curr_i, size_t __res, bool __matches) {
992f447e62eSEric Fiselier    return !__matches ? __res :
993f447e62eSEric Fiselier        (__res == __not_found ? __curr_i : __ambiguous);
994f447e62eSEric Fiselier}
995f447e62eSEric Fiselier
996f447e62eSEric Fiseliertemplate <size_t _Nx>
997f447e62eSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
998f447e62eSEric Fiselierconstexpr size_t __find_idx(size_t __i, const bool (&__matches)[_Nx]) {
999f447e62eSEric Fiselier  return __i == _Nx ? __not_found :
1000f447e62eSEric Fiselier      __find_idx_return(__i, __find_idx(__i + 1, __matches), __matches[__i]);
1001f447e62eSEric Fiselier}
1002f447e62eSEric Fiselier
1003f447e62eSEric Fiseliertemplate <class _T1, class ..._Args>
1004f447e62eSEric Fiselierstruct __find_exactly_one_checked {
1005f447e62eSEric Fiselier  static constexpr bool __matches[] = {is_same<_T1, _Args>::value...};
1006f447e62eSEric Fiselier    static constexpr size_t value = __find_detail::__find_idx(0, __matches);
1007f447e62eSEric Fiselier    static_assert (value != __not_found, "type not found in type list" );
1008f447e62eSEric Fiselier    static_assert(value != __ambiguous,"type occurs more than once in type list");
1009e99520c7SMarshall Clow};
1010e99520c7SMarshall Clow
10114f905b8dSEric Fiseliertemplate <class _T1>
10124f905b8dSEric Fiselierstruct __find_exactly_one_checked<_T1> {
10134f905b8dSEric Fiselier    static_assert(!is_same<_T1, _T1>::value, "type not in empty type list");
10144f905b8dSEric Fiselier};
10154f905b8dSEric Fiselier
1016f447e62eSEric Fiselier} // namespace __find_detail;
1017e99520c7SMarshall Clow
1018e99520c7SMarshall Clowtemplate <typename _T1, typename... _Args>
1019f447e62eSEric Fiselierstruct __find_exactly_one_t
1020f447e62eSEric Fiselier    : public __find_detail::__find_exactly_one_checked<_T1, _Args...> {
1021e99520c7SMarshall Clow};
1022e99520c7SMarshall Clow
1023e99520c7SMarshall Clowtemplate <class _T1, class... _Args>
1024e99520c7SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
1025e99520c7SMarshall Clowconstexpr _T1& get(tuple<_Args...>& __tup) noexcept
1026e99520c7SMarshall Clow{
1027e99520c7SMarshall Clow    return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(__tup);
1028e99520c7SMarshall Clow}
1029e99520c7SMarshall Clow
1030e99520c7SMarshall Clowtemplate <class _T1, class... _Args>
1031e99520c7SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
1032e99520c7SMarshall Clowconstexpr _T1 const& get(tuple<_Args...> const& __tup) noexcept
1033e99520c7SMarshall Clow{
1034e99520c7SMarshall Clow    return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(__tup);
1035e99520c7SMarshall Clow}
1036e99520c7SMarshall Clow
1037e99520c7SMarshall Clowtemplate <class _T1, class... _Args>
1038e99520c7SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
1039e99520c7SMarshall Clowconstexpr _T1&& get(tuple<_Args...>&& __tup) noexcept
1040e99520c7SMarshall Clow{
10411c682f0fSMarshall Clow    return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(_VSTD::move(__tup));
1042e99520c7SMarshall Clow}
1043e99520c7SMarshall Clow
1044545b8861SEric Fiseliertemplate <class _T1, class... _Args>
1045545b8861SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
1046545b8861SEric Fiselierconstexpr _T1 const&& get(tuple<_Args...> const&& __tup) noexcept
1047545b8861SEric Fiselier{
1048545b8861SEric Fiselier    return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(_VSTD::move(__tup));
1049545b8861SEric Fiselier}
1050545b8861SEric Fiselier
1051e99520c7SMarshall Clow#endif
1052e99520c7SMarshall Clow
10533e519524SHoward Hinnant// tie
10543e519524SHoward Hinnant
10553e519524SHoward Hinnanttemplate <class ..._Tp>
10560d1560e1SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
10573e519524SHoward Hinnanttuple<_Tp&...>
10588a9ee148SHoward Hinnanttie(_Tp&... __t) _NOEXCEPT
10593e519524SHoward Hinnant{
10603e519524SHoward Hinnant    return tuple<_Tp&...>(__t...);
10613e519524SHoward Hinnant}
10623e519524SHoward Hinnant
10633e519524SHoward Hinnanttemplate <class _Up>
10643e519524SHoward Hinnantstruct __ignore_t
10653e519524SHoward Hinnant{
10663e519524SHoward Hinnant    template <class _Tp>
1067789847ddSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
10683e519524SHoward Hinnant        const __ignore_t& operator=(_Tp&&) const {return *this;}
10693e519524SHoward Hinnant};
10703e519524SHoward Hinnant
10713e519524SHoward Hinnantnamespace { const __ignore_t<unsigned char> ignore = __ignore_t<unsigned char>(); }
10723e519524SHoward Hinnant
10733e519524SHoward Hinnanttemplate <class _Tp>
10740724bf67SMarshall Clowstruct __make_tuple_return_impl
10753e519524SHoward Hinnant{
10763e519524SHoward Hinnant    typedef _Tp type;
10773e519524SHoward Hinnant};
10783e519524SHoward Hinnant
10793e519524SHoward Hinnanttemplate <class _Tp>
10800724bf67SMarshall Clowstruct __make_tuple_return_impl<reference_wrapper<_Tp> >
10813e519524SHoward Hinnant{
10823e519524SHoward Hinnant    typedef _Tp& type;
10833e519524SHoward Hinnant};
10843e519524SHoward Hinnant
10853e519524SHoward Hinnanttemplate <class _Tp>
10863e519524SHoward Hinnantstruct __make_tuple_return
10873e519524SHoward Hinnant{
10880724bf67SMarshall Clow    typedef typename __make_tuple_return_impl<typename decay<_Tp>::type>::type type;
10893e519524SHoward Hinnant};
10903e519524SHoward Hinnant
10913e519524SHoward Hinnanttemplate <class... _Tp>
109275eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
10933e519524SHoward Hinnanttuple<typename __make_tuple_return<_Tp>::type...>
10943e519524SHoward Hinnantmake_tuple(_Tp&&... __t)
10953e519524SHoward Hinnant{
1096ce48a113SHoward Hinnant    return tuple<typename __make_tuple_return<_Tp>::type...>(_VSTD::forward<_Tp>(__t)...);
10973e519524SHoward Hinnant}
10983e519524SHoward Hinnant
10991102fbbdSHoward Hinnanttemplate <class... _Tp>
110075eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
110175eff748SMarshall Clowtuple<_Tp&&...>
11028a9ee148SHoward Hinnantforward_as_tuple(_Tp&&... __t) _NOEXCEPT
11031102fbbdSHoward Hinnant{
1104ce48a113SHoward Hinnant    return tuple<_Tp&&...>(_VSTD::forward<_Tp>(__t)...);
11051102fbbdSHoward Hinnant}
11061102fbbdSHoward Hinnant
1107c003db1fSHoward Hinnanttemplate <size_t _Ip>
11083e519524SHoward Hinnantstruct __tuple_equal
11093e519524SHoward Hinnant{
11103e519524SHoward Hinnant    template <class _Tp, class _Up>
111175eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
11123e519524SHoward Hinnant    bool operator()(const _Tp& __x, const _Up& __y)
11133e519524SHoward Hinnant    {
1114f9af6140SMarshall Clow        return __tuple_equal<_Ip - 1>()(__x, __y) && _VSTD::get<_Ip-1>(__x) == _VSTD::get<_Ip-1>(__y);
11153e519524SHoward Hinnant    }
11163e519524SHoward Hinnant};
11173e519524SHoward Hinnant
11183e519524SHoward Hinnanttemplate <>
11193e519524SHoward Hinnantstruct __tuple_equal<0>
11203e519524SHoward Hinnant{
11213e519524SHoward Hinnant    template <class _Tp, class _Up>
112275eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
11233e519524SHoward Hinnant    bool operator()(const _Tp&, const _Up&)
11243e519524SHoward Hinnant    {
11253e519524SHoward Hinnant        return true;
11263e519524SHoward Hinnant    }
11273e519524SHoward Hinnant};
11283e519524SHoward Hinnant
11293e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up>
113075eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
11313e519524SHoward Hinnantbool
11323e519524SHoward Hinnantoperator==(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
11333e519524SHoward Hinnant{
11343e519524SHoward Hinnant    return __tuple_equal<sizeof...(_Tp)>()(__x, __y);
11353e519524SHoward Hinnant}
11363e519524SHoward Hinnant
11373e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up>
113875eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
11393e519524SHoward Hinnantbool
11403e519524SHoward Hinnantoperator!=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
11413e519524SHoward Hinnant{
11423e519524SHoward Hinnant    return !(__x == __y);
11433e519524SHoward Hinnant}
11443e519524SHoward Hinnant
1145c003db1fSHoward Hinnanttemplate <size_t _Ip>
11463e519524SHoward Hinnantstruct __tuple_less
11473e519524SHoward Hinnant{
11483e519524SHoward Hinnant    template <class _Tp, class _Up>
114975eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
11503e519524SHoward Hinnant    bool operator()(const _Tp& __x, const _Up& __y)
11513e519524SHoward Hinnant    {
115253afae49SDuncan P. N. Exon Smith        const size_t __idx = tuple_size<_Tp>::value - _Ip;
115353afae49SDuncan P. N. Exon Smith        if (_VSTD::get<__idx>(__x) < _VSTD::get<__idx>(__y))
115453afae49SDuncan P. N. Exon Smith            return true;
115553afae49SDuncan P. N. Exon Smith        if (_VSTD::get<__idx>(__y) < _VSTD::get<__idx>(__x))
115653afae49SDuncan P. N. Exon Smith            return false;
115753afae49SDuncan P. N. Exon Smith        return __tuple_less<_Ip-1>()(__x, __y);
11583e519524SHoward Hinnant    }
11593e519524SHoward Hinnant};
11603e519524SHoward Hinnant
11613e519524SHoward Hinnanttemplate <>
11623e519524SHoward Hinnantstruct __tuple_less<0>
11633e519524SHoward Hinnant{
11643e519524SHoward Hinnant    template <class _Tp, class _Up>
116575eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
11663e519524SHoward Hinnant    bool operator()(const _Tp&, const _Up&)
11673e519524SHoward Hinnant    {
11683e519524SHoward Hinnant        return false;
11693e519524SHoward Hinnant    }
11703e519524SHoward Hinnant};
11713e519524SHoward Hinnant
11723e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up>
117375eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
11743e519524SHoward Hinnantbool
11753e519524SHoward Hinnantoperator<(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
11763e519524SHoward Hinnant{
11773e519524SHoward Hinnant    return __tuple_less<sizeof...(_Tp)>()(__x, __y);
11783e519524SHoward Hinnant}
11793e519524SHoward Hinnant
11803e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up>
118175eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
11823e519524SHoward Hinnantbool
11833e519524SHoward Hinnantoperator>(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
11843e519524SHoward Hinnant{
11853e519524SHoward Hinnant    return __y < __x;
11863e519524SHoward Hinnant}
11873e519524SHoward Hinnant
11883e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up>
118975eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
11903e519524SHoward Hinnantbool
11913e519524SHoward Hinnantoperator>=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
11923e519524SHoward Hinnant{
11933e519524SHoward Hinnant    return !(__x < __y);
11943e519524SHoward Hinnant}
11953e519524SHoward Hinnant
11963e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up>
119775eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
11983e519524SHoward Hinnantbool
11993e519524SHoward Hinnantoperator<=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
12003e519524SHoward Hinnant{
12013e519524SHoward Hinnant    return !(__y < __x);
12023e519524SHoward Hinnant}
12033e519524SHoward Hinnant
12043e519524SHoward Hinnant// tuple_cat
12053e519524SHoward Hinnant
12067f64810bSHoward Hinnanttemplate <class _Tp, class _Up> struct __tuple_cat_type;
12077f64810bSHoward Hinnant
12087f64810bSHoward Hinnanttemplate <class ..._Ttypes, class ..._Utypes>
12097f64810bSHoward Hinnantstruct __tuple_cat_type<tuple<_Ttypes...>, __tuple_types<_Utypes...> >
12103e519524SHoward Hinnant{
12117f64810bSHoward Hinnant    typedef tuple<_Ttypes..., _Utypes...> type;
12127f64810bSHoward Hinnant};
12137f64810bSHoward Hinnant
12147f64810bSHoward Hinnanttemplate <class _ResultTuple, bool _Is_Tuple0TupleLike, class ..._Tuples>
12157f64810bSHoward Hinnantstruct __tuple_cat_return_1
12167f64810bSHoward Hinnant{
12177f64810bSHoward Hinnant};
12187f64810bSHoward Hinnant
12197f64810bSHoward Hinnanttemplate <class ..._Types, class _Tuple0>
12207f64810bSHoward Hinnantstruct __tuple_cat_return_1<tuple<_Types...>, true, _Tuple0>
12217f64810bSHoward Hinnant{
12227f64810bSHoward Hinnant    typedef typename __tuple_cat_type<tuple<_Types...>,
12237f64810bSHoward Hinnant            typename __make_tuple_types<typename remove_reference<_Tuple0>::type>::type>::type
12247f64810bSHoward Hinnant                                                                           type;
12257f64810bSHoward Hinnant};
12267f64810bSHoward Hinnant
12277f64810bSHoward Hinnanttemplate <class ..._Types, class _Tuple0, class _Tuple1, class ..._Tuples>
12287f64810bSHoward Hinnantstruct __tuple_cat_return_1<tuple<_Types...>, true, _Tuple0, _Tuple1, _Tuples...>
12297f64810bSHoward Hinnant    : public __tuple_cat_return_1<
12307f64810bSHoward Hinnant                 typename __tuple_cat_type<
12317f64810bSHoward Hinnant                     tuple<_Types...>,
12327f64810bSHoward Hinnant                     typename __make_tuple_types<typename remove_reference<_Tuple0>::type>::type
12337f64810bSHoward Hinnant                 >::type,
12347f64810bSHoward Hinnant                 __tuple_like<typename remove_reference<_Tuple1>::type>::value,
12357f64810bSHoward Hinnant                 _Tuple1, _Tuples...>
12367f64810bSHoward Hinnant{
12377f64810bSHoward Hinnant};
12387f64810bSHoward Hinnant
12397f64810bSHoward Hinnanttemplate <class ..._Tuples> struct __tuple_cat_return;
12407f64810bSHoward Hinnant
12417f64810bSHoward Hinnanttemplate <class _Tuple0, class ..._Tuples>
12427f64810bSHoward Hinnantstruct __tuple_cat_return<_Tuple0, _Tuples...>
12437f64810bSHoward Hinnant    : public __tuple_cat_return_1<tuple<>,
12447f64810bSHoward Hinnant         __tuple_like<typename remove_reference<_Tuple0>::type>::value, _Tuple0,
12457f64810bSHoward Hinnant                                                                     _Tuples...>
12467f64810bSHoward Hinnant{
12477f64810bSHoward Hinnant};
12487f64810bSHoward Hinnant
12497f64810bSHoward Hinnanttemplate <>
12507f64810bSHoward Hinnantstruct __tuple_cat_return<>
12517f64810bSHoward Hinnant{
12527f64810bSHoward Hinnant    typedef tuple<> type;
12537f64810bSHoward Hinnant};
12547f64810bSHoward Hinnant
125575eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
12567f64810bSHoward Hinnanttuple<>
12577f64810bSHoward Hinnanttuple_cat()
12587f64810bSHoward Hinnant{
12597f64810bSHoward Hinnant    return tuple<>();
12603e519524SHoward Hinnant}
12613e519524SHoward Hinnant
1262c003db1fSHoward Hinnanttemplate <class _Rp, class _Indices, class _Tuple0, class ..._Tuples>
1263ba31cbdbSHoward Hinnantstruct __tuple_cat_return_ref_imp;
12643e519524SHoward Hinnant
1265ba31cbdbSHoward Hinnanttemplate <class ..._Types, size_t ..._I0, class _Tuple0>
1266ba31cbdbSHoward Hinnantstruct __tuple_cat_return_ref_imp<tuple<_Types...>, __tuple_indices<_I0...>, _Tuple0>
12673e519524SHoward Hinnant{
12687f64810bSHoward Hinnant    typedef typename remove_reference<_Tuple0>::type _T0;
1269ba31cbdbSHoward Hinnant    typedef tuple<_Types..., typename __apply_cv<_Tuple0,
1270ba31cbdbSHoward Hinnant                          typename tuple_element<_I0, _T0>::type>::type&&...> type;
1271ba31cbdbSHoward Hinnant};
1272ba31cbdbSHoward Hinnant
1273ba31cbdbSHoward Hinnanttemplate <class ..._Types, size_t ..._I0, class _Tuple0, class _Tuple1, class ..._Tuples>
1274ba31cbdbSHoward Hinnantstruct __tuple_cat_return_ref_imp<tuple<_Types...>, __tuple_indices<_I0...>,
1275ba31cbdbSHoward Hinnant                                  _Tuple0, _Tuple1, _Tuples...>
1276ba31cbdbSHoward Hinnant    : public __tuple_cat_return_ref_imp<
1277ba31cbdbSHoward Hinnant         tuple<_Types..., typename __apply_cv<_Tuple0,
1278ba31cbdbSHoward Hinnant               typename tuple_element<_I0,
1279ba31cbdbSHoward Hinnant                  typename remove_reference<_Tuple0>::type>::type>::type&&...>,
1280ba31cbdbSHoward Hinnant         typename __make_tuple_indices<tuple_size<typename
1281ba31cbdbSHoward Hinnant                                 remove_reference<_Tuple1>::type>::value>::type,
1282ba31cbdbSHoward Hinnant         _Tuple1, _Tuples...>
1283ba31cbdbSHoward Hinnant{
1284ba31cbdbSHoward Hinnant};
1285ba31cbdbSHoward Hinnant
1286ba31cbdbSHoward Hinnanttemplate <class _Tuple0, class ..._Tuples>
1287ba31cbdbSHoward Hinnantstruct __tuple_cat_return_ref
1288ba31cbdbSHoward Hinnant    : public __tuple_cat_return_ref_imp<tuple<>,
1289ba31cbdbSHoward Hinnant               typename __make_tuple_indices<
1290ba31cbdbSHoward Hinnant                        tuple_size<typename remove_reference<_Tuple0>::type>::value
1291ba31cbdbSHoward Hinnant               >::type, _Tuple0, _Tuples...>
1292ba31cbdbSHoward Hinnant{
1293ba31cbdbSHoward Hinnant};
1294ba31cbdbSHoward Hinnant
1295ba31cbdbSHoward Hinnanttemplate <class _Types, class _I0, class _J0>
1296ba31cbdbSHoward Hinnantstruct __tuple_cat;
1297ba31cbdbSHoward Hinnant
1298ba31cbdbSHoward Hinnanttemplate <class ..._Types, size_t ..._I0, size_t ..._J0>
1299ba31cbdbSHoward Hinnantstruct __tuple_cat<tuple<_Types...>, __tuple_indices<_I0...>, __tuple_indices<_J0...> >
1300ba31cbdbSHoward Hinnant{
1301ba31cbdbSHoward Hinnant    template <class _Tuple0>
130275eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
1303ba31cbdbSHoward Hinnant    typename __tuple_cat_return_ref<tuple<_Types...>&&, _Tuple0&&>::type
1304ba31cbdbSHoward Hinnant    operator()(tuple<_Types...> __t, _Tuple0&& __t0)
1305ba31cbdbSHoward Hinnant    {
1306f9af6140SMarshall Clow        return forward_as_tuple(_VSTD::forward<_Types>(_VSTD::get<_I0>(__t))...,
1307f9af6140SMarshall Clow                                      _VSTD::get<_J0>(_VSTD::forward<_Tuple0>(__t0))...);
13083e519524SHoward Hinnant    }
13093e519524SHoward Hinnant
13107f64810bSHoward Hinnant    template <class _Tuple0, class _Tuple1, class ..._Tuples>
131175eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
1312ba31cbdbSHoward Hinnant    typename __tuple_cat_return_ref<tuple<_Types...>&&, _Tuple0&&, _Tuple1&&, _Tuples&&...>::type
1313ba31cbdbSHoward Hinnant    operator()(tuple<_Types...> __t, _Tuple0&& __t0, _Tuple1&& __t1, _Tuples&& ...__tpls)
13143e519524SHoward Hinnant    {
1315ba31cbdbSHoward Hinnant        typedef typename remove_reference<_Tuple0>::type _T0;
1316ba31cbdbSHoward Hinnant        typedef typename remove_reference<_Tuple1>::type _T1;
1317ba31cbdbSHoward Hinnant        return __tuple_cat<
1318ba31cbdbSHoward Hinnant           tuple<_Types..., typename __apply_cv<_Tuple0, typename tuple_element<_J0, _T0>::type>::type&&...>,
1319ba31cbdbSHoward Hinnant           typename __make_tuple_indices<sizeof ...(_Types) + tuple_size<_T0>::value>::type,
1320ba31cbdbSHoward Hinnant           typename __make_tuple_indices<tuple_size<_T1>::value>::type>()
1321de9320aaSMarshall Clow                           (forward_as_tuple(
1322f9af6140SMarshall Clow                              _VSTD::forward<_Types>(_VSTD::get<_I0>(__t))...,
1323f9af6140SMarshall Clow                              _VSTD::get<_J0>(_VSTD::forward<_Tuple0>(__t0))...
1324ba31cbdbSHoward Hinnant                            ),
1325ce48a113SHoward Hinnant                            _VSTD::forward<_Tuple1>(__t1),
1326ce48a113SHoward Hinnant                            _VSTD::forward<_Tuples>(__tpls)...);
1327ba31cbdbSHoward Hinnant    }
1328ba31cbdbSHoward Hinnant};
1329ba31cbdbSHoward Hinnant
1330ba31cbdbSHoward Hinnanttemplate <class _Tuple0, class... _Tuples>
133175eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
1332ba31cbdbSHoward Hinnanttypename __tuple_cat_return<_Tuple0, _Tuples...>::type
1333ba31cbdbSHoward Hinnanttuple_cat(_Tuple0&& __t0, _Tuples&&... __tpls)
1334ba31cbdbSHoward Hinnant{
1335ba31cbdbSHoward Hinnant    typedef typename remove_reference<_Tuple0>::type _T0;
1336ba31cbdbSHoward Hinnant    return __tuple_cat<tuple<>, __tuple_indices<>,
1337ba31cbdbSHoward Hinnant                  typename __make_tuple_indices<tuple_size<_T0>::value>::type>()
1338ce48a113SHoward Hinnant                  (tuple<>(), _VSTD::forward<_Tuple0>(__t0),
1339ce48a113SHoward Hinnant                                            _VSTD::forward<_Tuples>(__tpls)...);
13403e519524SHoward Hinnant}
13413e519524SHoward Hinnant
13423e519524SHoward Hinnanttemplate <class ..._Tp, class _Alloc>
1343*e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS uses_allocator<tuple<_Tp...>, _Alloc>
13443e519524SHoward Hinnant    : true_type {};
13453e519524SHoward Hinnant
13464927c295SEric Fiselier#endif // _LIBCPP_HAS_NO_VARIADICS
13474927c295SEric Fiselier
13484927c295SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
13493e519524SHoward Hinnanttemplate <class _T1, class _T2>
13503e519524SHoward Hinnanttemplate <class... _Args1, class... _Args2, size_t ..._I1, size_t ..._I2>
13513e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
13523e519524SHoward Hinnantpair<_T1, _T2>::pair(piecewise_construct_t,
13533e519524SHoward Hinnant                     tuple<_Args1...>& __first_args, tuple<_Args2...>& __second_args,
13543e519524SHoward Hinnant                     __tuple_indices<_I1...>, __tuple_indices<_I2...>)
1355f9af6140SMarshall Clow    :  first(_VSTD::forward<_Args1>(_VSTD::get<_I1>( __first_args))...),
1356f9af6140SMarshall Clow      second(_VSTD::forward<_Args2>(_VSTD::get<_I2>(__second_args))...)
13573e519524SHoward Hinnant{
13583e519524SHoward Hinnant}
13594927c295SEric Fiselier#endif // _LIBCPP_CXX03_LANG
13603e519524SHoward Hinnant
136103e29a29SEric Fiselier#if _LIBCPP_STD_VER > 14
136203e29a29SEric Fiseliertemplate <class _Tp>
136303e29a29SEric Fiselierconstexpr size_t tuple_size_v = tuple_size<_Tp>::value;
136403e29a29SEric Fiselier
136503e29a29SEric Fiselier#define _LIBCPP_NOEXCEPT_RETURN(...) noexcept(noexcept(__VA_ARGS__)) { return __VA_ARGS__; }
136603e29a29SEric Fiselier
136703e29a29SEric Fiseliertemplate <class _Fn, class _Tuple, size_t ..._Id>
136803e29a29SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
136903e29a29SEric Fiselierconstexpr decltype(auto) __apply_tuple_impl(_Fn && __f, _Tuple && __t,
137003e29a29SEric Fiselier                                            __tuple_indices<_Id...>)
137103e29a29SEric Fiselier_LIBCPP_NOEXCEPT_RETURN(
137203e29a29SEric Fiselier    _VSTD::__invoke_constexpr(
137303e29a29SEric Fiselier        _VSTD::forward<_Fn>(__f),
137403e29a29SEric Fiselier        _VSTD::get<_Id>(_VSTD::forward<_Tuple>(__t))...)
137503e29a29SEric Fiselier)
137603e29a29SEric Fiselier
137703e29a29SEric Fiseliertemplate <class _Fn, class _Tuple>
137803e29a29SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
137903e29a29SEric Fiselierconstexpr decltype(auto) apply(_Fn && __f, _Tuple && __t)
138003e29a29SEric Fiselier_LIBCPP_NOEXCEPT_RETURN(
138103e29a29SEric Fiselier    _VSTD::__apply_tuple_impl(
138203e29a29SEric Fiselier        _VSTD::forward<_Fn>(__f), _VSTD::forward<_Tuple>(__t),
138303e29a29SEric Fiselier        typename __make_tuple_indices<tuple_size_v<decay_t<_Tuple>>>::type{})
138403e29a29SEric Fiselier)
138503e29a29SEric Fiselier
138603e29a29SEric Fiseliertemplate <class _Tp, class _Tuple, size_t... _Idx>
138703e29a29SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
138803e29a29SEric Fiselierconstexpr _Tp __make_from_tuple_impl(_Tuple&& __t, __tuple_indices<_Idx...>)
138903e29a29SEric Fiselier_LIBCPP_NOEXCEPT_RETURN(
139003e29a29SEric Fiselier    _Tp(_VSTD::get<_Idx>(_VSTD::forward<_Tuple>(__t))...)
139103e29a29SEric Fiselier)
139203e29a29SEric Fiselier
139303e29a29SEric Fiseliertemplate <class _Tp, class _Tuple>
139403e29a29SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
139503e29a29SEric Fiselierconstexpr _Tp make_from_tuple(_Tuple&& __t)
139603e29a29SEric Fiselier_LIBCPP_NOEXCEPT_RETURN(
139703e29a29SEric Fiselier    _VSTD::__make_from_tuple_impl<_Tp>(_VSTD::forward<_Tuple>(__t),
139803e29a29SEric Fiselier        typename __make_tuple_indices<tuple_size_v<decay_t<_Tuple>>>::type{})
139903e29a29SEric Fiselier)
140003e29a29SEric Fiselier
140103e29a29SEric Fiselier#undef _LIBCPP_NOEXCEPT_RETURN
140203e29a29SEric Fiselier
140303e29a29SEric Fiselier#endif // _LIBCPP_STD_VER > 14
140403e29a29SEric Fiselier
14053e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
14063e519524SHoward Hinnant
14073e519524SHoward Hinnant#endif  // _LIBCPP_TUPLE
1408