xref: /llvm-project-15.0.7/libcxx/include/tuple (revision aedcbf89)
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:
873e519524SHoward Hinnanttemplate <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
1533e519524SHoward Hinnant// tuple_size
1543e519524SHoward Hinnant
1553e519524SHoward Hinnanttemplate <class ..._Tp>
156f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS_ONLY tuple_size<tuple<_Tp...> >
1573e519524SHoward Hinnant    : public integral_constant<size_t, sizeof...(_Tp)>
1583e519524SHoward Hinnant{
1593e519524SHoward Hinnant};
1603e519524SHoward Hinnant
1613e519524SHoward Hinnant// tuple_element
1623e519524SHoward Hinnant
1633e519524SHoward Hinnanttemplate <size_t _Ip, class ..._Tp>
164f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS_ONLY tuple_element<_Ip, tuple<_Tp...> >
1653e519524SHoward Hinnant{
1663e519524SHoward Hinnantpublic:
1673e519524SHoward Hinnant    typedef typename tuple_element<_Ip, __tuple_types<_Tp...> >::type type;
1683e519524SHoward Hinnant};
1693e519524SHoward Hinnant
17005c8dad2SMarshall Clow#if _LIBCPP_STD_VER > 11
17105c8dad2SMarshall Clowtemplate <size_t _Ip, class ..._Tp>
17205c8dad2SMarshall Clowusing tuple_element_t = typename tuple_element <_Ip, _Tp...>::type;
17305c8dad2SMarshall Clow#endif
17405c8dad2SMarshall Clow
1753e519524SHoward Hinnant// __tuple_leaf
1763e519524SHoward Hinnant
177ee187e24SEric Fiseliertemplate <size_t _Ip, class _Hp,
178ee187e24SEric Fiselier          bool=is_empty<_Hp>::value && !__libcpp_is_final<_Hp>::value
17942b8bb50SHoward Hinnant         >
1803e519524SHoward Hinnantclass __tuple_leaf;
1813e519524SHoward Hinnant
1823e519524SHoward Hinnanttemplate <size_t _Ip, class _Hp, bool _Ep>
183789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1843e519524SHoward Hinnantvoid swap(__tuple_leaf<_Ip, _Hp, _Ep>& __x, __tuple_leaf<_Ip, _Hp, _Ep>& __y)
18527d0a2a7SHoward Hinnant    _NOEXCEPT_(__is_nothrow_swappable<_Hp>::value)
1863e519524SHoward Hinnant{
1873e519524SHoward Hinnant    swap(__x.get(), __y.get());
1883e519524SHoward Hinnant}
1893e519524SHoward Hinnant
1903e519524SHoward Hinnanttemplate <size_t _Ip, class _Hp, bool>
1913e519524SHoward Hinnantclass __tuple_leaf
1923e519524SHoward Hinnant{
1933e519524SHoward Hinnant    _Hp value;
1943e519524SHoward Hinnant
195074f8d77SEric Fiselier    template <class _Tp>
196074f8d77SEric Fiselier    static constexpr bool __can_bind_reference() {
197074f8d77SEric Fiselier        using _RawTp = typename remove_reference<_Tp>::type;
198074f8d77SEric Fiselier        using _RawHp = typename remove_reference<_Hp>::type;
199074f8d77SEric Fiselier        using _CheckLValueArg = integral_constant<bool,
200074f8d77SEric Fiselier            is_lvalue_reference<_Tp>::value
201074f8d77SEric Fiselier        ||  is_same<_RawTp, reference_wrapper<_RawHp>>::value
202074f8d77SEric Fiselier        ||  is_same<_RawTp, reference_wrapper<typename remove_const<_RawHp>::type>>::value
203074f8d77SEric Fiselier        >;
204074f8d77SEric Fiselier        return  !is_reference<_Hp>::value
205074f8d77SEric Fiselier            || (is_lvalue_reference<_Hp>::value && _CheckLValueArg::value)
206074f8d77SEric Fiselier            || (is_rvalue_reference<_Hp>::value && !is_lvalue_reference<_Tp>::value);
207074f8d77SEric Fiselier    }
208074f8d77SEric Fiselier
2093e519524SHoward Hinnant    __tuple_leaf& operator=(const __tuple_leaf&);
2103e519524SHoward Hinnantpublic:
211a0f4c45cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR __tuple_leaf()
212a0f4c45cSHoward Hinnant             _NOEXCEPT_(is_nothrow_default_constructible<_Hp>::value) : value()
2133e519524SHoward Hinnant       {static_assert(!is_reference<_Hp>::value,
2143e519524SHoward Hinnant              "Attempted to default construct a reference element in a tuple");}
2153e519524SHoward Hinnant
2163e519524SHoward Hinnant    template <class _Alloc>
2173e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2183e519524SHoward Hinnant        __tuple_leaf(integral_constant<int, 0>, const _Alloc&)
2193e519524SHoward Hinnant            : value()
2203e519524SHoward Hinnant        {static_assert(!is_reference<_Hp>::value,
2213e519524SHoward Hinnant              "Attempted to default construct a reference element in a tuple");}
2223e519524SHoward Hinnant
2233e519524SHoward Hinnant    template <class _Alloc>
2243e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2253e519524SHoward Hinnant        __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a)
2263e519524SHoward Hinnant            : value(allocator_arg_t(), __a)
2273e519524SHoward Hinnant        {static_assert(!is_reference<_Hp>::value,
2283e519524SHoward Hinnant              "Attempted to default construct a reference element in a tuple");}
2293e519524SHoward Hinnant
2303e519524SHoward Hinnant    template <class _Alloc>
2313e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2323e519524SHoward Hinnant        __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a)
2333e519524SHoward Hinnant            : value(__a)
2343e519524SHoward Hinnant        {static_assert(!is_reference<_Hp>::value,
2353e519524SHoward Hinnant              "Attempted to default construct a reference element in a tuple");}
2363e519524SHoward Hinnant
23730ad985bSHoward Hinnant    template <class _Tp,
238567bb79bSEric Fiselier              class = typename enable_if<
239567bb79bSEric Fiselier                  __lazy_and<
240567bb79bSEric Fiselier                      __lazy_not<is_same<typename decay<_Tp>::type, __tuple_leaf>>
241567bb79bSEric Fiselier                    , is_constructible<_Hp, _Tp>
242567bb79bSEric Fiselier                    >::value
243567bb79bSEric Fiselier                >::type
244567bb79bSEric Fiselier            >
24575eff748SMarshall Clow        _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
2468a9ee148SHoward Hinnant        explicit __tuple_leaf(_Tp&& __t) _NOEXCEPT_((is_nothrow_constructible<_Hp, _Tp>::value))
247ce48a113SHoward Hinnant            : value(_VSTD::forward<_Tp>(__t))
248074f8d77SEric Fiselier        {static_assert(__can_bind_reference<_Tp>(),
2493e519524SHoward Hinnant       "Attempted to construct a reference element in a tuple with an rvalue");}
2503e519524SHoward Hinnant
2513e519524SHoward Hinnant    template <class _Tp, class _Alloc>
2523e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2533e519524SHoward Hinnant        explicit __tuple_leaf(integral_constant<int, 0>, const _Alloc&, _Tp&& __t)
254ce48a113SHoward Hinnant            : value(_VSTD::forward<_Tp>(__t))
255074f8d77SEric Fiselier        {static_assert(__can_bind_reference<_Tp>(),
2563e519524SHoward Hinnant       "Attempted to construct a reference element in a tuple with an rvalue");}
2573e519524SHoward Hinnant
2583e519524SHoward Hinnant    template <class _Tp, class _Alloc>
2593e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2603e519524SHoward Hinnant        explicit __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a, _Tp&& __t)
261ce48a113SHoward Hinnant            : value(allocator_arg_t(), __a, _VSTD::forward<_Tp>(__t))
262074f8d77SEric Fiselier        {static_assert(!is_reference<_Hp>::value,
263074f8d77SEric Fiselier            "Attempted to uses-allocator construct a reference element in a tuple");}
2643e519524SHoward Hinnant
2653e519524SHoward Hinnant    template <class _Tp, class _Alloc>
2663e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2673e519524SHoward Hinnant        explicit __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a, _Tp&& __t)
268ce48a113SHoward Hinnant            : value(_VSTD::forward<_Tp>(__t), __a)
269074f8d77SEric Fiselier        {static_assert(!is_reference<_Hp>::value,
270074f8d77SEric Fiselier           "Attempted to uses-allocator construct a reference element in a tuple");}
2713e519524SHoward Hinnant
2727546a111SMarshall Clow    __tuple_leaf(const __tuple_leaf& __t) = default;
2737546a111SMarshall Clow    __tuple_leaf(__tuple_leaf&& __t) = default;
2743e519524SHoward Hinnant
2753e519524SHoward Hinnant    template <class _Tp>
2763e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2773e519524SHoward Hinnant        __tuple_leaf&
2788a9ee148SHoward Hinnant        operator=(_Tp&& __t) _NOEXCEPT_((is_nothrow_assignable<_Hp&, _Tp>::value))
2793e519524SHoward Hinnant        {
280ce48a113SHoward Hinnant            value = _VSTD::forward<_Tp>(__t);
2813e519524SHoward Hinnant            return *this;
2823e519524SHoward Hinnant        }
2833e519524SHoward Hinnant
2843e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
28527d0a2a7SHoward Hinnant    int swap(__tuple_leaf& __t) _NOEXCEPT_(__is_nothrow_swappable<__tuple_leaf>::value)
2863e519524SHoward Hinnant    {
287ce48a113SHoward Hinnant        _VSTD::swap(*this, __t);
2883e519524SHoward Hinnant        return 0;
2893e519524SHoward Hinnant    }
2903e519524SHoward Hinnant
29175eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11       _Hp& get()       _NOEXCEPT {return value;}
29275eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const _Hp& get() const _NOEXCEPT {return value;}
2933e519524SHoward Hinnant};
2943e519524SHoward Hinnant
2953e519524SHoward Hinnanttemplate <size_t _Ip, class _Hp>
2963e519524SHoward Hinnantclass __tuple_leaf<_Ip, _Hp, true>
2973e519524SHoward Hinnant    : private _Hp
2983e519524SHoward Hinnant{
2993e519524SHoward Hinnant
3003e519524SHoward Hinnant    __tuple_leaf& operator=(const __tuple_leaf&);
3013e519524SHoward Hinnantpublic:
302a0f4c45cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR __tuple_leaf()
303a0f4c45cSHoward Hinnant             _NOEXCEPT_(is_nothrow_default_constructible<_Hp>::value) {}
3043e519524SHoward Hinnant
3053e519524SHoward Hinnant    template <class _Alloc>
3063e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
3073e519524SHoward Hinnant        __tuple_leaf(integral_constant<int, 0>, const _Alloc&) {}
3083e519524SHoward Hinnant
3093e519524SHoward Hinnant    template <class _Alloc>
3103e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
3113e519524SHoward Hinnant        __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a)
3123e519524SHoward Hinnant            : _Hp(allocator_arg_t(), __a) {}
3133e519524SHoward Hinnant
3143e519524SHoward Hinnant    template <class _Alloc>
3153e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
3163e519524SHoward Hinnant        __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a)
3173e519524SHoward Hinnant            : _Hp(__a) {}
3183e519524SHoward Hinnant
31930ad985bSHoward Hinnant    template <class _Tp,
320567bb79bSEric Fiselier              class = typename enable_if<
321567bb79bSEric Fiselier                  __lazy_and<
322567bb79bSEric Fiselier                        __lazy_not<is_same<typename decay<_Tp>::type, __tuple_leaf>>
323567bb79bSEric Fiselier                      , is_constructible<_Hp, _Tp>
324567bb79bSEric Fiselier                    >::value
325567bb79bSEric Fiselier                >::type
326567bb79bSEric Fiselier            >
32775eff748SMarshall Clow        _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
3288a9ee148SHoward Hinnant        explicit __tuple_leaf(_Tp&& __t) _NOEXCEPT_((is_nothrow_constructible<_Hp, _Tp>::value))
329ce48a113SHoward Hinnant            : _Hp(_VSTD::forward<_Tp>(__t)) {}
3303e519524SHoward Hinnant
3313e519524SHoward Hinnant    template <class _Tp, class _Alloc>
3323e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
3333e519524SHoward Hinnant        explicit __tuple_leaf(integral_constant<int, 0>, const _Alloc&, _Tp&& __t)
334ce48a113SHoward Hinnant            : _Hp(_VSTD::forward<_Tp>(__t)) {}
3353e519524SHoward Hinnant
3363e519524SHoward Hinnant    template <class _Tp, class _Alloc>
3373e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
3383e519524SHoward Hinnant        explicit __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a, _Tp&& __t)
339ce48a113SHoward Hinnant            : _Hp(allocator_arg_t(), __a, _VSTD::forward<_Tp>(__t)) {}
3403e519524SHoward Hinnant
3413e519524SHoward Hinnant    template <class _Tp, class _Alloc>
3423e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
3433e519524SHoward Hinnant        explicit __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a, _Tp&& __t)
344ce48a113SHoward Hinnant            : _Hp(_VSTD::forward<_Tp>(__t), __a) {}
3453e519524SHoward Hinnant
346567bb79bSEric Fiselier    __tuple_leaf(__tuple_leaf const &) = default;
347567bb79bSEric Fiselier    __tuple_leaf(__tuple_leaf &&) = default;
348567bb79bSEric Fiselier
3493e519524SHoward Hinnant    template <class _Tp>
3503e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
3513e519524SHoward Hinnant        __tuple_leaf&
3528a9ee148SHoward Hinnant        operator=(_Tp&& __t) _NOEXCEPT_((is_nothrow_assignable<_Hp&, _Tp>::value))
3533e519524SHoward Hinnant        {
354ce48a113SHoward Hinnant            _Hp::operator=(_VSTD::forward<_Tp>(__t));
3553e519524SHoward Hinnant            return *this;
3563e519524SHoward Hinnant        }
3573e519524SHoward Hinnant
35827d0a2a7SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
35927d0a2a7SHoward Hinnant    int
36027d0a2a7SHoward Hinnant    swap(__tuple_leaf& __t) _NOEXCEPT_(__is_nothrow_swappable<__tuple_leaf>::value)
3613e519524SHoward Hinnant    {
362ce48a113SHoward Hinnant        _VSTD::swap(*this, __t);
3633e519524SHoward Hinnant        return 0;
3643e519524SHoward Hinnant    }
3653e519524SHoward Hinnant
36675eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11       _Hp& get()       _NOEXCEPT {return static_cast<_Hp&>(*this);}
36775eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const _Hp& get() const _NOEXCEPT {return static_cast<const _Hp&>(*this);}
3683e519524SHoward Hinnant};
3693e519524SHoward Hinnant
370789847ddSHoward Hinnanttemplate <class ..._Tp>
371789847ddSHoward Hinnant_LIBCPP_INLINE_VISIBILITY
3728a9ee148SHoward Hinnantvoid __swallow(_Tp&&...) _NOEXCEPT {}
3733e519524SHoward Hinnant
37490fb2bafSEric Fiseliertemplate <class ..._Tp>
37590fb2bafSEric Fiselierstruct __lazy_all : __all<_Tp::value...> {};
37690fb2bafSEric Fiselier
37714c5ec51SMarshall Clowtemplate <class _Tp>
37814c5ec51SMarshall Clowstruct __all_default_constructible;
37927d0a2a7SHoward Hinnant
38014c5ec51SMarshall Clowtemplate <class ..._Tp>
38114c5ec51SMarshall Clowstruct __all_default_constructible<__tuple_types<_Tp...>>
38214c5ec51SMarshall Clow    : __all<is_default_constructible<_Tp>::value...>
38314c5ec51SMarshall Clow{ };
38427d0a2a7SHoward Hinnant
3853e519524SHoward Hinnant// __tuple_impl
3863e519524SHoward Hinnant
3873e519524SHoward Hinnanttemplate<class _Indx, class ..._Tp> struct __tuple_impl;
3883e519524SHoward Hinnant
3893e519524SHoward Hinnanttemplate<size_t ..._Indx, class ..._Tp>
3903e519524SHoward Hinnantstruct __tuple_impl<__tuple_indices<_Indx...>, _Tp...>
3913e519524SHoward Hinnant    : public __tuple_leaf<_Indx, _Tp>...
3923e519524SHoward Hinnant{
393a62ebe04SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
394a0f4c45cSHoward Hinnant    _LIBCPP_CONSTEXPR __tuple_impl()
395a0f4c45cSHoward Hinnant        _NOEXCEPT_(__all<is_nothrow_default_constructible<_Tp>::value...>::value) {}
396a62ebe04SHoward Hinnant
3973e519524SHoward Hinnant    template <size_t ..._Uf, class ..._Tf,
3983e519524SHoward Hinnant              size_t ..._Ul, class ..._Tl, class ..._Up>
39975eff748SMarshall Clow        _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
4003e519524SHoward Hinnant        explicit
4013e519524SHoward Hinnant        __tuple_impl(__tuple_indices<_Uf...>, __tuple_types<_Tf...>,
4023e519524SHoward Hinnant                     __tuple_indices<_Ul...>, __tuple_types<_Tl...>,
4038a9ee148SHoward Hinnant                     _Up&&... __u)
4048a9ee148SHoward Hinnant                     _NOEXCEPT_((__all<is_nothrow_constructible<_Tf, _Up>::value...>::value &&
4058a9ee148SHoward Hinnant                                 __all<is_nothrow_default_constructible<_Tl>::value...>::value)) :
406ce48a113SHoward Hinnant            __tuple_leaf<_Uf, _Tf>(_VSTD::forward<_Up>(__u))...,
4073e519524SHoward Hinnant            __tuple_leaf<_Ul, _Tl>()...
4083e519524SHoward Hinnant            {}
4093e519524SHoward Hinnant
4103e519524SHoward Hinnant    template <class _Alloc, size_t ..._Uf, class ..._Tf,
4113e519524SHoward Hinnant              size_t ..._Ul, class ..._Tl, class ..._Up>
412789847ddSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
4133e519524SHoward Hinnant        explicit
4143e519524SHoward Hinnant        __tuple_impl(allocator_arg_t, const _Alloc& __a,
4153e519524SHoward Hinnant                     __tuple_indices<_Uf...>, __tuple_types<_Tf...>,
4163e519524SHoward Hinnant                     __tuple_indices<_Ul...>, __tuple_types<_Tl...>,
4173e519524SHoward Hinnant                     _Up&&... __u) :
4183e519524SHoward Hinnant            __tuple_leaf<_Uf, _Tf>(__uses_alloc_ctor<_Tf, _Alloc, _Up>(), __a,
419ce48a113SHoward Hinnant            _VSTD::forward<_Up>(__u))...,
4203e519524SHoward Hinnant            __tuple_leaf<_Ul, _Tl>(__uses_alloc_ctor<_Tl, _Alloc>(), __a)...
4213e519524SHoward Hinnant            {}
4223e519524SHoward Hinnant
4233e519524SHoward Hinnant    template <class _Tuple,
4243e519524SHoward Hinnant              class = typename enable_if
4253e519524SHoward Hinnant                      <
426f3b02b17SHoward Hinnant                         __tuple_constructible<_Tuple, tuple<_Tp...> >::value
4273e519524SHoward Hinnant                      >::type
4283e519524SHoward Hinnant             >
42975eff748SMarshall Clow        _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
4308a9ee148SHoward Hinnant        __tuple_impl(_Tuple&& __t) _NOEXCEPT_((__all<is_nothrow_constructible<_Tp, typename tuple_element<_Indx,
4318a9ee148SHoward Hinnant                                       typename __make_tuple_types<_Tuple>::type>::type>::value...>::value))
432ce48a113SHoward Hinnant            : __tuple_leaf<_Indx, _Tp>(_VSTD::forward<typename tuple_element<_Indx,
433ce48a113SHoward Hinnant                                       typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<_Indx>(__t)))...
4343e519524SHoward Hinnant            {}
4353e519524SHoward Hinnant
4363e519524SHoward Hinnant    template <class _Alloc, class _Tuple,
4373e519524SHoward Hinnant              class = typename enable_if
4383e519524SHoward Hinnant                      <
4399795699aSEric Fiselier                         __tuple_constructible<_Tuple, tuple<_Tp...> >::value
4403e519524SHoward Hinnant                      >::type
4413e519524SHoward Hinnant             >
442789847ddSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
4433e519524SHoward Hinnant        __tuple_impl(allocator_arg_t, const _Alloc& __a, _Tuple&& __t)
4443e519524SHoward Hinnant            : __tuple_leaf<_Indx, _Tp>(__uses_alloc_ctor<_Tp, _Alloc, typename tuple_element<_Indx,
4453e519524SHoward Hinnant                                       typename __make_tuple_types<_Tuple>::type>::type>(), __a,
446ce48a113SHoward Hinnant                                       _VSTD::forward<typename tuple_element<_Indx,
447ce48a113SHoward Hinnant                                       typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<_Indx>(__t)))...
4483e519524SHoward Hinnant            {}
4493e519524SHoward Hinnant
4503e519524SHoward Hinnant    template <class _Tuple>
451789847ddSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
4523e519524SHoward Hinnant        typename enable_if
4533e519524SHoward Hinnant        <
4543e519524SHoward Hinnant            __tuple_assignable<_Tuple, tuple<_Tp...> >::value,
4553e519524SHoward Hinnant            __tuple_impl&
4563e519524SHoward Hinnant        >::type
4578a9ee148SHoward Hinnant        operator=(_Tuple&& __t) _NOEXCEPT_((__all<is_nothrow_assignable<_Tp&, typename tuple_element<_Indx,
4588a9ee148SHoward Hinnant                                       typename __make_tuple_types<_Tuple>::type>::type>::value...>::value))
4593e519524SHoward Hinnant        {
460ce48a113SHoward Hinnant            __swallow(__tuple_leaf<_Indx, _Tp>::operator=(_VSTD::forward<typename tuple_element<_Indx,
461ce48a113SHoward Hinnant                                       typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<_Indx>(__t)))...);
4623e519524SHoward Hinnant            return *this;
4633e519524SHoward Hinnant        }
4643e519524SHoward Hinnant
4654478b25aSHoward Hinnant    __tuple_impl(const __tuple_impl&) = default;
4664478b25aSHoward Hinnant    __tuple_impl(__tuple_impl&&) = default;
4674478b25aSHoward Hinnant
468789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
469fa8df7dbSHoward Hinnant    __tuple_impl&
4708a9ee148SHoward Hinnant    operator=(const __tuple_impl& __t) _NOEXCEPT_((__all<is_nothrow_copy_assignable<_Tp>::value...>::value))
471fa8df7dbSHoward Hinnant    {
472fa8df7dbSHoward Hinnant        __swallow(__tuple_leaf<_Indx, _Tp>::operator=(static_cast<const __tuple_leaf<_Indx, _Tp>&>(__t).get())...);
473fa8df7dbSHoward Hinnant        return *this;
474fa8df7dbSHoward Hinnant    }
475fa8df7dbSHoward Hinnant
476fa8df7dbSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4774478b25aSHoward Hinnant    __tuple_impl&
4784478b25aSHoward Hinnant    operator=(__tuple_impl&& __t) _NOEXCEPT_((__all<is_nothrow_move_assignable<_Tp>::value...>::value))
4794478b25aSHoward Hinnant    {
4804478b25aSHoward Hinnant        __swallow(__tuple_leaf<_Indx, _Tp>::operator=(_VSTD::forward<_Tp>(static_cast<__tuple_leaf<_Indx, _Tp>&>(__t).get()))...);
4814478b25aSHoward Hinnant        return *this;
4824478b25aSHoward Hinnant    }
4834478b25aSHoward Hinnant
4844478b25aSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4853e519524SHoward Hinnant    void swap(__tuple_impl& __t)
48627d0a2a7SHoward Hinnant        _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value)
4873e519524SHoward Hinnant    {
4883e519524SHoward Hinnant        __swallow(__tuple_leaf<_Indx, _Tp>::swap(static_cast<__tuple_leaf<_Indx, _Tp>&>(__t))...);
4893e519524SHoward Hinnant    }
4903e519524SHoward Hinnant};
4913e519524SHoward Hinnant
49274cba642SEric Fiseliertemplate <bool _IsTuple, class _SizeTrait, size_t _Expected>
49374cba642SEric Fiselierstruct __tuple_like_with_size_imp : false_type {};
49474cba642SEric Fiselier
49574cba642SEric Fiseliertemplate <class _SizeTrait, size_t _Expected>
49674cba642SEric Fiselierstruct __tuple_like_with_size_imp<true, _SizeTrait, _Expected>
49774cba642SEric Fiselier    : integral_constant<bool, _SizeTrait::value == _Expected> {};
49874cba642SEric Fiselier
49974cba642SEric Fiseliertemplate <class _Tuple, size_t _ExpectedSize,
50074cba642SEric Fiselier          class _RawTuple = typename __uncvref<_Tuple>::type>
50174cba642SEric Fiselierusing __tuple_like_with_size = __tuple_like_with_size_imp<
50274cba642SEric Fiselier                                   __tuple_like<_RawTuple>::value,
50374cba642SEric Fiselier                                   tuple_size<_RawTuple>, _ExpectedSize
50474cba642SEric Fiselier                              >;
50574cba642SEric Fiselier
50674cba642SEric Fiselier
50774cba642SEric Fiselierstruct _LIBCPP_TYPE_VIS __check_tuple_constructor_fail {
50874cba642SEric Fiselier    template <class ...>
50974cba642SEric Fiselier    static constexpr bool __enable_explicit() { return false; }
51074cba642SEric Fiselier    template <class ...>
51174cba642SEric Fiselier    static constexpr bool __enable_implicit() { return false; }
51274cba642SEric Fiselier};
51374cba642SEric Fiselier
5143e519524SHoward Hinnanttemplate <class ..._Tp>
515f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS_ONLY tuple
5163e519524SHoward Hinnant{
5173e519524SHoward Hinnant    typedef __tuple_impl<typename __make_tuple_indices<sizeof...(_Tp)>::type, _Tp...> base;
5183e519524SHoward Hinnant
5193e519524SHoward Hinnant    base base_;
5203e519524SHoward Hinnant
52174cba642SEric Fiselier    template <class ..._Args>
52274cba642SEric Fiselier    struct _PackExpandsToThisTuple : false_type {};
52374cba642SEric Fiselier
52474cba642SEric Fiselier    template <class _Arg>
52574cba642SEric Fiselier    struct _PackExpandsToThisTuple<_Arg>
52674cba642SEric Fiselier        : is_same<typename __uncvref<_Arg>::type, tuple> {};
52774cba642SEric Fiselier
52874cba642SEric Fiselier    template <bool _MaybeEnable, class _Dummy = void>
52974cba642SEric Fiselier    struct _CheckArgsConstructor : __check_tuple_constructor_fail {};
53074cba642SEric Fiselier
53174cba642SEric Fiselier    template <class _Dummy>
53274cba642SEric Fiselier    struct _CheckArgsConstructor<true, _Dummy>
53374cba642SEric Fiselier    {
53474cba642SEric Fiselier        template <class ..._Args>
53574cba642SEric Fiselier        static constexpr bool __enable_explicit() {
53674cba642SEric Fiselier            return
53774cba642SEric Fiselier                __tuple_constructible<
53874cba642SEric Fiselier                    tuple<_Args...>,
53974cba642SEric Fiselier                    typename __make_tuple_types<tuple,
54074cba642SEric Fiselier                             sizeof...(_Args) < sizeof...(_Tp) ?
54174cba642SEric Fiselier                                 sizeof...(_Args) :
54274cba642SEric Fiselier                                 sizeof...(_Tp)>::type
54374cba642SEric Fiselier                >::value &&
54474cba642SEric Fiselier                !__tuple_convertible<
54574cba642SEric Fiselier                    tuple<_Args...>,
54674cba642SEric Fiselier                    typename __make_tuple_types<tuple,
54774cba642SEric Fiselier                             sizeof...(_Args) < sizeof...(_Tp) ?
54874cba642SEric Fiselier                                 sizeof...(_Args) :
54974cba642SEric Fiselier                                 sizeof...(_Tp)>::type
55074cba642SEric Fiselier                >::value &&
55174cba642SEric Fiselier                __all_default_constructible<
55274cba642SEric Fiselier                    typename __make_tuple_types<tuple, sizeof...(_Tp),
55374cba642SEric Fiselier                             sizeof...(_Args) < sizeof...(_Tp) ?
55474cba642SEric Fiselier                                 sizeof...(_Args) :
55574cba642SEric Fiselier                                 sizeof...(_Tp)>::type
55674cba642SEric Fiselier                >::value;
55774cba642SEric Fiselier        }
55874cba642SEric Fiselier
55974cba642SEric Fiselier        template <class ..._Args>
56074cba642SEric Fiselier        static constexpr bool __enable_implicit() {
56174cba642SEric Fiselier            return
56274cba642SEric Fiselier                __tuple_convertible<
56374cba642SEric Fiselier                    tuple<_Args...>,
56474cba642SEric Fiselier                    typename __make_tuple_types<tuple,
56574cba642SEric Fiselier                             sizeof...(_Args) < sizeof...(_Tp) ?
56674cba642SEric Fiselier                                 sizeof...(_Args) :
56774cba642SEric Fiselier                                 sizeof...(_Tp)>::type
56874cba642SEric Fiselier                >::value &&
56974cba642SEric Fiselier                __all_default_constructible<
57074cba642SEric Fiselier                    typename __make_tuple_types<tuple, sizeof...(_Tp),
57174cba642SEric Fiselier                             sizeof...(_Args) < sizeof...(_Tp) ?
57274cba642SEric Fiselier                                 sizeof...(_Args) :
57374cba642SEric Fiselier                                 sizeof...(_Tp)>::type
57474cba642SEric Fiselier                >::value;
57574cba642SEric Fiselier        }
57674cba642SEric Fiselier    };
57774cba642SEric Fiselier
57874cba642SEric Fiselier    template <bool _MaybeEnable,
57974cba642SEric Fiselier              bool = sizeof...(_Tp) == 1,
58074cba642SEric Fiselier              class _Dummy = void>
58174cba642SEric Fiselier    struct _CheckTupleLikeConstructor : __check_tuple_constructor_fail {};
58274cba642SEric Fiselier
58374cba642SEric Fiselier    template <class _Dummy>
58474cba642SEric Fiselier    struct _CheckTupleLikeConstructor<true, false, _Dummy>
58574cba642SEric Fiselier    {
58674cba642SEric Fiselier        template <class _Tuple>
58774cba642SEric Fiselier        static constexpr bool __enable_implicit() {
58874cba642SEric Fiselier            return __tuple_convertible<_Tuple, tuple>::value;
58974cba642SEric Fiselier        }
59074cba642SEric Fiselier
59174cba642SEric Fiselier        template <class _Tuple>
59274cba642SEric Fiselier        static constexpr bool __enable_explicit() {
59374cba642SEric Fiselier            return __tuple_constructible<_Tuple, tuple>::value
59474cba642SEric Fiselier               && !__tuple_convertible<_Tuple, tuple>::value;
59574cba642SEric Fiselier        }
59674cba642SEric Fiselier    };
59774cba642SEric Fiselier
59874cba642SEric Fiselier    template <class _Dummy>
59974cba642SEric Fiselier    struct _CheckTupleLikeConstructor<true, true, _Dummy>
60074cba642SEric Fiselier    {
60174cba642SEric Fiselier        // This trait is used to disable the tuple-like constructor when
60274cba642SEric Fiselier        // the UTypes... constructor should be selected instead.
60374cba642SEric Fiselier        // See LWG issue #2549.
60474cba642SEric Fiselier        template <class _Tuple>
60574cba642SEric Fiselier        using _PreferTupleLikeConstructor = __lazy_or<
60674cba642SEric Fiselier            // Don't attempt the two checks below if the tuple we are given
60774cba642SEric Fiselier            // has the same type as this tuple.
60874cba642SEric Fiselier            is_same<typename __uncvref<_Tuple>::type, tuple>,
60974cba642SEric Fiselier            __lazy_and<
61074cba642SEric Fiselier                __lazy_not<is_constructible<_Tp..., _Tuple>>,
61174cba642SEric Fiselier                __lazy_not<is_convertible<_Tuple, _Tp...>>
61274cba642SEric Fiselier            >
61374cba642SEric Fiselier        >;
61474cba642SEric Fiselier
61574cba642SEric Fiselier        template <class _Tuple>
61674cba642SEric Fiselier        static constexpr bool __enable_implicit() {
61774cba642SEric Fiselier            return __lazy_and<
61874cba642SEric Fiselier                __tuple_convertible<_Tuple, tuple>,
61974cba642SEric Fiselier                _PreferTupleLikeConstructor<_Tuple>
62074cba642SEric Fiselier            >::value;
62174cba642SEric Fiselier        }
62274cba642SEric Fiselier
62374cba642SEric Fiselier        template <class _Tuple>
62474cba642SEric Fiselier        static constexpr bool __enable_explicit() {
62574cba642SEric Fiselier            return __lazy_and<
62674cba642SEric Fiselier                __tuple_constructible<_Tuple, tuple>,
62774cba642SEric Fiselier                _PreferTupleLikeConstructor<_Tuple>,
62874cba642SEric Fiselier                __lazy_not<__tuple_convertible<_Tuple, tuple>>
62974cba642SEric Fiselier            >::value;
63074cba642SEric Fiselier        }
63174cba642SEric Fiselier    };
63274cba642SEric Fiselier
6338bf1f08aSMarshall Clow    template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11
634c206366fSHoward Hinnant        typename tuple_element<_Jp, tuple<_Up...> >::type& get(tuple<_Up...>&) _NOEXCEPT;
6358bf1f08aSMarshall Clow    template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11
636c206366fSHoward Hinnant        const typename tuple_element<_Jp, tuple<_Up...> >::type& get(const tuple<_Up...>&) _NOEXCEPT;
6378bf1f08aSMarshall Clow    template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11
638c206366fSHoward Hinnant        typename tuple_element<_Jp, tuple<_Up...> >::type&& get(tuple<_Up...>&&) _NOEXCEPT;
639545b8861SEric Fiselier    template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11
640545b8861SEric Fiselier        const typename tuple_element<_Jp, tuple<_Up...> >::type&& get(const tuple<_Up...>&&) _NOEXCEPT;
6413e519524SHoward Hinnantpublic:
6423e519524SHoward Hinnant
64365500d4bSEric Fiselier    template <bool _Dummy = true, class = typename enable_if<
64465500d4bSEric Fiselier        __all<__dependent_type<is_default_constructible<_Tp>, _Dummy>::value...>::value
64514c5ec51SMarshall Clow    >::type>
646789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
647a0f4c45cSHoward Hinnant    _LIBCPP_CONSTEXPR tuple()
648a0f4c45cSHoward Hinnant        _NOEXCEPT_(__all<is_nothrow_default_constructible<_Tp>::value...>::value) {}
649a62ebe04SHoward Hinnant
650*aedcbf89SEric Fiselier    tuple(tuple const&) = default;
651*aedcbf89SEric Fiselier    tuple(tuple&&) = default;
652*aedcbf89SEric Fiselier
65390fb2bafSEric Fiselier    template <class _AllocArgT, class _Alloc, bool _Dummy = true, class = typename enable_if<
65490fb2bafSEric Fiselier        __lazy_and<
65509238677SEric Fiselier            is_same<allocator_arg_t, _AllocArgT>,
65690fb2bafSEric Fiselier            __lazy_all<__dependent_type<is_default_constructible<_Tp>, _Dummy>...>
65790fb2bafSEric Fiselier       >::value
65890fb2bafSEric Fiselier    >::type>
65990fb2bafSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
66090fb2bafSEric Fiselier    tuple(_AllocArgT, _Alloc const& __a)
66190fb2bafSEric Fiselier      : base_(allocator_arg_t(), __a,
66290fb2bafSEric Fiselier                    __tuple_indices<>(), __tuple_types<>(),
66390fb2bafSEric Fiselier                    typename __make_tuple_indices<sizeof...(_Tp), 0>::type(),
66490fb2bafSEric Fiselier                    __tuple_types<_Tp...>()) {}
66590fb2bafSEric Fiselier
6669795699aSEric Fiselier    template <bool _Dummy = true,
6679795699aSEric Fiselier              typename enable_if
6689795699aSEric Fiselier                      <
6699795699aSEric Fiselier                         _CheckArgsConstructor<
6709795699aSEric Fiselier                            _Dummy
6719795699aSEric Fiselier                         >::template __enable_implicit<_Tp...>(),
6729795699aSEric Fiselier                         bool
6739795699aSEric Fiselier                      >::type = false
6749795699aSEric Fiselier        >
6759795699aSEric Fiselier    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
6769795699aSEric Fiselier    tuple(const _Tp& ... __t) _NOEXCEPT_((__all<is_nothrow_copy_constructible<_Tp>::value...>::value))
6779795699aSEric Fiselier        : base_(typename __make_tuple_indices<sizeof...(_Tp)>::type(),
6789795699aSEric Fiselier                typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(),
6799795699aSEric Fiselier                typename __make_tuple_indices<0>::type(),
6809795699aSEric Fiselier                typename __make_tuple_types<tuple, 0>::type(),
6819795699aSEric Fiselier                __t...
6829795699aSEric Fiselier               ) {}
6839795699aSEric Fiselier
6849795699aSEric Fiselier    template <bool _Dummy = true,
6859795699aSEric Fiselier              typename enable_if
6869795699aSEric Fiselier                      <
6879795699aSEric Fiselier                         _CheckArgsConstructor<
6889795699aSEric Fiselier                            _Dummy
6899795699aSEric Fiselier                         >::template __enable_explicit<_Tp...>(),
6909795699aSEric Fiselier                         bool
6919795699aSEric Fiselier                      >::type = false
6929795699aSEric Fiselier        >
69375eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
6948a9ee148SHoward Hinnant    explicit tuple(const _Tp& ... __t) _NOEXCEPT_((__all<is_nothrow_copy_constructible<_Tp>::value...>::value))
6953e519524SHoward Hinnant        : base_(typename __make_tuple_indices<sizeof...(_Tp)>::type(),
6963e519524SHoward Hinnant                typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(),
6973e519524SHoward Hinnant                typename __make_tuple_indices<0>::type(),
6983e519524SHoward Hinnant                typename __make_tuple_types<tuple, 0>::type(),
6993e519524SHoward Hinnant                __t...
7003e519524SHoward Hinnant               ) {}
7013e519524SHoward Hinnant
7029795699aSEric Fiselier    template <class _Alloc, bool _Dummy = true,
7039795699aSEric Fiselier              typename enable_if
7049795699aSEric Fiselier                      <
7059795699aSEric Fiselier                         _CheckArgsConstructor<
7069795699aSEric Fiselier                            _Dummy
7079795699aSEric Fiselier                         >::template __enable_implicit<_Tp...>(),
7089795699aSEric Fiselier                         bool
7099795699aSEric Fiselier                      >::type = false
7109795699aSEric Fiselier        >
711789847ddSHoward Hinnant      _LIBCPP_INLINE_VISIBILITY
7123e519524SHoward Hinnant      tuple(allocator_arg_t, const _Alloc& __a, const _Tp& ... __t)
7133e519524SHoward Hinnant        : base_(allocator_arg_t(), __a,
7143e519524SHoward Hinnant                typename __make_tuple_indices<sizeof...(_Tp)>::type(),
7153e519524SHoward Hinnant                typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(),
7163e519524SHoward Hinnant                typename __make_tuple_indices<0>::type(),
7173e519524SHoward Hinnant                typename __make_tuple_types<tuple, 0>::type(),
7183e519524SHoward Hinnant                __t...
7193e519524SHoward Hinnant               ) {}
7203e519524SHoward Hinnant
7219795699aSEric Fiselier    template <class _Alloc, bool _Dummy = true,
7229795699aSEric Fiselier              typename enable_if
7239795699aSEric Fiselier                      <
7249795699aSEric Fiselier                         _CheckArgsConstructor<
7259795699aSEric Fiselier                            _Dummy
7269795699aSEric Fiselier                         >::template __enable_explicit<_Tp...>(),
7279795699aSEric Fiselier                         bool
7289795699aSEric Fiselier                      >::type = false
7299795699aSEric Fiselier        >
7309795699aSEric Fiselier      _LIBCPP_INLINE_VISIBILITY
7319795699aSEric Fiselier      explicit
7329795699aSEric Fiselier      tuple(allocator_arg_t, const _Alloc& __a, const _Tp& ... __t)
7339795699aSEric Fiselier        : base_(allocator_arg_t(), __a,
7349795699aSEric Fiselier                typename __make_tuple_indices<sizeof...(_Tp)>::type(),
7359795699aSEric Fiselier                typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(),
7369795699aSEric Fiselier                typename __make_tuple_indices<0>::type(),
7379795699aSEric Fiselier                typename __make_tuple_types<tuple, 0>::type(),
7389795699aSEric Fiselier                __t...
7399795699aSEric Fiselier               ) {}
7409795699aSEric Fiselier
7413e519524SHoward Hinnant    template <class ..._Up,
7420527c620SHoward Hinnant              typename enable_if
7433e519524SHoward Hinnant                      <
74474cba642SEric Fiselier                         _CheckArgsConstructor<
74574cba642SEric Fiselier                             sizeof...(_Up) <= sizeof...(_Tp)
74674cba642SEric Fiselier                             && !_PackExpandsToThisTuple<_Up...>::value
74774cba642SEric Fiselier                         >::template __enable_implicit<_Up...>(),
7480527c620SHoward Hinnant                         bool
7490527c620SHoward Hinnant                      >::type = false
7500527c620SHoward Hinnant             >
75175eff748SMarshall Clow        _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
7520527c620SHoward Hinnant        tuple(_Up&&... __u)
7538a9ee148SHoward Hinnant            _NOEXCEPT_((
75410a65e2eSMarshall Clow                is_nothrow_constructible<base,
7558a9ee148SHoward Hinnant                    typename __make_tuple_indices<sizeof...(_Up)>::type,
7568a9ee148SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Up)>::type,
7578a9ee148SHoward Hinnant                    typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type,
7588a9ee148SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type,
75910a65e2eSMarshall Clow                    _Up...
7608a9ee148SHoward Hinnant                >::value
7618a9ee148SHoward Hinnant            ))
7620527c620SHoward Hinnant            : base_(typename __make_tuple_indices<sizeof...(_Up)>::type(),
7630527c620SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Up)>::type(),
7640527c620SHoward Hinnant                    typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(),
7650527c620SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(),
7660527c620SHoward Hinnant                    _VSTD::forward<_Up>(__u)...) {}
7670527c620SHoward Hinnant
7680527c620SHoward Hinnant    template <class ..._Up,
7690527c620SHoward Hinnant              typename enable_if
7700527c620SHoward Hinnant                      <
77174cba642SEric Fiselier                         _CheckArgsConstructor<
77274cba642SEric Fiselier                             sizeof...(_Up) <= sizeof...(_Tp)
77374cba642SEric Fiselier                             && !_PackExpandsToThisTuple<_Up...>::value
77474cba642SEric Fiselier                         >::template __enable_explicit<_Up...>(),
7750527c620SHoward Hinnant                         bool
7760527c620SHoward Hinnant                      >::type = false
7773e519524SHoward Hinnant             >
77875eff748SMarshall Clow        _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
7793e519524SHoward Hinnant        explicit
7803e519524SHoward Hinnant        tuple(_Up&&... __u)
7818a9ee148SHoward Hinnant            _NOEXCEPT_((
78210a65e2eSMarshall Clow                is_nothrow_constructible<base,
7838a9ee148SHoward Hinnant                    typename __make_tuple_indices<sizeof...(_Up)>::type,
7848a9ee148SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Up)>::type,
7858a9ee148SHoward Hinnant                    typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type,
7868a9ee148SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type,
7878a9ee148SHoward Hinnant                    _Up...
7888a9ee148SHoward Hinnant                >::value
7898a9ee148SHoward Hinnant            ))
7903e519524SHoward Hinnant            : base_(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
7963e519524SHoward Hinnant    template <class _Alloc, class ..._Up,
7979795699aSEric Fiselier              typename enable_if
7983e519524SHoward Hinnant                      <
79974cba642SEric Fiselier                         _CheckArgsConstructor<
80090fb2bafSEric Fiselier                             sizeof...(_Up) == sizeof...(_Tp) &&
80174cba642SEric Fiselier                             !_PackExpandsToThisTuple<_Up...>::value
8029795699aSEric Fiselier                         >::template __enable_implicit<_Up...>(),
8039795699aSEric Fiselier                         bool
8049795699aSEric Fiselier                      >::type = false
8053e519524SHoward Hinnant             >
806789847ddSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
8073e519524SHoward Hinnant        tuple(allocator_arg_t, const _Alloc& __a, _Up&&... __u)
8083e519524SHoward Hinnant            : base_(allocator_arg_t(), __a,
8093e519524SHoward Hinnant                    typename __make_tuple_indices<sizeof...(_Up)>::type(),
8103e519524SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Up)>::type(),
8113e519524SHoward Hinnant                    typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(),
8123e519524SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(),
813ce48a113SHoward Hinnant                    _VSTD::forward<_Up>(__u)...) {}
8143e519524SHoward Hinnant
8159795699aSEric Fiselier    template <class _Alloc, class ..._Up,
8169795699aSEric Fiselier              typename enable_if
8179795699aSEric Fiselier                      <
8189795699aSEric Fiselier                         _CheckArgsConstructor<
8199795699aSEric Fiselier                             sizeof...(_Up) == sizeof...(_Tp) &&
8209795699aSEric Fiselier                             !_PackExpandsToThisTuple<_Up...>::value
8219795699aSEric Fiselier                         >::template __enable_explicit<_Up...>(),
8229795699aSEric Fiselier                         bool
8239795699aSEric Fiselier                      >::type = false
8249795699aSEric Fiselier             >
8259795699aSEric Fiselier        _LIBCPP_INLINE_VISIBILITY
8269795699aSEric Fiselier        explicit
8279795699aSEric Fiselier        tuple(allocator_arg_t, const _Alloc& __a, _Up&&... __u)
8289795699aSEric Fiselier            : base_(allocator_arg_t(), __a,
8299795699aSEric Fiselier                    typename __make_tuple_indices<sizeof...(_Up)>::type(),
8309795699aSEric Fiselier                    typename __make_tuple_types<tuple, sizeof...(_Up)>::type(),
8319795699aSEric Fiselier                    typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(),
8329795699aSEric Fiselier                    typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(),
8339795699aSEric Fiselier                    _VSTD::forward<_Up>(__u)...) {}
8349795699aSEric Fiselier
8353e519524SHoward Hinnant    template <class _Tuple,
8360527c620SHoward Hinnant              typename enable_if
8373e519524SHoward Hinnant                      <
83874cba642SEric Fiselier                         _CheckTupleLikeConstructor<
83974cba642SEric Fiselier                             __tuple_like_with_size<_Tuple, sizeof...(_Tp)>::value
84074cba642SEric Fiselier                             && !_PackExpandsToThisTuple<_Tuple>::value
84174cba642SEric Fiselier                         >::template __enable_implicit<_Tuple>(),
8420527c620SHoward Hinnant                         bool
8430527c620SHoward Hinnant                      >::type = false
8443e519524SHoward Hinnant             >
84575eff748SMarshall Clow        _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
8468a9ee148SHoward Hinnant        tuple(_Tuple&& __t) _NOEXCEPT_((is_nothrow_constructible<base, _Tuple>::value))
847ce48a113SHoward Hinnant            : base_(_VSTD::forward<_Tuple>(__t)) {}
8483e519524SHoward Hinnant
8490527c620SHoward Hinnant    template <class _Tuple,
8500527c620SHoward Hinnant              typename enable_if
8510527c620SHoward Hinnant                      <
85274cba642SEric Fiselier                         _CheckTupleLikeConstructor<
85374cba642SEric Fiselier                             __tuple_like_with_size<_Tuple, sizeof...(_Tp)>::value
85474cba642SEric Fiselier                             && !_PackExpandsToThisTuple<_Tuple>::value
85574cba642SEric Fiselier                         >::template __enable_explicit<_Tuple>(),
8560527c620SHoward Hinnant                         bool
8570527c620SHoward Hinnant                      >::type = false
8580527c620SHoward Hinnant             >
85975eff748SMarshall Clow        _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
8600527c620SHoward Hinnant        explicit
8618a9ee148SHoward Hinnant        tuple(_Tuple&& __t) _NOEXCEPT_((is_nothrow_constructible<base, _Tuple>::value))
8620527c620SHoward Hinnant            : base_(_VSTD::forward<_Tuple>(__t)) {}
8630527c620SHoward Hinnant
8643e519524SHoward Hinnant    template <class _Alloc, class _Tuple,
8659795699aSEric Fiselier              typename enable_if
8663e519524SHoward Hinnant                      <
86774cba642SEric Fiselier                         _CheckTupleLikeConstructor<
86874cba642SEric Fiselier                             __tuple_like_with_size<_Tuple, sizeof...(_Tp)>::value
8699795699aSEric Fiselier                         >::template __enable_implicit<_Tuple>(),
8709795699aSEric Fiselier                         bool
8719795699aSEric Fiselier                      >::type = false
8723e519524SHoward Hinnant             >
873789847ddSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
8743e519524SHoward Hinnant        tuple(allocator_arg_t, const _Alloc& __a, _Tuple&& __t)
875ce48a113SHoward Hinnant            : base_(allocator_arg_t(), __a, _VSTD::forward<_Tuple>(__t)) {}
8763e519524SHoward Hinnant
8779795699aSEric Fiselier    template <class _Alloc, class _Tuple,
8789795699aSEric Fiselier              typename enable_if
8799795699aSEric Fiselier                      <
8809795699aSEric Fiselier                         _CheckTupleLikeConstructor<
8819795699aSEric Fiselier                             __tuple_like_with_size<_Tuple, sizeof...(_Tp)>::value
8829795699aSEric Fiselier                         >::template __enable_explicit<_Tuple>(),
8839795699aSEric Fiselier                         bool
8849795699aSEric Fiselier                      >::type = false
8859795699aSEric Fiselier             >
8869795699aSEric Fiselier        _LIBCPP_INLINE_VISIBILITY
8879795699aSEric Fiselier        explicit
8889795699aSEric Fiselier        tuple(allocator_arg_t, const _Alloc& __a, _Tuple&& __t)
8899795699aSEric Fiselier            : base_(allocator_arg_t(), __a, _VSTD::forward<_Tuple>(__t)) {}
8909795699aSEric Fiselier
891*aedcbf89SEric Fiselier    using _CanCopyAssign = __all<is_copy_assignable<_Tp>::value...>;
892*aedcbf89SEric Fiselier    using _CanMoveAssign = __all<is_move_assignable<_Tp>::value...>;
893*aedcbf89SEric Fiselier
894*aedcbf89SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
895*aedcbf89SEric Fiselier    tuple& operator=(typename conditional<_CanCopyAssign::value, tuple, __nat>::type const& __t)
896*aedcbf89SEric Fiselier        _NOEXCEPT_((__all<is_nothrow_copy_assignable<_Tp>::value...>::value))
897*aedcbf89SEric Fiselier    {
898*aedcbf89SEric Fiselier        base_.operator=(__t.base_);
899*aedcbf89SEric Fiselier        return *this;
900*aedcbf89SEric Fiselier    }
901*aedcbf89SEric Fiselier
902*aedcbf89SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
903*aedcbf89SEric Fiselier    tuple& operator=(typename conditional<_CanMoveAssign::value, tuple, __nat>::type&& __t)
904*aedcbf89SEric Fiselier        _NOEXCEPT_((__all<is_nothrow_move_assignable<_Tp>::value...>::value))
905*aedcbf89SEric Fiselier    {
906*aedcbf89SEric Fiselier        base_.operator=(static_cast<base&&>(__t.base_));
907*aedcbf89SEric Fiselier        return *this;
908*aedcbf89SEric Fiselier    }
909*aedcbf89SEric Fiselier
9103e519524SHoward Hinnant    template <class _Tuple,
9113e519524SHoward Hinnant              class = typename enable_if
9123e519524SHoward Hinnant                      <
9133e519524SHoward Hinnant                         __tuple_assignable<_Tuple, tuple>::value
9143e519524SHoward Hinnant                      >::type
9153e519524SHoward Hinnant             >
916789847ddSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
9173e519524SHoward Hinnant        tuple&
9188a9ee148SHoward Hinnant        operator=(_Tuple&& __t) _NOEXCEPT_((is_nothrow_assignable<base&, _Tuple>::value))
9193e519524SHoward Hinnant        {
920ce48a113SHoward Hinnant            base_.operator=(_VSTD::forward<_Tuple>(__t));
9213e519524SHoward Hinnant            return *this;
9223e519524SHoward Hinnant        }
9233e519524SHoward Hinnant
924789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
92527d0a2a7SHoward Hinnant    void swap(tuple& __t) _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value)
92627d0a2a7SHoward Hinnant        {base_.swap(__t.base_);}
9273e519524SHoward Hinnant};
9283e519524SHoward Hinnant
9293e519524SHoward Hinnanttemplate <>
930f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS_ONLY tuple<>
9313e519524SHoward Hinnant{
9323e519524SHoward Hinnantpublic:
933789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
934a0f4c45cSHoward Hinnant    _LIBCPP_CONSTEXPR tuple() _NOEXCEPT {}
9353e519524SHoward Hinnant    template <class _Alloc>
936789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9378a9ee148SHoward Hinnant        tuple(allocator_arg_t, const _Alloc&) _NOEXCEPT {}
9383e519524SHoward Hinnant    template <class _Alloc>
939789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9408a9ee148SHoward Hinnant        tuple(allocator_arg_t, const _Alloc&, const tuple&) _NOEXCEPT {}
941c003db1fSHoward Hinnant    template <class _Up>
942789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9438a9ee148SHoward Hinnant        tuple(array<_Up, 0>) _NOEXCEPT {}
944c003db1fSHoward Hinnant    template <class _Alloc, class _Up>
945789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9468a9ee148SHoward Hinnant        tuple(allocator_arg_t, const _Alloc&, array<_Up, 0>) _NOEXCEPT {}
947789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
94827d0a2a7SHoward Hinnant    void swap(tuple&) _NOEXCEPT {}
9493e519524SHoward Hinnant};
9503e519524SHoward Hinnant
9513e519524SHoward Hinnanttemplate <class ..._Tp>
9523e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
953bc95cf0dSHoward Hinnanttypename enable_if
954bc95cf0dSHoward Hinnant<
955bc95cf0dSHoward Hinnant    __all<__is_swappable<_Tp>::value...>::value,
9563e519524SHoward Hinnant    void
957bc95cf0dSHoward Hinnant>::type
95827d0a2a7SHoward Hinnantswap(tuple<_Tp...>& __t, tuple<_Tp...>& __u)
95927d0a2a7SHoward Hinnant                 _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value)
96027d0a2a7SHoward Hinnant    {__t.swap(__u);}
9613e519524SHoward Hinnant
9623e519524SHoward Hinnant// get
9633e519524SHoward Hinnant
9643e519524SHoward Hinnanttemplate <size_t _Ip, class ..._Tp>
9658bf1f08aSMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
9663e519524SHoward Hinnanttypename tuple_element<_Ip, tuple<_Tp...> >::type&
967c206366fSHoward Hinnantget(tuple<_Tp...>& __t) _NOEXCEPT
9683e519524SHoward Hinnant{
9693e519524SHoward Hinnant    typedef typename tuple_element<_Ip, tuple<_Tp...> >::type type;
9703e519524SHoward Hinnant    return static_cast<__tuple_leaf<_Ip, type>&>(__t.base_).get();
9713e519524SHoward Hinnant}
9723e519524SHoward Hinnant
9733e519524SHoward Hinnanttemplate <size_t _Ip, class ..._Tp>
9748bf1f08aSMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
9753e519524SHoward Hinnantconst typename tuple_element<_Ip, tuple<_Tp...> >::type&
976c206366fSHoward Hinnantget(const tuple<_Tp...>& __t) _NOEXCEPT
9773e519524SHoward Hinnant{
9783e519524SHoward Hinnant    typedef typename tuple_element<_Ip, tuple<_Tp...> >::type type;
9793e519524SHoward Hinnant    return static_cast<const __tuple_leaf<_Ip, type>&>(__t.base_).get();
9803e519524SHoward Hinnant}
9813e519524SHoward Hinnant
982601afb30SHoward Hinnanttemplate <size_t _Ip, class ..._Tp>
9838bf1f08aSMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
984601afb30SHoward Hinnanttypename tuple_element<_Ip, tuple<_Tp...> >::type&&
985c206366fSHoward Hinnantget(tuple<_Tp...>&& __t) _NOEXCEPT
986601afb30SHoward Hinnant{
987601afb30SHoward Hinnant    typedef typename tuple_element<_Ip, tuple<_Tp...> >::type type;
9882a3f1bc1SHoward Hinnant    return static_cast<type&&>(
989912e161cSDouglas Gregor             static_cast<__tuple_leaf<_Ip, type>&&>(__t.base_).get());
990601afb30SHoward Hinnant}
991601afb30SHoward Hinnant
992545b8861SEric Fiseliertemplate <size_t _Ip, class ..._Tp>
993545b8861SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
994545b8861SEric Fiselierconst typename tuple_element<_Ip, tuple<_Tp...> >::type&&
995545b8861SEric Fiselierget(const tuple<_Tp...>&& __t) _NOEXCEPT
996545b8861SEric Fiselier{
997545b8861SEric Fiselier    typedef typename tuple_element<_Ip, tuple<_Tp...> >::type type;
998545b8861SEric Fiselier    return static_cast<const type&&>(
999545b8861SEric Fiselier             static_cast<const __tuple_leaf<_Ip, type>&&>(__t.base_).get());
1000545b8861SEric Fiselier}
1001545b8861SEric Fiselier
1002e99520c7SMarshall Clow#if _LIBCPP_STD_VER > 11
1003e99520c7SMarshall Clow
1004f447e62eSEric Fiseliernamespace __find_detail {
1005f447e62eSEric Fiselier
1006f447e62eSEric Fiselierstatic constexpr size_t __not_found = -1;
1007f447e62eSEric Fiselierstatic constexpr size_t __ambiguous = __not_found - 1;
1008f447e62eSEric Fiselier
1009f447e62eSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
1010f447e62eSEric Fiselierconstexpr size_t __find_idx_return(size_t __curr_i, size_t __res, bool __matches) {
1011f447e62eSEric Fiselier    return !__matches ? __res :
1012f447e62eSEric Fiselier        (__res == __not_found ? __curr_i : __ambiguous);
1013f447e62eSEric Fiselier}
1014f447e62eSEric Fiselier
1015f447e62eSEric Fiseliertemplate <size_t _Nx>
1016f447e62eSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
1017f447e62eSEric Fiselierconstexpr size_t __find_idx(size_t __i, const bool (&__matches)[_Nx]) {
1018f447e62eSEric Fiselier  return __i == _Nx ? __not_found :
1019f447e62eSEric Fiselier      __find_idx_return(__i, __find_idx(__i + 1, __matches), __matches[__i]);
1020f447e62eSEric Fiselier}
1021f447e62eSEric Fiselier
1022f447e62eSEric Fiseliertemplate <class _T1, class ..._Args>
1023f447e62eSEric Fiselierstruct __find_exactly_one_checked {
1024f447e62eSEric Fiselier  static constexpr bool __matches[] = {is_same<_T1, _Args>::value...};
1025f447e62eSEric Fiselier    static constexpr size_t value = __find_detail::__find_idx(0, __matches);
1026f447e62eSEric Fiselier    static_assert (value != __not_found, "type not found in type list" );
1027f447e62eSEric Fiselier    static_assert(value != __ambiguous,"type occurs more than once in type list");
1028e99520c7SMarshall Clow};
1029e99520c7SMarshall Clow
10304f905b8dSEric Fiseliertemplate <class _T1>
10314f905b8dSEric Fiselierstruct __find_exactly_one_checked<_T1> {
10324f905b8dSEric Fiselier    static_assert(!is_same<_T1, _T1>::value, "type not in empty type list");
10334f905b8dSEric Fiselier};
10344f905b8dSEric Fiselier
1035f447e62eSEric Fiselier} // namespace __find_detail;
1036e99520c7SMarshall Clow
1037e99520c7SMarshall Clowtemplate <typename _T1, typename... _Args>
1038f447e62eSEric Fiselierstruct __find_exactly_one_t
1039f447e62eSEric Fiselier    : public __find_detail::__find_exactly_one_checked<_T1, _Args...> {
1040e99520c7SMarshall Clow};
1041e99520c7SMarshall Clow
1042e99520c7SMarshall Clowtemplate <class _T1, class... _Args>
1043e99520c7SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
1044e99520c7SMarshall Clowconstexpr _T1& get(tuple<_Args...>& __tup) noexcept
1045e99520c7SMarshall Clow{
1046e99520c7SMarshall Clow    return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(__tup);
1047e99520c7SMarshall Clow}
1048e99520c7SMarshall Clow
1049e99520c7SMarshall Clowtemplate <class _T1, class... _Args>
1050e99520c7SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
1051e99520c7SMarshall Clowconstexpr _T1 const& get(tuple<_Args...> const& __tup) noexcept
1052e99520c7SMarshall Clow{
1053e99520c7SMarshall Clow    return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(__tup);
1054e99520c7SMarshall Clow}
1055e99520c7SMarshall Clow
1056e99520c7SMarshall Clowtemplate <class _T1, class... _Args>
1057e99520c7SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
1058e99520c7SMarshall Clowconstexpr _T1&& get(tuple<_Args...>&& __tup) noexcept
1059e99520c7SMarshall Clow{
10601c682f0fSMarshall Clow    return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(_VSTD::move(__tup));
1061e99520c7SMarshall Clow}
1062e99520c7SMarshall Clow
1063545b8861SEric Fiseliertemplate <class _T1, class... _Args>
1064545b8861SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
1065545b8861SEric Fiselierconstexpr _T1 const&& get(tuple<_Args...> const&& __tup) noexcept
1066545b8861SEric Fiselier{
1067545b8861SEric Fiselier    return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(_VSTD::move(__tup));
1068545b8861SEric Fiselier}
1069545b8861SEric Fiselier
1070e99520c7SMarshall Clow#endif
1071e99520c7SMarshall Clow
10723e519524SHoward Hinnant// tie
10733e519524SHoward Hinnant
10743e519524SHoward Hinnanttemplate <class ..._Tp>
10750d1560e1SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
10763e519524SHoward Hinnanttuple<_Tp&...>
10778a9ee148SHoward Hinnanttie(_Tp&... __t) _NOEXCEPT
10783e519524SHoward Hinnant{
10793e519524SHoward Hinnant    return tuple<_Tp&...>(__t...);
10803e519524SHoward Hinnant}
10813e519524SHoward Hinnant
10823e519524SHoward Hinnanttemplate <class _Up>
10833e519524SHoward Hinnantstruct __ignore_t
10843e519524SHoward Hinnant{
10853e519524SHoward Hinnant    template <class _Tp>
1086789847ddSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
10873e519524SHoward Hinnant        const __ignore_t& operator=(_Tp&&) const {return *this;}
10883e519524SHoward Hinnant};
10893e519524SHoward Hinnant
10903e519524SHoward Hinnantnamespace { const __ignore_t<unsigned char> ignore = __ignore_t<unsigned char>(); }
10913e519524SHoward Hinnant
10923e519524SHoward Hinnanttemplate <class _Tp>
10930724bf67SMarshall Clowstruct __make_tuple_return_impl
10943e519524SHoward Hinnant{
10953e519524SHoward Hinnant    typedef _Tp type;
10963e519524SHoward Hinnant};
10973e519524SHoward Hinnant
10983e519524SHoward Hinnanttemplate <class _Tp>
10990724bf67SMarshall Clowstruct __make_tuple_return_impl<reference_wrapper<_Tp> >
11003e519524SHoward Hinnant{
11013e519524SHoward Hinnant    typedef _Tp& type;
11023e519524SHoward Hinnant};
11033e519524SHoward Hinnant
11043e519524SHoward Hinnanttemplate <class _Tp>
11053e519524SHoward Hinnantstruct __make_tuple_return
11063e519524SHoward Hinnant{
11070724bf67SMarshall Clow    typedef typename __make_tuple_return_impl<typename decay<_Tp>::type>::type type;
11083e519524SHoward Hinnant};
11093e519524SHoward Hinnant
11103e519524SHoward Hinnanttemplate <class... _Tp>
111175eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
11123e519524SHoward Hinnanttuple<typename __make_tuple_return<_Tp>::type...>
11133e519524SHoward Hinnantmake_tuple(_Tp&&... __t)
11143e519524SHoward Hinnant{
1115ce48a113SHoward Hinnant    return tuple<typename __make_tuple_return<_Tp>::type...>(_VSTD::forward<_Tp>(__t)...);
11163e519524SHoward Hinnant}
11173e519524SHoward Hinnant
11181102fbbdSHoward Hinnanttemplate <class... _Tp>
111975eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
112075eff748SMarshall Clowtuple<_Tp&&...>
11218a9ee148SHoward Hinnantforward_as_tuple(_Tp&&... __t) _NOEXCEPT
11221102fbbdSHoward Hinnant{
1123ce48a113SHoward Hinnant    return tuple<_Tp&&...>(_VSTD::forward<_Tp>(__t)...);
11241102fbbdSHoward Hinnant}
11251102fbbdSHoward Hinnant
1126c003db1fSHoward Hinnanttemplate <size_t _Ip>
11273e519524SHoward Hinnantstruct __tuple_equal
11283e519524SHoward Hinnant{
11293e519524SHoward Hinnant    template <class _Tp, class _Up>
113075eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
11313e519524SHoward Hinnant    bool operator()(const _Tp& __x, const _Up& __y)
11323e519524SHoward Hinnant    {
1133f9af6140SMarshall Clow        return __tuple_equal<_Ip - 1>()(__x, __y) && _VSTD::get<_Ip-1>(__x) == _VSTD::get<_Ip-1>(__y);
11343e519524SHoward Hinnant    }
11353e519524SHoward Hinnant};
11363e519524SHoward Hinnant
11373e519524SHoward Hinnanttemplate <>
11383e519524SHoward Hinnantstruct __tuple_equal<0>
11393e519524SHoward Hinnant{
11403e519524SHoward Hinnant    template <class _Tp, class _Up>
114175eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
11423e519524SHoward Hinnant    bool operator()(const _Tp&, const _Up&)
11433e519524SHoward Hinnant    {
11443e519524SHoward Hinnant        return true;
11453e519524SHoward Hinnant    }
11463e519524SHoward Hinnant};
11473e519524SHoward Hinnant
11483e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up>
114975eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
11503e519524SHoward Hinnantbool
11513e519524SHoward Hinnantoperator==(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
11523e519524SHoward Hinnant{
11533e519524SHoward Hinnant    return __tuple_equal<sizeof...(_Tp)>()(__x, __y);
11543e519524SHoward Hinnant}
11553e519524SHoward Hinnant
11563e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up>
115775eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
11583e519524SHoward Hinnantbool
11593e519524SHoward Hinnantoperator!=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
11603e519524SHoward Hinnant{
11613e519524SHoward Hinnant    return !(__x == __y);
11623e519524SHoward Hinnant}
11633e519524SHoward Hinnant
1164c003db1fSHoward Hinnanttemplate <size_t _Ip>
11653e519524SHoward Hinnantstruct __tuple_less
11663e519524SHoward Hinnant{
11673e519524SHoward Hinnant    template <class _Tp, class _Up>
116875eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
11693e519524SHoward Hinnant    bool operator()(const _Tp& __x, const _Up& __y)
11703e519524SHoward Hinnant    {
117153afae49SDuncan P. N. Exon Smith        const size_t __idx = tuple_size<_Tp>::value - _Ip;
117253afae49SDuncan P. N. Exon Smith        if (_VSTD::get<__idx>(__x) < _VSTD::get<__idx>(__y))
117353afae49SDuncan P. N. Exon Smith            return true;
117453afae49SDuncan P. N. Exon Smith        if (_VSTD::get<__idx>(__y) < _VSTD::get<__idx>(__x))
117553afae49SDuncan P. N. Exon Smith            return false;
117653afae49SDuncan P. N. Exon Smith        return __tuple_less<_Ip-1>()(__x, __y);
11773e519524SHoward Hinnant    }
11783e519524SHoward Hinnant};
11793e519524SHoward Hinnant
11803e519524SHoward Hinnanttemplate <>
11813e519524SHoward Hinnantstruct __tuple_less<0>
11823e519524SHoward Hinnant{
11833e519524SHoward Hinnant    template <class _Tp, class _Up>
118475eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
11853e519524SHoward Hinnant    bool operator()(const _Tp&, const _Up&)
11863e519524SHoward Hinnant    {
11873e519524SHoward Hinnant        return false;
11883e519524SHoward Hinnant    }
11893e519524SHoward Hinnant};
11903e519524SHoward Hinnant
11913e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up>
119275eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
11933e519524SHoward Hinnantbool
11943e519524SHoward Hinnantoperator<(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
11953e519524SHoward Hinnant{
11963e519524SHoward Hinnant    return __tuple_less<sizeof...(_Tp)>()(__x, __y);
11973e519524SHoward Hinnant}
11983e519524SHoward Hinnant
11993e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up>
120075eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
12013e519524SHoward Hinnantbool
12023e519524SHoward Hinnantoperator>(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
12033e519524SHoward Hinnant{
12043e519524SHoward Hinnant    return __y < __x;
12053e519524SHoward Hinnant}
12063e519524SHoward Hinnant
12073e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up>
120875eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
12093e519524SHoward Hinnantbool
12103e519524SHoward Hinnantoperator>=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
12113e519524SHoward Hinnant{
12123e519524SHoward Hinnant    return !(__x < __y);
12133e519524SHoward Hinnant}
12143e519524SHoward Hinnant
12153e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up>
121675eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
12173e519524SHoward Hinnantbool
12183e519524SHoward Hinnantoperator<=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
12193e519524SHoward Hinnant{
12203e519524SHoward Hinnant    return !(__y < __x);
12213e519524SHoward Hinnant}
12223e519524SHoward Hinnant
12233e519524SHoward Hinnant// tuple_cat
12243e519524SHoward Hinnant
12257f64810bSHoward Hinnanttemplate <class _Tp, class _Up> struct __tuple_cat_type;
12267f64810bSHoward Hinnant
12277f64810bSHoward Hinnanttemplate <class ..._Ttypes, class ..._Utypes>
12287f64810bSHoward Hinnantstruct __tuple_cat_type<tuple<_Ttypes...>, __tuple_types<_Utypes...> >
12293e519524SHoward Hinnant{
12307f64810bSHoward Hinnant    typedef tuple<_Ttypes..., _Utypes...> type;
12317f64810bSHoward Hinnant};
12327f64810bSHoward Hinnant
12337f64810bSHoward Hinnanttemplate <class _ResultTuple, bool _Is_Tuple0TupleLike, class ..._Tuples>
12347f64810bSHoward Hinnantstruct __tuple_cat_return_1
12357f64810bSHoward Hinnant{
12367f64810bSHoward Hinnant};
12377f64810bSHoward Hinnant
12387f64810bSHoward Hinnanttemplate <class ..._Types, class _Tuple0>
12397f64810bSHoward Hinnantstruct __tuple_cat_return_1<tuple<_Types...>, true, _Tuple0>
12407f64810bSHoward Hinnant{
12417f64810bSHoward Hinnant    typedef typename __tuple_cat_type<tuple<_Types...>,
12427f64810bSHoward Hinnant            typename __make_tuple_types<typename remove_reference<_Tuple0>::type>::type>::type
12437f64810bSHoward Hinnant                                                                           type;
12447f64810bSHoward Hinnant};
12457f64810bSHoward Hinnant
12467f64810bSHoward Hinnanttemplate <class ..._Types, class _Tuple0, class _Tuple1, class ..._Tuples>
12477f64810bSHoward Hinnantstruct __tuple_cat_return_1<tuple<_Types...>, true, _Tuple0, _Tuple1, _Tuples...>
12487f64810bSHoward Hinnant    : public __tuple_cat_return_1<
12497f64810bSHoward Hinnant                 typename __tuple_cat_type<
12507f64810bSHoward Hinnant                     tuple<_Types...>,
12517f64810bSHoward Hinnant                     typename __make_tuple_types<typename remove_reference<_Tuple0>::type>::type
12527f64810bSHoward Hinnant                 >::type,
12537f64810bSHoward Hinnant                 __tuple_like<typename remove_reference<_Tuple1>::type>::value,
12547f64810bSHoward Hinnant                 _Tuple1, _Tuples...>
12557f64810bSHoward Hinnant{
12567f64810bSHoward Hinnant};
12577f64810bSHoward Hinnant
12587f64810bSHoward Hinnanttemplate <class ..._Tuples> struct __tuple_cat_return;
12597f64810bSHoward Hinnant
12607f64810bSHoward Hinnanttemplate <class _Tuple0, class ..._Tuples>
12617f64810bSHoward Hinnantstruct __tuple_cat_return<_Tuple0, _Tuples...>
12627f64810bSHoward Hinnant    : public __tuple_cat_return_1<tuple<>,
12637f64810bSHoward Hinnant         __tuple_like<typename remove_reference<_Tuple0>::type>::value, _Tuple0,
12647f64810bSHoward Hinnant                                                                     _Tuples...>
12657f64810bSHoward Hinnant{
12667f64810bSHoward Hinnant};
12677f64810bSHoward Hinnant
12687f64810bSHoward Hinnanttemplate <>
12697f64810bSHoward Hinnantstruct __tuple_cat_return<>
12707f64810bSHoward Hinnant{
12717f64810bSHoward Hinnant    typedef tuple<> type;
12727f64810bSHoward Hinnant};
12737f64810bSHoward Hinnant
127475eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
12757f64810bSHoward Hinnanttuple<>
12767f64810bSHoward Hinnanttuple_cat()
12777f64810bSHoward Hinnant{
12787f64810bSHoward Hinnant    return tuple<>();
12793e519524SHoward Hinnant}
12803e519524SHoward Hinnant
1281c003db1fSHoward Hinnanttemplate <class _Rp, class _Indices, class _Tuple0, class ..._Tuples>
1282ba31cbdbSHoward Hinnantstruct __tuple_cat_return_ref_imp;
12833e519524SHoward Hinnant
1284ba31cbdbSHoward Hinnanttemplate <class ..._Types, size_t ..._I0, class _Tuple0>
1285ba31cbdbSHoward Hinnantstruct __tuple_cat_return_ref_imp<tuple<_Types...>, __tuple_indices<_I0...>, _Tuple0>
12863e519524SHoward Hinnant{
12877f64810bSHoward Hinnant    typedef typename remove_reference<_Tuple0>::type _T0;
1288ba31cbdbSHoward Hinnant    typedef tuple<_Types..., typename __apply_cv<_Tuple0,
1289ba31cbdbSHoward Hinnant                          typename tuple_element<_I0, _T0>::type>::type&&...> type;
1290ba31cbdbSHoward Hinnant};
1291ba31cbdbSHoward Hinnant
1292ba31cbdbSHoward Hinnanttemplate <class ..._Types, size_t ..._I0, class _Tuple0, class _Tuple1, class ..._Tuples>
1293ba31cbdbSHoward Hinnantstruct __tuple_cat_return_ref_imp<tuple<_Types...>, __tuple_indices<_I0...>,
1294ba31cbdbSHoward Hinnant                                  _Tuple0, _Tuple1, _Tuples...>
1295ba31cbdbSHoward Hinnant    : public __tuple_cat_return_ref_imp<
1296ba31cbdbSHoward Hinnant         tuple<_Types..., typename __apply_cv<_Tuple0,
1297ba31cbdbSHoward Hinnant               typename tuple_element<_I0,
1298ba31cbdbSHoward Hinnant                  typename remove_reference<_Tuple0>::type>::type>::type&&...>,
1299ba31cbdbSHoward Hinnant         typename __make_tuple_indices<tuple_size<typename
1300ba31cbdbSHoward Hinnant                                 remove_reference<_Tuple1>::type>::value>::type,
1301ba31cbdbSHoward Hinnant         _Tuple1, _Tuples...>
1302ba31cbdbSHoward Hinnant{
1303ba31cbdbSHoward Hinnant};
1304ba31cbdbSHoward Hinnant
1305ba31cbdbSHoward Hinnanttemplate <class _Tuple0, class ..._Tuples>
1306ba31cbdbSHoward Hinnantstruct __tuple_cat_return_ref
1307ba31cbdbSHoward Hinnant    : public __tuple_cat_return_ref_imp<tuple<>,
1308ba31cbdbSHoward Hinnant               typename __make_tuple_indices<
1309ba31cbdbSHoward Hinnant                        tuple_size<typename remove_reference<_Tuple0>::type>::value
1310ba31cbdbSHoward Hinnant               >::type, _Tuple0, _Tuples...>
1311ba31cbdbSHoward Hinnant{
1312ba31cbdbSHoward Hinnant};
1313ba31cbdbSHoward Hinnant
1314ba31cbdbSHoward Hinnanttemplate <class _Types, class _I0, class _J0>
1315ba31cbdbSHoward Hinnantstruct __tuple_cat;
1316ba31cbdbSHoward Hinnant
1317ba31cbdbSHoward Hinnanttemplate <class ..._Types, size_t ..._I0, size_t ..._J0>
1318ba31cbdbSHoward Hinnantstruct __tuple_cat<tuple<_Types...>, __tuple_indices<_I0...>, __tuple_indices<_J0...> >
1319ba31cbdbSHoward Hinnant{
1320ba31cbdbSHoward Hinnant    template <class _Tuple0>
132175eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
1322ba31cbdbSHoward Hinnant    typename __tuple_cat_return_ref<tuple<_Types...>&&, _Tuple0&&>::type
1323ba31cbdbSHoward Hinnant    operator()(tuple<_Types...> __t, _Tuple0&& __t0)
1324ba31cbdbSHoward Hinnant    {
1325f9af6140SMarshall Clow        return forward_as_tuple(_VSTD::forward<_Types>(_VSTD::get<_I0>(__t))...,
1326f9af6140SMarshall Clow                                      _VSTD::get<_J0>(_VSTD::forward<_Tuple0>(__t0))...);
13273e519524SHoward Hinnant    }
13283e519524SHoward Hinnant
13297f64810bSHoward Hinnant    template <class _Tuple0, class _Tuple1, class ..._Tuples>
133075eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
1331ba31cbdbSHoward Hinnant    typename __tuple_cat_return_ref<tuple<_Types...>&&, _Tuple0&&, _Tuple1&&, _Tuples&&...>::type
1332ba31cbdbSHoward Hinnant    operator()(tuple<_Types...> __t, _Tuple0&& __t0, _Tuple1&& __t1, _Tuples&& ...__tpls)
13333e519524SHoward Hinnant    {
1334ba31cbdbSHoward Hinnant        typedef typename remove_reference<_Tuple0>::type _T0;
1335ba31cbdbSHoward Hinnant        typedef typename remove_reference<_Tuple1>::type _T1;
1336ba31cbdbSHoward Hinnant        return __tuple_cat<
1337ba31cbdbSHoward Hinnant           tuple<_Types..., typename __apply_cv<_Tuple0, typename tuple_element<_J0, _T0>::type>::type&&...>,
1338ba31cbdbSHoward Hinnant           typename __make_tuple_indices<sizeof ...(_Types) + tuple_size<_T0>::value>::type,
1339ba31cbdbSHoward Hinnant           typename __make_tuple_indices<tuple_size<_T1>::value>::type>()
1340de9320aaSMarshall Clow                           (forward_as_tuple(
1341f9af6140SMarshall Clow                              _VSTD::forward<_Types>(_VSTD::get<_I0>(__t))...,
1342f9af6140SMarshall Clow                              _VSTD::get<_J0>(_VSTD::forward<_Tuple0>(__t0))...
1343ba31cbdbSHoward Hinnant                            ),
1344ce48a113SHoward Hinnant                            _VSTD::forward<_Tuple1>(__t1),
1345ce48a113SHoward Hinnant                            _VSTD::forward<_Tuples>(__tpls)...);
1346ba31cbdbSHoward Hinnant    }
1347ba31cbdbSHoward Hinnant};
1348ba31cbdbSHoward Hinnant
1349ba31cbdbSHoward Hinnanttemplate <class _Tuple0, class... _Tuples>
135075eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
1351ba31cbdbSHoward Hinnanttypename __tuple_cat_return<_Tuple0, _Tuples...>::type
1352ba31cbdbSHoward Hinnanttuple_cat(_Tuple0&& __t0, _Tuples&&... __tpls)
1353ba31cbdbSHoward Hinnant{
1354ba31cbdbSHoward Hinnant    typedef typename remove_reference<_Tuple0>::type _T0;
1355ba31cbdbSHoward Hinnant    return __tuple_cat<tuple<>, __tuple_indices<>,
1356ba31cbdbSHoward Hinnant                  typename __make_tuple_indices<tuple_size<_T0>::value>::type>()
1357ce48a113SHoward Hinnant                  (tuple<>(), _VSTD::forward<_Tuple0>(__t0),
1358ce48a113SHoward Hinnant                                            _VSTD::forward<_Tuples>(__tpls)...);
13593e519524SHoward Hinnant}
13603e519524SHoward Hinnant
13613e519524SHoward Hinnanttemplate <class ..._Tp, class _Alloc>
1362f0544c20SHoward Hinnantstruct _LIBCPP_TYPE_VIS_ONLY uses_allocator<tuple<_Tp...>, _Alloc>
13633e519524SHoward Hinnant    : true_type {};
13643e519524SHoward Hinnant
13653e519524SHoward Hinnanttemplate <class _T1, class _T2>
13663e519524SHoward Hinnanttemplate <class... _Args1, class... _Args2, size_t ..._I1, size_t ..._I2>
13673e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
13683e519524SHoward Hinnantpair<_T1, _T2>::pair(piecewise_construct_t,
13693e519524SHoward Hinnant                     tuple<_Args1...>& __first_args, tuple<_Args2...>& __second_args,
13703e519524SHoward Hinnant                     __tuple_indices<_I1...>, __tuple_indices<_I2...>)
1371f9af6140SMarshall Clow    :  first(_VSTD::forward<_Args1>(_VSTD::get<_I1>( __first_args))...),
1372f9af6140SMarshall Clow      second(_VSTD::forward<_Args2>(_VSTD::get<_I2>(__second_args))...)
13733e519524SHoward Hinnant{
13743e519524SHoward Hinnant}
13753e519524SHoward Hinnant
1376b3371f6fSHoward Hinnant#endif  // _LIBCPP_HAS_NO_VARIADICS
13773e519524SHoward Hinnant
137803e29a29SEric Fiselier#if _LIBCPP_STD_VER > 14
137903e29a29SEric Fiseliertemplate <class _Tp>
138003e29a29SEric Fiselierconstexpr size_t tuple_size_v = tuple_size<_Tp>::value;
138103e29a29SEric Fiselier
138203e29a29SEric Fiselier#define _LIBCPP_NOEXCEPT_RETURN(...) noexcept(noexcept(__VA_ARGS__)) { return __VA_ARGS__; }
138303e29a29SEric Fiselier
138403e29a29SEric Fiseliertemplate <class _Fn, class _Tuple, size_t ..._Id>
138503e29a29SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
138603e29a29SEric Fiselierconstexpr decltype(auto) __apply_tuple_impl(_Fn && __f, _Tuple && __t,
138703e29a29SEric Fiselier                                            __tuple_indices<_Id...>)
138803e29a29SEric Fiselier_LIBCPP_NOEXCEPT_RETURN(
138903e29a29SEric Fiselier    _VSTD::__invoke_constexpr(
139003e29a29SEric Fiselier        _VSTD::forward<_Fn>(__f),
139103e29a29SEric Fiselier        _VSTD::get<_Id>(_VSTD::forward<_Tuple>(__t))...)
139203e29a29SEric Fiselier)
139303e29a29SEric Fiselier
139403e29a29SEric Fiseliertemplate <class _Fn, class _Tuple>
139503e29a29SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
139603e29a29SEric Fiselierconstexpr decltype(auto) apply(_Fn && __f, _Tuple && __t)
139703e29a29SEric Fiselier_LIBCPP_NOEXCEPT_RETURN(
139803e29a29SEric Fiselier    _VSTD::__apply_tuple_impl(
139903e29a29SEric Fiselier        _VSTD::forward<_Fn>(__f), _VSTD::forward<_Tuple>(__t),
140003e29a29SEric Fiselier        typename __make_tuple_indices<tuple_size_v<decay_t<_Tuple>>>::type{})
140103e29a29SEric Fiselier)
140203e29a29SEric Fiselier
140303e29a29SEric Fiseliertemplate <class _Tp, class _Tuple, size_t... _Idx>
140403e29a29SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
140503e29a29SEric Fiselierconstexpr _Tp __make_from_tuple_impl(_Tuple&& __t, __tuple_indices<_Idx...>)
140603e29a29SEric Fiselier_LIBCPP_NOEXCEPT_RETURN(
140703e29a29SEric Fiselier    _Tp(_VSTD::get<_Idx>(_VSTD::forward<_Tuple>(__t))...)
140803e29a29SEric Fiselier)
140903e29a29SEric Fiselier
141003e29a29SEric Fiseliertemplate <class _Tp, class _Tuple>
141103e29a29SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
141203e29a29SEric Fiselierconstexpr _Tp make_from_tuple(_Tuple&& __t)
141303e29a29SEric Fiselier_LIBCPP_NOEXCEPT_RETURN(
141403e29a29SEric Fiselier    _VSTD::__make_from_tuple_impl<_Tp>(_VSTD::forward<_Tuple>(__t),
141503e29a29SEric Fiselier        typename __make_tuple_indices<tuple_size_v<decay_t<_Tuple>>>::type{})
141603e29a29SEric Fiselier)
141703e29a29SEric Fiselier
141803e29a29SEric Fiselier#undef _LIBCPP_NOEXCEPT_RETURN
141903e29a29SEric Fiselier
142003e29a29SEric Fiselier#endif // _LIBCPP_STD_VER > 14
142103e29a29SEric Fiselier
14223e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
14233e519524SHoward Hinnant
14243e519524SHoward Hinnant#endif  // _LIBCPP_TUPLE
1425