xref: /llvm-project-15.0.7/libcxx/include/tuple (revision bfb3f2bf)
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
803e519524SHoward Hinnant// 20.4.1.4, tuple helper classes:
813e519524SHoward Hinnanttemplate <class T> class tuple_size; // undefined
823e519524SHoward Hinnanttemplate <class... T> class tuple_size<tuple<T...>>;
83*bfb3f2bfSMarshall Clowtemplate <size_t I, class T> class tuple_element; // undefined
84*bfb3f2bfSMarshall Clowtemplate <size_t I, class... T> class tuple_element<I, tuple<T...>>;
85*bfb3f2bfSMarshall Clowtemplate <size_t I, class T>
86*bfb3f2bfSMarshall Clow  using tuple_element_t = typename tuple_element <I, T>::type; // C++14
873e519524SHoward Hinnant
883e519524SHoward Hinnant// 20.4.1.5, element access:
89*bfb3f2bfSMarshall Clowtemplate <size_t I, class... T>
9027d0a2a7SHoward Hinnant    typename tuple_element<I, tuple<T...>>::type&
918bf1f08aSMarshall Clow    get(tuple<T...>&) noexcept; // constexpr in C++14
92*bfb3f2bfSMarshall Clowtemplate <size_t I, class... T>
93*bfb3f2bfSMarshall Clow    const typename tuple_element<I, tuple<T...>>::type&
948bf1f08aSMarshall Clow    get(const tuple<T...>&) noexcept; // constexpr in C++14
95*bfb3f2bfSMarshall Clowtemplate <size_t I, class... T>
9627d0a2a7SHoward Hinnant    typename tuple_element<I, tuple<T...>>::type&&
978bf1f08aSMarshall Clow    get(tuple<T...>&&) noexcept; // constexpr in C++14
983e519524SHoward Hinnant
99e99520c7SMarshall Clowtemplate <class T1, class... T>
100e99520c7SMarshall Clow    constexpr T1& get(tuple<T...>&) noexcept;  // C++14
101e99520c7SMarshall Clowtemplate <class T1, class... T>
102*bfb3f2bfSMarshall Clow    constexpr const T1& get(const tuple<T...>&) noexcept;   // C++14
103e99520c7SMarshall Clowtemplate <class T1, class... T>
104e99520c7SMarshall Clow    constexpr T1&& get(tuple<T...>&&) noexcept;   // C++14
105e99520c7SMarshall Clow
1063e519524SHoward Hinnant// 20.4.1.6, relational operators:
10775eff748SMarshall Clowtemplate<class... T, class... U> bool operator==(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14
10875eff748SMarshall Clowtemplate<class... T, class... U> bool operator<(const tuple<T...>&, const tuple<U...>&);  // constexpr in C++14
10975eff748SMarshall Clowtemplate<class... T, class... U> bool operator!=(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14
11075eff748SMarshall Clowtemplate<class... T, class... U> bool operator>(const tuple<T...>&, const tuple<U...>&);  // constexpr in C++14
11175eff748SMarshall Clowtemplate<class... T, class... U> bool operator<=(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14
11275eff748SMarshall Clowtemplate<class... T, class... U> bool operator>=(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14
1133e519524SHoward Hinnant
1143e519524SHoward Hinnanttemplate <class... Types, class Alloc>
1153e519524SHoward Hinnant  struct uses_allocator<tuple<Types...>, Alloc>;
1163e519524SHoward Hinnant
1173e519524SHoward Hinnanttemplate <class... Types>
11827d0a2a7SHoward Hinnant  void
11927d0a2a7SHoward Hinnant  swap(tuple<Types...>& x, tuple<Types...>& y) noexcept(noexcept(x.swap(y)));
1203e519524SHoward Hinnant
1213e519524SHoward Hinnant}  // std
1223e519524SHoward Hinnant
1233e519524SHoward Hinnant*/
1243e519524SHoward Hinnant
1253e519524SHoward Hinnant#include <__config>
1263e519524SHoward Hinnant#include <__tuple>
1273e519524SHoward Hinnant#include <cstddef>
1283e519524SHoward Hinnant#include <type_traits>
129a87b5e34SHoward Hinnant#include <__functional_base>
130a87b5e34SHoward Hinnant#include <utility>
1313e519524SHoward Hinnant
132073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1333e519524SHoward Hinnant#pragma GCC system_header
134073458b1SHoward Hinnant#endif
1353e519524SHoward Hinnant
1363e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
1373e519524SHoward Hinnant
1383e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS
1393e519524SHoward Hinnant
1403e519524SHoward Hinnant// tuple_size
1413e519524SHoward Hinnant
1423e519524SHoward Hinnanttemplate <class ..._Tp>
143f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS_ONLY tuple_size<tuple<_Tp...> >
1443e519524SHoward Hinnant    : public integral_constant<size_t, sizeof...(_Tp)>
1453e519524SHoward Hinnant{
1463e519524SHoward Hinnant};
1473e519524SHoward Hinnant
1483e519524SHoward Hinnant// tuple_element
1493e519524SHoward Hinnant
1503e519524SHoward Hinnanttemplate <size_t _Ip, class ..._Tp>
151f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS_ONLY tuple_element<_Ip, tuple<_Tp...> >
1523e519524SHoward Hinnant{
1533e519524SHoward Hinnantpublic:
1543e519524SHoward Hinnant    typedef typename tuple_element<_Ip, __tuple_types<_Tp...> >::type type;
1553e519524SHoward Hinnant};
1563e519524SHoward Hinnant
15705c8dad2SMarshall Clow#if _LIBCPP_STD_VER > 11
15805c8dad2SMarshall Clowtemplate <size_t _Ip, class ..._Tp>
15905c8dad2SMarshall Clowusing tuple_element_t = typename tuple_element <_Ip, _Tp...>::type;
16005c8dad2SMarshall Clow#endif
16105c8dad2SMarshall Clow
1623e519524SHoward Hinnant// __tuple_leaf
1633e519524SHoward Hinnant
164ee187e24SEric Fiseliertemplate <size_t _Ip, class _Hp,
165ee187e24SEric Fiselier          bool=is_empty<_Hp>::value && !__libcpp_is_final<_Hp>::value
16642b8bb50SHoward Hinnant         >
1673e519524SHoward Hinnantclass __tuple_leaf;
1683e519524SHoward Hinnant
1693e519524SHoward Hinnanttemplate <size_t _Ip, class _Hp, bool _Ep>
170789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1713e519524SHoward Hinnantvoid swap(__tuple_leaf<_Ip, _Hp, _Ep>& __x, __tuple_leaf<_Ip, _Hp, _Ep>& __y)
17227d0a2a7SHoward Hinnant    _NOEXCEPT_(__is_nothrow_swappable<_Hp>::value)
1733e519524SHoward Hinnant{
1743e519524SHoward Hinnant    swap(__x.get(), __y.get());
1753e519524SHoward Hinnant}
1763e519524SHoward Hinnant
1773e519524SHoward Hinnanttemplate <size_t _Ip, class _Hp, bool>
1783e519524SHoward Hinnantclass __tuple_leaf
1793e519524SHoward Hinnant{
1803e519524SHoward Hinnant    _Hp value;
1813e519524SHoward Hinnant
1823e519524SHoward Hinnant    __tuple_leaf& operator=(const __tuple_leaf&);
1833e519524SHoward Hinnantpublic:
184a0f4c45cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR __tuple_leaf()
185a0f4c45cSHoward Hinnant             _NOEXCEPT_(is_nothrow_default_constructible<_Hp>::value) : value()
1863e519524SHoward Hinnant       {static_assert(!is_reference<_Hp>::value,
1873e519524SHoward Hinnant              "Attempted to default construct a reference element in a tuple");}
1883e519524SHoward Hinnant
1893e519524SHoward Hinnant    template <class _Alloc>
1903e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1913e519524SHoward Hinnant        __tuple_leaf(integral_constant<int, 0>, const _Alloc&)
1923e519524SHoward Hinnant            : value()
1933e519524SHoward Hinnant        {static_assert(!is_reference<_Hp>::value,
1943e519524SHoward Hinnant              "Attempted to default construct a reference element in a tuple");}
1953e519524SHoward Hinnant
1963e519524SHoward Hinnant    template <class _Alloc>
1973e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1983e519524SHoward Hinnant        __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a)
1993e519524SHoward Hinnant            : value(allocator_arg_t(), __a)
2003e519524SHoward Hinnant        {static_assert(!is_reference<_Hp>::value,
2013e519524SHoward Hinnant              "Attempted to default construct a reference element in a tuple");}
2023e519524SHoward Hinnant
2033e519524SHoward Hinnant    template <class _Alloc>
2043e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2053e519524SHoward Hinnant        __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a)
2063e519524SHoward Hinnant            : value(__a)
2073e519524SHoward Hinnant        {static_assert(!is_reference<_Hp>::value,
2083e519524SHoward Hinnant              "Attempted to default construct a reference element in a tuple");}
2093e519524SHoward Hinnant
21030ad985bSHoward Hinnant    template <class _Tp,
211567bb79bSEric Fiselier              class = typename enable_if<
212567bb79bSEric Fiselier                  __lazy_and<
213567bb79bSEric Fiselier                      __lazy_not<is_same<typename decay<_Tp>::type, __tuple_leaf>>
214567bb79bSEric Fiselier                    , is_constructible<_Hp, _Tp>
215567bb79bSEric Fiselier                    >::value
216567bb79bSEric Fiselier                >::type
217567bb79bSEric Fiselier            >
21875eff748SMarshall Clow        _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
2198a9ee148SHoward Hinnant        explicit __tuple_leaf(_Tp&& __t) _NOEXCEPT_((is_nothrow_constructible<_Hp, _Tp>::value))
220ce48a113SHoward Hinnant            : value(_VSTD::forward<_Tp>(__t))
22130ad985bSHoward Hinnant        {static_assert(!is_reference<_Hp>::value ||
222c206366fSHoward Hinnant                       (is_lvalue_reference<_Hp>::value &&
2233e519524SHoward Hinnant                        (is_lvalue_reference<_Tp>::value ||
2243e519524SHoward Hinnant                         is_same<typename remove_reference<_Tp>::type,
2253e519524SHoward Hinnant                                 reference_wrapper<
2263e519524SHoward Hinnant                                    typename remove_reference<_Hp>::type
2273e519524SHoward Hinnant                                 >
228c206366fSHoward Hinnant                                >::value)) ||
22930ad985bSHoward Hinnant                        (is_rvalue_reference<_Hp>::value &&
23030ad985bSHoward Hinnant                         !is_lvalue_reference<_Tp>::value),
2313e519524SHoward Hinnant       "Attempted to construct a reference element in a tuple with an rvalue");}
2323e519524SHoward Hinnant
2333e519524SHoward Hinnant    template <class _Tp, class _Alloc>
2343e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2353e519524SHoward Hinnant        explicit __tuple_leaf(integral_constant<int, 0>, const _Alloc&, _Tp&& __t)
236ce48a113SHoward Hinnant            : value(_VSTD::forward<_Tp>(__t))
2373e519524SHoward Hinnant        {static_assert(!is_lvalue_reference<_Hp>::value ||
238c206366fSHoward Hinnant                       (is_lvalue_reference<_Hp>::value &&
2393e519524SHoward Hinnant                        (is_lvalue_reference<_Tp>::value ||
2403e519524SHoward Hinnant                         is_same<typename remove_reference<_Tp>::type,
2413e519524SHoward Hinnant                                 reference_wrapper<
2423e519524SHoward Hinnant                                    typename remove_reference<_Hp>::type
2433e519524SHoward Hinnant                                 >
244c206366fSHoward Hinnant                                >::value)),
2453e519524SHoward Hinnant       "Attempted to construct a reference element in a tuple with an rvalue");}
2463e519524SHoward Hinnant
2473e519524SHoward Hinnant    template <class _Tp, class _Alloc>
2483e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2493e519524SHoward Hinnant        explicit __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a, _Tp&& __t)
250ce48a113SHoward Hinnant            : value(allocator_arg_t(), __a, _VSTD::forward<_Tp>(__t))
2513e519524SHoward Hinnant        {static_assert(!is_lvalue_reference<_Hp>::value ||
252c206366fSHoward Hinnant                       (is_lvalue_reference<_Hp>::value &&
2533e519524SHoward Hinnant                        (is_lvalue_reference<_Tp>::value ||
2543e519524SHoward Hinnant                         is_same<typename remove_reference<_Tp>::type,
2553e519524SHoward Hinnant                                 reference_wrapper<
2563e519524SHoward Hinnant                                    typename remove_reference<_Hp>::type
2573e519524SHoward Hinnant                                 >
258c206366fSHoward Hinnant                                >::value)),
2593e519524SHoward Hinnant       "Attempted to construct a reference element in a tuple with an rvalue");}
2603e519524SHoward Hinnant
2613e519524SHoward Hinnant    template <class _Tp, class _Alloc>
2623e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2633e519524SHoward Hinnant        explicit __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a, _Tp&& __t)
264ce48a113SHoward Hinnant            : value(_VSTD::forward<_Tp>(__t), __a)
2653e519524SHoward Hinnant        {static_assert(!is_lvalue_reference<_Hp>::value ||
266c206366fSHoward Hinnant                       (is_lvalue_reference<_Hp>::value &&
2673e519524SHoward Hinnant                        (is_lvalue_reference<_Tp>::value ||
2683e519524SHoward Hinnant                         is_same<typename remove_reference<_Tp>::type,
2693e519524SHoward Hinnant                                 reference_wrapper<
2703e519524SHoward Hinnant                                    typename remove_reference<_Hp>::type
2713e519524SHoward Hinnant                                 >
272c206366fSHoward Hinnant                                >::value)),
2733e519524SHoward Hinnant       "Attempted to construct a reference element in a tuple with an rvalue");}
2743e519524SHoward Hinnant
2757546a111SMarshall Clow    __tuple_leaf(const __tuple_leaf& __t) = default;
2767546a111SMarshall Clow    __tuple_leaf(__tuple_leaf&& __t) = default;
2773e519524SHoward Hinnant
2783e519524SHoward Hinnant    template <class _Tp>
2793e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2803e519524SHoward Hinnant        __tuple_leaf&
2818a9ee148SHoward Hinnant        operator=(_Tp&& __t) _NOEXCEPT_((is_nothrow_assignable<_Hp&, _Tp>::value))
2823e519524SHoward Hinnant        {
283ce48a113SHoward Hinnant            value = _VSTD::forward<_Tp>(__t);
2843e519524SHoward Hinnant            return *this;
2853e519524SHoward Hinnant        }
2863e519524SHoward Hinnant
2873e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
28827d0a2a7SHoward Hinnant    int swap(__tuple_leaf& __t) _NOEXCEPT_(__is_nothrow_swappable<__tuple_leaf>::value)
2893e519524SHoward Hinnant    {
290ce48a113SHoward Hinnant        _VSTD::swap(*this, __t);
2913e519524SHoward Hinnant        return 0;
2923e519524SHoward Hinnant    }
2933e519524SHoward Hinnant
29475eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11       _Hp& get()       _NOEXCEPT {return value;}
29575eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const _Hp& get() const _NOEXCEPT {return value;}
2963e519524SHoward Hinnant};
2973e519524SHoward Hinnant
2983e519524SHoward Hinnanttemplate <size_t _Ip, class _Hp>
2993e519524SHoward Hinnantclass __tuple_leaf<_Ip, _Hp, true>
3003e519524SHoward Hinnant    : private _Hp
3013e519524SHoward Hinnant{
3023e519524SHoward Hinnant
3033e519524SHoward Hinnant    __tuple_leaf& operator=(const __tuple_leaf&);
3043e519524SHoward Hinnantpublic:
305a0f4c45cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR __tuple_leaf()
306a0f4c45cSHoward Hinnant             _NOEXCEPT_(is_nothrow_default_constructible<_Hp>::value) {}
3073e519524SHoward Hinnant
3083e519524SHoward Hinnant    template <class _Alloc>
3093e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
3103e519524SHoward Hinnant        __tuple_leaf(integral_constant<int, 0>, const _Alloc&) {}
3113e519524SHoward Hinnant
3123e519524SHoward Hinnant    template <class _Alloc>
3133e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
3143e519524SHoward Hinnant        __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a)
3153e519524SHoward Hinnant            : _Hp(allocator_arg_t(), __a) {}
3163e519524SHoward Hinnant
3173e519524SHoward Hinnant    template <class _Alloc>
3183e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
3193e519524SHoward Hinnant        __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a)
3203e519524SHoward Hinnant            : _Hp(__a) {}
3213e519524SHoward Hinnant
32230ad985bSHoward Hinnant    template <class _Tp,
323567bb79bSEric Fiselier              class = typename enable_if<
324567bb79bSEric Fiselier                  __lazy_and<
325567bb79bSEric Fiselier                        __lazy_not<is_same<typename decay<_Tp>::type, __tuple_leaf>>
326567bb79bSEric Fiselier                      , is_constructible<_Hp, _Tp>
327567bb79bSEric Fiselier                    >::value
328567bb79bSEric Fiselier                >::type
329567bb79bSEric Fiselier            >
33075eff748SMarshall Clow        _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
3318a9ee148SHoward Hinnant        explicit __tuple_leaf(_Tp&& __t) _NOEXCEPT_((is_nothrow_constructible<_Hp, _Tp>::value))
332ce48a113SHoward Hinnant            : _Hp(_VSTD::forward<_Tp>(__t)) {}
3333e519524SHoward Hinnant
3343e519524SHoward Hinnant    template <class _Tp, class _Alloc>
3353e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
3363e519524SHoward Hinnant        explicit __tuple_leaf(integral_constant<int, 0>, const _Alloc&, _Tp&& __t)
337ce48a113SHoward Hinnant            : _Hp(_VSTD::forward<_Tp>(__t)) {}
3383e519524SHoward Hinnant
3393e519524SHoward Hinnant    template <class _Tp, class _Alloc>
3403e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
3413e519524SHoward Hinnant        explicit __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a, _Tp&& __t)
342ce48a113SHoward Hinnant            : _Hp(allocator_arg_t(), __a, _VSTD::forward<_Tp>(__t)) {}
3433e519524SHoward Hinnant
3443e519524SHoward Hinnant    template <class _Tp, class _Alloc>
3453e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
3463e519524SHoward Hinnant        explicit __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a, _Tp&& __t)
347ce48a113SHoward Hinnant            : _Hp(_VSTD::forward<_Tp>(__t), __a) {}
3483e519524SHoward Hinnant
349567bb79bSEric Fiselier    __tuple_leaf(__tuple_leaf const &) = default;
350567bb79bSEric Fiselier    __tuple_leaf(__tuple_leaf &&) = default;
351567bb79bSEric Fiselier
3523e519524SHoward Hinnant    template <class _Tp>
3533e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
3543e519524SHoward Hinnant        __tuple_leaf&
3558a9ee148SHoward Hinnant        operator=(_Tp&& __t) _NOEXCEPT_((is_nothrow_assignable<_Hp&, _Tp>::value))
3563e519524SHoward Hinnant        {
357ce48a113SHoward Hinnant            _Hp::operator=(_VSTD::forward<_Tp>(__t));
3583e519524SHoward Hinnant            return *this;
3593e519524SHoward Hinnant        }
3603e519524SHoward Hinnant
36127d0a2a7SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
36227d0a2a7SHoward Hinnant    int
36327d0a2a7SHoward Hinnant    swap(__tuple_leaf& __t) _NOEXCEPT_(__is_nothrow_swappable<__tuple_leaf>::value)
3643e519524SHoward Hinnant    {
365ce48a113SHoward Hinnant        _VSTD::swap(*this, __t);
3663e519524SHoward Hinnant        return 0;
3673e519524SHoward Hinnant    }
3683e519524SHoward Hinnant
36975eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11       _Hp& get()       _NOEXCEPT {return static_cast<_Hp&>(*this);}
37075eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const _Hp& get() const _NOEXCEPT {return static_cast<const _Hp&>(*this);}
3713e519524SHoward Hinnant};
3723e519524SHoward Hinnant
373789847ddSHoward Hinnanttemplate <class ..._Tp>
374789847ddSHoward Hinnant_LIBCPP_INLINE_VISIBILITY
3758a9ee148SHoward Hinnantvoid __swallow(_Tp&&...) _NOEXCEPT {}
3763e519524SHoward Hinnant
37753deb607SEric Fiseliertemplate <bool ..._Pred>
37814c5ec51SMarshall Clowstruct __all
37953deb607SEric Fiselier    : is_same<__all<_Pred...>, __all<(_Pred, true)...>>
38014c5ec51SMarshall Clow{ };
38127d0a2a7SHoward Hinnant
38214c5ec51SMarshall Clowtemplate <class _Tp>
38314c5ec51SMarshall Clowstruct __all_default_constructible;
38427d0a2a7SHoward Hinnant
38514c5ec51SMarshall Clowtemplate <class ..._Tp>
38614c5ec51SMarshall Clowstruct __all_default_constructible<__tuple_types<_Tp...>>
38714c5ec51SMarshall Clow    : __all<is_default_constructible<_Tp>::value...>
38814c5ec51SMarshall Clow{ };
38927d0a2a7SHoward Hinnant
3903e519524SHoward Hinnant// __tuple_impl
3913e519524SHoward Hinnant
3923e519524SHoward Hinnanttemplate<class _Indx, class ..._Tp> struct __tuple_impl;
3933e519524SHoward Hinnant
3943e519524SHoward Hinnanttemplate<size_t ..._Indx, class ..._Tp>
3953e519524SHoward Hinnantstruct __tuple_impl<__tuple_indices<_Indx...>, _Tp...>
3963e519524SHoward Hinnant    : public __tuple_leaf<_Indx, _Tp>...
3973e519524SHoward Hinnant{
398a62ebe04SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
399a0f4c45cSHoward Hinnant    _LIBCPP_CONSTEXPR __tuple_impl()
400a0f4c45cSHoward Hinnant        _NOEXCEPT_(__all<is_nothrow_default_constructible<_Tp>::value...>::value) {}
401a62ebe04SHoward Hinnant
4023e519524SHoward Hinnant    template <size_t ..._Uf, class ..._Tf,
4033e519524SHoward Hinnant              size_t ..._Ul, class ..._Tl, class ..._Up>
40475eff748SMarshall Clow        _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
4053e519524SHoward Hinnant        explicit
4063e519524SHoward Hinnant        __tuple_impl(__tuple_indices<_Uf...>, __tuple_types<_Tf...>,
4073e519524SHoward Hinnant                     __tuple_indices<_Ul...>, __tuple_types<_Tl...>,
4088a9ee148SHoward Hinnant                     _Up&&... __u)
4098a9ee148SHoward Hinnant                     _NOEXCEPT_((__all<is_nothrow_constructible<_Tf, _Up>::value...>::value &&
4108a9ee148SHoward Hinnant                                 __all<is_nothrow_default_constructible<_Tl>::value...>::value)) :
411ce48a113SHoward Hinnant            __tuple_leaf<_Uf, _Tf>(_VSTD::forward<_Up>(__u))...,
4123e519524SHoward Hinnant            __tuple_leaf<_Ul, _Tl>()...
4133e519524SHoward Hinnant            {}
4143e519524SHoward Hinnant
4153e519524SHoward Hinnant    template <class _Alloc, size_t ..._Uf, class ..._Tf,
4163e519524SHoward Hinnant              size_t ..._Ul, class ..._Tl, class ..._Up>
417789847ddSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
4183e519524SHoward Hinnant        explicit
4193e519524SHoward Hinnant        __tuple_impl(allocator_arg_t, const _Alloc& __a,
4203e519524SHoward Hinnant                     __tuple_indices<_Uf...>, __tuple_types<_Tf...>,
4213e519524SHoward Hinnant                     __tuple_indices<_Ul...>, __tuple_types<_Tl...>,
4223e519524SHoward Hinnant                     _Up&&... __u) :
4233e519524SHoward Hinnant            __tuple_leaf<_Uf, _Tf>(__uses_alloc_ctor<_Tf, _Alloc, _Up>(), __a,
424ce48a113SHoward Hinnant            _VSTD::forward<_Up>(__u))...,
4253e519524SHoward Hinnant            __tuple_leaf<_Ul, _Tl>(__uses_alloc_ctor<_Tl, _Alloc>(), __a)...
4263e519524SHoward Hinnant            {}
4273e519524SHoward Hinnant
4283e519524SHoward Hinnant    template <class _Tuple,
4293e519524SHoward Hinnant              class = typename enable_if
4303e519524SHoward Hinnant                      <
431f3b02b17SHoward Hinnant                         __tuple_constructible<_Tuple, tuple<_Tp...> >::value
4323e519524SHoward Hinnant                      >::type
4333e519524SHoward Hinnant             >
43475eff748SMarshall Clow        _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
4358a9ee148SHoward Hinnant        __tuple_impl(_Tuple&& __t) _NOEXCEPT_((__all<is_nothrow_constructible<_Tp, typename tuple_element<_Indx,
4368a9ee148SHoward Hinnant                                       typename __make_tuple_types<_Tuple>::type>::type>::value...>::value))
437ce48a113SHoward Hinnant            : __tuple_leaf<_Indx, _Tp>(_VSTD::forward<typename tuple_element<_Indx,
438ce48a113SHoward Hinnant                                       typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<_Indx>(__t)))...
4393e519524SHoward Hinnant            {}
4403e519524SHoward Hinnant
4413e519524SHoward Hinnant    template <class _Alloc, class _Tuple,
4423e519524SHoward Hinnant              class = typename enable_if
4433e519524SHoward Hinnant                      <
4443e519524SHoward Hinnant                         __tuple_convertible<_Tuple, tuple<_Tp...> >::value
4453e519524SHoward Hinnant                      >::type
4463e519524SHoward Hinnant             >
447789847ddSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
4483e519524SHoward Hinnant        __tuple_impl(allocator_arg_t, const _Alloc& __a, _Tuple&& __t)
4493e519524SHoward Hinnant            : __tuple_leaf<_Indx, _Tp>(__uses_alloc_ctor<_Tp, _Alloc, typename tuple_element<_Indx,
4503e519524SHoward Hinnant                                       typename __make_tuple_types<_Tuple>::type>::type>(), __a,
451ce48a113SHoward Hinnant                                       _VSTD::forward<typename tuple_element<_Indx,
452ce48a113SHoward Hinnant                                       typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<_Indx>(__t)))...
4533e519524SHoward Hinnant            {}
4543e519524SHoward Hinnant
4553e519524SHoward Hinnant    template <class _Tuple>
456789847ddSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
4573e519524SHoward Hinnant        typename enable_if
4583e519524SHoward Hinnant        <
4593e519524SHoward Hinnant            __tuple_assignable<_Tuple, tuple<_Tp...> >::value,
4603e519524SHoward Hinnant            __tuple_impl&
4613e519524SHoward Hinnant        >::type
4628a9ee148SHoward Hinnant        operator=(_Tuple&& __t) _NOEXCEPT_((__all<is_nothrow_assignable<_Tp&, typename tuple_element<_Indx,
4638a9ee148SHoward Hinnant                                       typename __make_tuple_types<_Tuple>::type>::type>::value...>::value))
4643e519524SHoward Hinnant        {
465ce48a113SHoward Hinnant            __swallow(__tuple_leaf<_Indx, _Tp>::operator=(_VSTD::forward<typename tuple_element<_Indx,
466ce48a113SHoward Hinnant                                       typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<_Indx>(__t)))...);
4673e519524SHoward Hinnant            return *this;
4683e519524SHoward Hinnant        }
4693e519524SHoward Hinnant
4704478b25aSHoward Hinnant    __tuple_impl(const __tuple_impl&) = default;
4714478b25aSHoward Hinnant    __tuple_impl(__tuple_impl&&) = default;
4724478b25aSHoward Hinnant
473789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
474fa8df7dbSHoward Hinnant    __tuple_impl&
4758a9ee148SHoward Hinnant    operator=(const __tuple_impl& __t) _NOEXCEPT_((__all<is_nothrow_copy_assignable<_Tp>::value...>::value))
476fa8df7dbSHoward Hinnant    {
477fa8df7dbSHoward Hinnant        __swallow(__tuple_leaf<_Indx, _Tp>::operator=(static_cast<const __tuple_leaf<_Indx, _Tp>&>(__t).get())...);
478fa8df7dbSHoward Hinnant        return *this;
479fa8df7dbSHoward Hinnant    }
480fa8df7dbSHoward Hinnant
481fa8df7dbSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4824478b25aSHoward Hinnant    __tuple_impl&
4834478b25aSHoward Hinnant    operator=(__tuple_impl&& __t) _NOEXCEPT_((__all<is_nothrow_move_assignable<_Tp>::value...>::value))
4844478b25aSHoward Hinnant    {
4854478b25aSHoward Hinnant        __swallow(__tuple_leaf<_Indx, _Tp>::operator=(_VSTD::forward<_Tp>(static_cast<__tuple_leaf<_Indx, _Tp>&>(__t).get()))...);
4864478b25aSHoward Hinnant        return *this;
4874478b25aSHoward Hinnant    }
4884478b25aSHoward Hinnant
4894478b25aSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4903e519524SHoward Hinnant    void swap(__tuple_impl& __t)
49127d0a2a7SHoward Hinnant        _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value)
4923e519524SHoward Hinnant    {
4933e519524SHoward Hinnant        __swallow(__tuple_leaf<_Indx, _Tp>::swap(static_cast<__tuple_leaf<_Indx, _Tp>&>(__t))...);
4943e519524SHoward Hinnant    }
4953e519524SHoward Hinnant};
4963e519524SHoward Hinnant
4973e519524SHoward Hinnanttemplate <class ..._Tp>
498f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS_ONLY tuple
4993e519524SHoward Hinnant{
5003e519524SHoward Hinnant    typedef __tuple_impl<typename __make_tuple_indices<sizeof...(_Tp)>::type, _Tp...> base;
5013e519524SHoward Hinnant
5023e519524SHoward Hinnant    base base_;
5033e519524SHoward Hinnant
5048bf1f08aSMarshall Clow    template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11
505c206366fSHoward Hinnant        typename tuple_element<_Jp, tuple<_Up...> >::type& get(tuple<_Up...>&) _NOEXCEPT;
5068bf1f08aSMarshall Clow    template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11
507c206366fSHoward Hinnant        const typename tuple_element<_Jp, tuple<_Up...> >::type& get(const tuple<_Up...>&) _NOEXCEPT;
5088bf1f08aSMarshall Clow    template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11
509c206366fSHoward Hinnant        typename tuple_element<_Jp, tuple<_Up...> >::type&& get(tuple<_Up...>&&) _NOEXCEPT;
5103e519524SHoward Hinnantpublic:
5113e519524SHoward Hinnant
51265500d4bSEric Fiselier    template <bool _Dummy = true, class = typename enable_if<
51365500d4bSEric Fiselier        __all<__dependent_type<is_default_constructible<_Tp>, _Dummy>::value...>::value
51414c5ec51SMarshall Clow    >::type>
515789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
516a0f4c45cSHoward Hinnant    _LIBCPP_CONSTEXPR tuple()
517a0f4c45cSHoward Hinnant        _NOEXCEPT_(__all<is_nothrow_default_constructible<_Tp>::value...>::value) {}
518a62ebe04SHoward Hinnant
51975eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
5208a9ee148SHoward Hinnant    explicit tuple(const _Tp& ... __t) _NOEXCEPT_((__all<is_nothrow_copy_constructible<_Tp>::value...>::value))
5213e519524SHoward Hinnant        : base_(typename __make_tuple_indices<sizeof...(_Tp)>::type(),
5223e519524SHoward Hinnant                typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(),
5233e519524SHoward Hinnant                typename __make_tuple_indices<0>::type(),
5243e519524SHoward Hinnant                typename __make_tuple_types<tuple, 0>::type(),
5253e519524SHoward Hinnant                __t...
5263e519524SHoward Hinnant               ) {}
5273e519524SHoward Hinnant
5283e519524SHoward Hinnant    template <class _Alloc>
529789847ddSHoward Hinnant      _LIBCPP_INLINE_VISIBILITY
5303e519524SHoward Hinnant      tuple(allocator_arg_t, const _Alloc& __a, const _Tp& ... __t)
5313e519524SHoward Hinnant        : base_(allocator_arg_t(), __a,
5323e519524SHoward Hinnant                typename __make_tuple_indices<sizeof...(_Tp)>::type(),
5333e519524SHoward Hinnant                typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(),
5343e519524SHoward Hinnant                typename __make_tuple_indices<0>::type(),
5353e519524SHoward Hinnant                typename __make_tuple_types<tuple, 0>::type(),
5363e519524SHoward Hinnant                __t...
5373e519524SHoward Hinnant               ) {}
5383e519524SHoward Hinnant
5393e519524SHoward Hinnant    template <class ..._Up,
5400527c620SHoward Hinnant              typename enable_if
5413e519524SHoward Hinnant                      <
5423e519524SHoward Hinnant                         sizeof...(_Up) <= sizeof...(_Tp) &&
5433e519524SHoward Hinnant                         __tuple_convertible
5443e519524SHoward Hinnant                         <
5453e519524SHoward Hinnant                            tuple<_Up...>,
5463e519524SHoward Hinnant                            typename __make_tuple_types<tuple,
5473e519524SHoward Hinnant                                     sizeof...(_Up) < sizeof...(_Tp) ?
5483e519524SHoward Hinnant                                        sizeof...(_Up) :
5493e519524SHoward Hinnant                                        sizeof...(_Tp)>::type
55014c5ec51SMarshall Clow                         >::value &&
55114c5ec51SMarshall Clow                         __all_default_constructible<
55214c5ec51SMarshall Clow                            typename __make_tuple_types<tuple, sizeof...(_Tp),
55314c5ec51SMarshall Clow                                sizeof...(_Up) < sizeof...(_Tp) ?
55414c5ec51SMarshall Clow                                    sizeof...(_Up) :
55514c5ec51SMarshall Clow                                    sizeof...(_Tp)>::type
5560527c620SHoward Hinnant                         >::value,
5570527c620SHoward Hinnant                         bool
5580527c620SHoward Hinnant                      >::type = false
5590527c620SHoward Hinnant             >
56075eff748SMarshall Clow        _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
5610527c620SHoward Hinnant        tuple(_Up&&... __u)
5628a9ee148SHoward Hinnant            _NOEXCEPT_((
56310a65e2eSMarshall Clow                is_nothrow_constructible<base,
5648a9ee148SHoward Hinnant                    typename __make_tuple_indices<sizeof...(_Up)>::type,
5658a9ee148SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Up)>::type,
5668a9ee148SHoward Hinnant                    typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type,
5678a9ee148SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type,
56810a65e2eSMarshall Clow                    _Up...
5698a9ee148SHoward Hinnant                >::value
5708a9ee148SHoward Hinnant            ))
5710527c620SHoward Hinnant            : base_(typename __make_tuple_indices<sizeof...(_Up)>::type(),
5720527c620SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Up)>::type(),
5730527c620SHoward Hinnant                    typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(),
5740527c620SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(),
5750527c620SHoward Hinnant                    _VSTD::forward<_Up>(__u)...) {}
5760527c620SHoward Hinnant
5770527c620SHoward Hinnant    template <class ..._Up,
5780527c620SHoward Hinnant              typename enable_if
5790527c620SHoward Hinnant                      <
5800527c620SHoward Hinnant                         sizeof...(_Up) <= sizeof...(_Tp) &&
5810527c620SHoward Hinnant                         __tuple_constructible
5820527c620SHoward Hinnant                         <
5830527c620SHoward Hinnant                            tuple<_Up...>,
5840527c620SHoward Hinnant                            typename __make_tuple_types<tuple,
5850527c620SHoward Hinnant                                     sizeof...(_Up) < sizeof...(_Tp) ?
5860527c620SHoward Hinnant                                        sizeof...(_Up) :
5870527c620SHoward Hinnant                                        sizeof...(_Tp)>::type
5880527c620SHoward Hinnant                         >::value &&
5890527c620SHoward Hinnant                         !__tuple_convertible
5900527c620SHoward Hinnant                         <
5910527c620SHoward Hinnant                            tuple<_Up...>,
5920527c620SHoward Hinnant                            typename __make_tuple_types<tuple,
5930527c620SHoward Hinnant                                     sizeof...(_Up) < sizeof...(_Tp) ?
5940527c620SHoward Hinnant                                        sizeof...(_Up) :
5950527c620SHoward Hinnant                                        sizeof...(_Tp)>::type
59614c5ec51SMarshall Clow                         >::value &&
59714c5ec51SMarshall Clow                         __all_default_constructible<
59814c5ec51SMarshall Clow                            typename __make_tuple_types<tuple, sizeof...(_Tp),
59914c5ec51SMarshall Clow                                sizeof...(_Up) < sizeof...(_Tp) ?
60014c5ec51SMarshall Clow                                    sizeof...(_Up) :
60114c5ec51SMarshall Clow                                    sizeof...(_Tp)>::type
6020527c620SHoward Hinnant                         >::value,
6030527c620SHoward Hinnant                         bool
6040527c620SHoward Hinnant                      >::type =false
6053e519524SHoward Hinnant             >
60675eff748SMarshall Clow        _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
6073e519524SHoward Hinnant        explicit
6083e519524SHoward Hinnant        tuple(_Up&&... __u)
6098a9ee148SHoward Hinnant            _NOEXCEPT_((
61010a65e2eSMarshall Clow                is_nothrow_constructible<base,
6118a9ee148SHoward Hinnant                    typename __make_tuple_indices<sizeof...(_Up)>::type,
6128a9ee148SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Up)>::type,
6138a9ee148SHoward Hinnant                    typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type,
6148a9ee148SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type,
6158a9ee148SHoward Hinnant                    _Up...
6168a9ee148SHoward Hinnant                >::value
6178a9ee148SHoward Hinnant            ))
6183e519524SHoward Hinnant            : base_(typename __make_tuple_indices<sizeof...(_Up)>::type(),
6193e519524SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Up)>::type(),
6203e519524SHoward Hinnant                    typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(),
6213e519524SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(),
622ce48a113SHoward Hinnant                    _VSTD::forward<_Up>(__u)...) {}
6233e519524SHoward Hinnant
6243e519524SHoward Hinnant    template <class _Alloc, class ..._Up,
6253e519524SHoward Hinnant              class = typename enable_if
6263e519524SHoward Hinnant                      <
6273e519524SHoward Hinnant                         sizeof...(_Up) <= sizeof...(_Tp) &&
6283e519524SHoward Hinnant                         __tuple_convertible
6293e519524SHoward Hinnant                         <
6303e519524SHoward Hinnant                            tuple<_Up...>,
6313e519524SHoward Hinnant                            typename __make_tuple_types<tuple,
6323e519524SHoward Hinnant                                     sizeof...(_Up) < sizeof...(_Tp) ?
6333e519524SHoward Hinnant                                        sizeof...(_Up) :
6343e519524SHoward Hinnant                                        sizeof...(_Tp)>::type
63514c5ec51SMarshall Clow                         >::value &&
63614c5ec51SMarshall Clow                         __all_default_constructible<
63714c5ec51SMarshall Clow                            typename __make_tuple_types<tuple, sizeof...(_Tp),
63814c5ec51SMarshall Clow                                sizeof...(_Up) < sizeof...(_Tp) ?
63914c5ec51SMarshall Clow                                    sizeof...(_Up) :
64014c5ec51SMarshall Clow                                    sizeof...(_Tp)>::type
6413e519524SHoward Hinnant                         >::value
6423e519524SHoward Hinnant                      >::type
6433e519524SHoward Hinnant             >
644789847ddSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
6453e519524SHoward Hinnant        tuple(allocator_arg_t, const _Alloc& __a, _Up&&... __u)
6463e519524SHoward Hinnant            : base_(allocator_arg_t(), __a,
6473e519524SHoward Hinnant                    typename __make_tuple_indices<sizeof...(_Up)>::type(),
6483e519524SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Up)>::type(),
6493e519524SHoward Hinnant                    typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(),
6503e519524SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(),
651ce48a113SHoward Hinnant                    _VSTD::forward<_Up>(__u)...) {}
6523e519524SHoward Hinnant
6533e519524SHoward Hinnant    template <class _Tuple,
6540527c620SHoward Hinnant              typename enable_if
6553e519524SHoward Hinnant                      <
6560527c620SHoward Hinnant                         __tuple_convertible<_Tuple, tuple>::value,
6570527c620SHoward Hinnant                         bool
6580527c620SHoward Hinnant                      >::type = false
6593e519524SHoward Hinnant             >
66075eff748SMarshall Clow        _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
6618a9ee148SHoward Hinnant        tuple(_Tuple&& __t) _NOEXCEPT_((is_nothrow_constructible<base, _Tuple>::value))
662ce48a113SHoward Hinnant            : base_(_VSTD::forward<_Tuple>(__t)) {}
6633e519524SHoward Hinnant
6640527c620SHoward Hinnant    template <class _Tuple,
6650527c620SHoward Hinnant              typename enable_if
6660527c620SHoward Hinnant                      <
6670527c620SHoward Hinnant                         __tuple_constructible<_Tuple, tuple>::value &&
6680527c620SHoward Hinnant                         !__tuple_convertible<_Tuple, tuple>::value,
6690527c620SHoward Hinnant                         bool
6700527c620SHoward Hinnant                      >::type = false
6710527c620SHoward Hinnant             >
67275eff748SMarshall Clow        _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
6730527c620SHoward Hinnant        explicit
6748a9ee148SHoward Hinnant        tuple(_Tuple&& __t) _NOEXCEPT_((is_nothrow_constructible<base, _Tuple>::value))
6750527c620SHoward Hinnant            : base_(_VSTD::forward<_Tuple>(__t)) {}
6760527c620SHoward Hinnant
6773e519524SHoward Hinnant    template <class _Alloc, class _Tuple,
6783e519524SHoward Hinnant              class = typename enable_if
6793e519524SHoward Hinnant                      <
6803e519524SHoward Hinnant                         __tuple_convertible<_Tuple, tuple>::value
6813e519524SHoward Hinnant                      >::type
6823e519524SHoward Hinnant             >
683789847ddSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
6843e519524SHoward Hinnant        tuple(allocator_arg_t, const _Alloc& __a, _Tuple&& __t)
685ce48a113SHoward Hinnant            : base_(allocator_arg_t(), __a, _VSTD::forward<_Tuple>(__t)) {}
6863e519524SHoward Hinnant
6873e519524SHoward Hinnant    template <class _Tuple,
6883e519524SHoward Hinnant              class = typename enable_if
6893e519524SHoward Hinnant                      <
6903e519524SHoward Hinnant                         __tuple_assignable<_Tuple, tuple>::value
6913e519524SHoward Hinnant                      >::type
6923e519524SHoward Hinnant             >
693789847ddSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
6943e519524SHoward Hinnant        tuple&
6958a9ee148SHoward Hinnant        operator=(_Tuple&& __t) _NOEXCEPT_((is_nothrow_assignable<base&, _Tuple>::value))
6963e519524SHoward Hinnant        {
697ce48a113SHoward Hinnant            base_.operator=(_VSTD::forward<_Tuple>(__t));
6983e519524SHoward Hinnant            return *this;
6993e519524SHoward Hinnant        }
7003e519524SHoward Hinnant
701789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
70227d0a2a7SHoward Hinnant    void swap(tuple& __t) _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value)
70327d0a2a7SHoward Hinnant        {base_.swap(__t.base_);}
7043e519524SHoward Hinnant};
7053e519524SHoward Hinnant
7063e519524SHoward Hinnanttemplate <>
707f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS_ONLY tuple<>
7083e519524SHoward Hinnant{
7093e519524SHoward Hinnantpublic:
710789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
711a0f4c45cSHoward Hinnant    _LIBCPP_CONSTEXPR tuple() _NOEXCEPT {}
7123e519524SHoward Hinnant    template <class _Alloc>
713789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7148a9ee148SHoward Hinnant        tuple(allocator_arg_t, const _Alloc&) _NOEXCEPT {}
7153e519524SHoward Hinnant    template <class _Alloc>
716789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7178a9ee148SHoward Hinnant        tuple(allocator_arg_t, const _Alloc&, const tuple&) _NOEXCEPT {}
718c003db1fSHoward Hinnant    template <class _Up>
719789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7208a9ee148SHoward Hinnant        tuple(array<_Up, 0>) _NOEXCEPT {}
721c003db1fSHoward Hinnant    template <class _Alloc, class _Up>
722789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7238a9ee148SHoward Hinnant        tuple(allocator_arg_t, const _Alloc&, array<_Up, 0>) _NOEXCEPT {}
724789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
72527d0a2a7SHoward Hinnant    void swap(tuple&) _NOEXCEPT {}
7263e519524SHoward Hinnant};
7273e519524SHoward Hinnant
7283e519524SHoward Hinnanttemplate <class ..._Tp>
7293e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
730bc95cf0dSHoward Hinnanttypename enable_if
731bc95cf0dSHoward Hinnant<
732bc95cf0dSHoward Hinnant    __all<__is_swappable<_Tp>::value...>::value,
7333e519524SHoward Hinnant    void
734bc95cf0dSHoward Hinnant>::type
73527d0a2a7SHoward Hinnantswap(tuple<_Tp...>& __t, tuple<_Tp...>& __u)
73627d0a2a7SHoward Hinnant                 _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value)
73727d0a2a7SHoward Hinnant    {__t.swap(__u);}
7383e519524SHoward Hinnant
7393e519524SHoward Hinnant// get
7403e519524SHoward Hinnant
7413e519524SHoward Hinnanttemplate <size_t _Ip, class ..._Tp>
7428bf1f08aSMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
7433e519524SHoward Hinnanttypename tuple_element<_Ip, tuple<_Tp...> >::type&
744c206366fSHoward Hinnantget(tuple<_Tp...>& __t) _NOEXCEPT
7453e519524SHoward Hinnant{
7463e519524SHoward Hinnant    typedef typename tuple_element<_Ip, tuple<_Tp...> >::type type;
7473e519524SHoward Hinnant    return static_cast<__tuple_leaf<_Ip, type>&>(__t.base_).get();
7483e519524SHoward Hinnant}
7493e519524SHoward Hinnant
7503e519524SHoward Hinnanttemplate <size_t _Ip, class ..._Tp>
7518bf1f08aSMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
7523e519524SHoward Hinnantconst typename tuple_element<_Ip, tuple<_Tp...> >::type&
753c206366fSHoward Hinnantget(const tuple<_Tp...>& __t) _NOEXCEPT
7543e519524SHoward Hinnant{
7553e519524SHoward Hinnant    typedef typename tuple_element<_Ip, tuple<_Tp...> >::type type;
7563e519524SHoward Hinnant    return static_cast<const __tuple_leaf<_Ip, type>&>(__t.base_).get();
7573e519524SHoward Hinnant}
7583e519524SHoward Hinnant
759601afb30SHoward Hinnanttemplate <size_t _Ip, class ..._Tp>
7608bf1f08aSMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
761601afb30SHoward Hinnanttypename tuple_element<_Ip, tuple<_Tp...> >::type&&
762c206366fSHoward Hinnantget(tuple<_Tp...>&& __t) _NOEXCEPT
763601afb30SHoward Hinnant{
764601afb30SHoward Hinnant    typedef typename tuple_element<_Ip, tuple<_Tp...> >::type type;
7652a3f1bc1SHoward Hinnant    return static_cast<type&&>(
766912e161cSDouglas Gregor             static_cast<__tuple_leaf<_Ip, type>&&>(__t.base_).get());
767601afb30SHoward Hinnant}
768601afb30SHoward Hinnant
769e99520c7SMarshall Clow#if _LIBCPP_STD_VER > 11
770e99520c7SMarshall Clow// get by type
771e99520c7SMarshall Clowtemplate <typename _T1, size_t _Idx, typename... _Args>
772e99520c7SMarshall Clowstruct __find_exactly_one_t_helper;
773e99520c7SMarshall Clow
774e99520c7SMarshall Clow// -- find exactly one
775e99520c7SMarshall Clowtemplate <typename _T1, size_t _Idx, typename... _Args>
776e99520c7SMarshall Clowstruct __find_exactly_one_t_checker {
777e99520c7SMarshall Clow    static constexpr size_t value = _Idx;
778e99520c7SMarshall Clow//  Check the rest of the list to make sure there's only one
779e99520c7SMarshall Clow    static_assert ( __find_exactly_one_t_helper<_T1, 0, _Args...>::value == -1, "type can only occur once in type list" );
780e99520c7SMarshall Clow    };
781e99520c7SMarshall Clow
782e99520c7SMarshall Clow
783e99520c7SMarshall Clowtemplate <typename _T1, size_t _Idx>
784e99520c7SMarshall Clowstruct __find_exactly_one_t_helper <_T1, _Idx> {
785e99520c7SMarshall Clow    static constexpr size_t value = -1;
786e99520c7SMarshall Clow    };
787e99520c7SMarshall Clow
788e99520c7SMarshall Clowtemplate <typename _T1, size_t _Idx, typename _Head, typename... _Args>
789e99520c7SMarshall Clowstruct __find_exactly_one_t_helper <_T1, _Idx, _Head, _Args...> {
790e99520c7SMarshall Clow    static constexpr size_t value =
791e99520c7SMarshall Clow        std::conditional<
792e99520c7SMarshall Clow            std::is_same<_T1, _Head>::value,
793ad864049SMarshall Clow            __find_exactly_one_t_checker<_T1, _Idx,   _Args...>,
794e99520c7SMarshall Clow            __find_exactly_one_t_helper <_T1, _Idx+1, _Args...>
795e99520c7SMarshall Clow        >::type::value;
796e99520c7SMarshall Clow    };
797e99520c7SMarshall Clow
798e99520c7SMarshall Clowtemplate <typename _T1, typename... _Args>
799e99520c7SMarshall Clowstruct __find_exactly_one_t {
800e99520c7SMarshall Clow    static constexpr size_t value = __find_exactly_one_t_helper<_T1, 0, _Args...>::value;
801e99520c7SMarshall Clow    static_assert ( value != -1, "type not found in type list" );
802e99520c7SMarshall Clow    };
803e99520c7SMarshall Clow
804e99520c7SMarshall Clowtemplate <class _T1, class... _Args>
805e99520c7SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
806e99520c7SMarshall Clowconstexpr _T1& get(tuple<_Args...>& __tup) noexcept
807e99520c7SMarshall Clow{
808e99520c7SMarshall Clow    return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(__tup);
809e99520c7SMarshall Clow}
810e99520c7SMarshall Clow
811e99520c7SMarshall Clowtemplate <class _T1, class... _Args>
812e99520c7SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
813e99520c7SMarshall Clowconstexpr _T1 const& get(tuple<_Args...> const& __tup) noexcept
814e99520c7SMarshall Clow{
815e99520c7SMarshall Clow    return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(__tup);
816e99520c7SMarshall Clow}
817e99520c7SMarshall Clow
818e99520c7SMarshall Clowtemplate <class _T1, class... _Args>
819e99520c7SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
820e99520c7SMarshall Clowconstexpr _T1&& get(tuple<_Args...>&& __tup) noexcept
821e99520c7SMarshall Clow{
8221c682f0fSMarshall Clow    return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(_VSTD::move(__tup));
823e99520c7SMarshall Clow}
824e99520c7SMarshall Clow
825e99520c7SMarshall Clow#endif
826e99520c7SMarshall Clow
8273e519524SHoward Hinnant// tie
8283e519524SHoward Hinnant
8293e519524SHoward Hinnanttemplate <class ..._Tp>
8300d1560e1SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
8313e519524SHoward Hinnanttuple<_Tp&...>
8328a9ee148SHoward Hinnanttie(_Tp&... __t) _NOEXCEPT
8333e519524SHoward Hinnant{
8343e519524SHoward Hinnant    return tuple<_Tp&...>(__t...);
8353e519524SHoward Hinnant}
8363e519524SHoward Hinnant
8373e519524SHoward Hinnanttemplate <class _Up>
8383e519524SHoward Hinnantstruct __ignore_t
8393e519524SHoward Hinnant{
8403e519524SHoward Hinnant    template <class _Tp>
841789847ddSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
8423e519524SHoward Hinnant        const __ignore_t& operator=(_Tp&&) const {return *this;}
8433e519524SHoward Hinnant};
8443e519524SHoward Hinnant
8453e519524SHoward Hinnantnamespace { const __ignore_t<unsigned char> ignore = __ignore_t<unsigned char>(); }
8463e519524SHoward Hinnant
8473e519524SHoward Hinnanttemplate <class _Tp>
8480724bf67SMarshall Clowstruct __make_tuple_return_impl
8493e519524SHoward Hinnant{
8503e519524SHoward Hinnant    typedef _Tp type;
8513e519524SHoward Hinnant};
8523e519524SHoward Hinnant
8533e519524SHoward Hinnanttemplate <class _Tp>
8540724bf67SMarshall Clowstruct __make_tuple_return_impl<reference_wrapper<_Tp> >
8553e519524SHoward Hinnant{
8563e519524SHoward Hinnant    typedef _Tp& type;
8573e519524SHoward Hinnant};
8583e519524SHoward Hinnant
8593e519524SHoward Hinnanttemplate <class _Tp>
8603e519524SHoward Hinnantstruct __make_tuple_return
8613e519524SHoward Hinnant{
8620724bf67SMarshall Clow    typedef typename __make_tuple_return_impl<typename decay<_Tp>::type>::type type;
8633e519524SHoward Hinnant};
8643e519524SHoward Hinnant
8653e519524SHoward Hinnanttemplate <class... _Tp>
86675eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
8673e519524SHoward Hinnanttuple<typename __make_tuple_return<_Tp>::type...>
8683e519524SHoward Hinnantmake_tuple(_Tp&&... __t)
8693e519524SHoward Hinnant{
870ce48a113SHoward Hinnant    return tuple<typename __make_tuple_return<_Tp>::type...>(_VSTD::forward<_Tp>(__t)...);
8713e519524SHoward Hinnant}
8723e519524SHoward Hinnant
8731102fbbdSHoward Hinnanttemplate <class... _Tp>
87475eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
87575eff748SMarshall Clowtuple<_Tp&&...>
8768a9ee148SHoward Hinnantforward_as_tuple(_Tp&&... __t) _NOEXCEPT
8771102fbbdSHoward Hinnant{
878ce48a113SHoward Hinnant    return tuple<_Tp&&...>(_VSTD::forward<_Tp>(__t)...);
8791102fbbdSHoward Hinnant}
8801102fbbdSHoward Hinnant
881c003db1fSHoward Hinnanttemplate <size_t _Ip>
8823e519524SHoward Hinnantstruct __tuple_equal
8833e519524SHoward Hinnant{
8843e519524SHoward Hinnant    template <class _Tp, class _Up>
88575eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
8863e519524SHoward Hinnant    bool operator()(const _Tp& __x, const _Up& __y)
8873e519524SHoward Hinnant    {
888f9af6140SMarshall Clow        return __tuple_equal<_Ip - 1>()(__x, __y) && _VSTD::get<_Ip-1>(__x) == _VSTD::get<_Ip-1>(__y);
8893e519524SHoward Hinnant    }
8903e519524SHoward Hinnant};
8913e519524SHoward Hinnant
8923e519524SHoward Hinnanttemplate <>
8933e519524SHoward Hinnantstruct __tuple_equal<0>
8943e519524SHoward Hinnant{
8953e519524SHoward Hinnant    template <class _Tp, class _Up>
89675eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
8973e519524SHoward Hinnant    bool operator()(const _Tp&, const _Up&)
8983e519524SHoward Hinnant    {
8993e519524SHoward Hinnant        return true;
9003e519524SHoward Hinnant    }
9013e519524SHoward Hinnant};
9023e519524SHoward Hinnant
9033e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up>
90475eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
9053e519524SHoward Hinnantbool
9063e519524SHoward Hinnantoperator==(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
9073e519524SHoward Hinnant{
9083e519524SHoward Hinnant    return __tuple_equal<sizeof...(_Tp)>()(__x, __y);
9093e519524SHoward Hinnant}
9103e519524SHoward Hinnant
9113e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up>
91275eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
9133e519524SHoward Hinnantbool
9143e519524SHoward Hinnantoperator!=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
9153e519524SHoward Hinnant{
9163e519524SHoward Hinnant    return !(__x == __y);
9173e519524SHoward Hinnant}
9183e519524SHoward Hinnant
919c003db1fSHoward Hinnanttemplate <size_t _Ip>
9203e519524SHoward Hinnantstruct __tuple_less
9213e519524SHoward Hinnant{
9223e519524SHoward Hinnant    template <class _Tp, class _Up>
92375eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
9243e519524SHoward Hinnant    bool operator()(const _Tp& __x, const _Up& __y)
9253e519524SHoward Hinnant    {
92653afae49SDuncan P. N. Exon Smith        const size_t __idx = tuple_size<_Tp>::value - _Ip;
92753afae49SDuncan P. N. Exon Smith        if (_VSTD::get<__idx>(__x) < _VSTD::get<__idx>(__y))
92853afae49SDuncan P. N. Exon Smith            return true;
92953afae49SDuncan P. N. Exon Smith        if (_VSTD::get<__idx>(__y) < _VSTD::get<__idx>(__x))
93053afae49SDuncan P. N. Exon Smith            return false;
93153afae49SDuncan P. N. Exon Smith        return __tuple_less<_Ip-1>()(__x, __y);
9323e519524SHoward Hinnant    }
9333e519524SHoward Hinnant};
9343e519524SHoward Hinnant
9353e519524SHoward Hinnanttemplate <>
9363e519524SHoward Hinnantstruct __tuple_less<0>
9373e519524SHoward Hinnant{
9383e519524SHoward Hinnant    template <class _Tp, class _Up>
93975eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
9403e519524SHoward Hinnant    bool operator()(const _Tp&, const _Up&)
9413e519524SHoward Hinnant    {
9423e519524SHoward Hinnant        return false;
9433e519524SHoward Hinnant    }
9443e519524SHoward Hinnant};
9453e519524SHoward Hinnant
9463e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up>
94775eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
9483e519524SHoward Hinnantbool
9493e519524SHoward Hinnantoperator<(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
9503e519524SHoward Hinnant{
9513e519524SHoward Hinnant    return __tuple_less<sizeof...(_Tp)>()(__x, __y);
9523e519524SHoward Hinnant}
9533e519524SHoward Hinnant
9543e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up>
95575eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
9563e519524SHoward Hinnantbool
9573e519524SHoward Hinnantoperator>(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
9583e519524SHoward Hinnant{
9593e519524SHoward Hinnant    return __y < __x;
9603e519524SHoward Hinnant}
9613e519524SHoward Hinnant
9623e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up>
96375eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
9643e519524SHoward Hinnantbool
9653e519524SHoward Hinnantoperator>=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
9663e519524SHoward Hinnant{
9673e519524SHoward Hinnant    return !(__x < __y);
9683e519524SHoward Hinnant}
9693e519524SHoward Hinnant
9703e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up>
97175eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
9723e519524SHoward Hinnantbool
9733e519524SHoward Hinnantoperator<=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
9743e519524SHoward Hinnant{
9753e519524SHoward Hinnant    return !(__y < __x);
9763e519524SHoward Hinnant}
9773e519524SHoward Hinnant
9783e519524SHoward Hinnant// tuple_cat
9793e519524SHoward Hinnant
9807f64810bSHoward Hinnanttemplate <class _Tp, class _Up> struct __tuple_cat_type;
9817f64810bSHoward Hinnant
9827f64810bSHoward Hinnanttemplate <class ..._Ttypes, class ..._Utypes>
9837f64810bSHoward Hinnantstruct __tuple_cat_type<tuple<_Ttypes...>, __tuple_types<_Utypes...> >
9843e519524SHoward Hinnant{
9857f64810bSHoward Hinnant    typedef tuple<_Ttypes..., _Utypes...> type;
9867f64810bSHoward Hinnant};
9877f64810bSHoward Hinnant
9887f64810bSHoward Hinnanttemplate <class _ResultTuple, bool _Is_Tuple0TupleLike, class ..._Tuples>
9897f64810bSHoward Hinnantstruct __tuple_cat_return_1
9907f64810bSHoward Hinnant{
9917f64810bSHoward Hinnant};
9927f64810bSHoward Hinnant
9937f64810bSHoward Hinnanttemplate <class ..._Types, class _Tuple0>
9947f64810bSHoward Hinnantstruct __tuple_cat_return_1<tuple<_Types...>, true, _Tuple0>
9957f64810bSHoward Hinnant{
9967f64810bSHoward Hinnant    typedef typename __tuple_cat_type<tuple<_Types...>,
9977f64810bSHoward Hinnant            typename __make_tuple_types<typename remove_reference<_Tuple0>::type>::type>::type
9987f64810bSHoward Hinnant                                                                           type;
9997f64810bSHoward Hinnant};
10007f64810bSHoward Hinnant
10017f64810bSHoward Hinnanttemplate <class ..._Types, class _Tuple0, class _Tuple1, class ..._Tuples>
10027f64810bSHoward Hinnantstruct __tuple_cat_return_1<tuple<_Types...>, true, _Tuple0, _Tuple1, _Tuples...>
10037f64810bSHoward Hinnant    : public __tuple_cat_return_1<
10047f64810bSHoward Hinnant                 typename __tuple_cat_type<
10057f64810bSHoward Hinnant                     tuple<_Types...>,
10067f64810bSHoward Hinnant                     typename __make_tuple_types<typename remove_reference<_Tuple0>::type>::type
10077f64810bSHoward Hinnant                 >::type,
10087f64810bSHoward Hinnant                 __tuple_like<typename remove_reference<_Tuple1>::type>::value,
10097f64810bSHoward Hinnant                 _Tuple1, _Tuples...>
10107f64810bSHoward Hinnant{
10117f64810bSHoward Hinnant};
10127f64810bSHoward Hinnant
10137f64810bSHoward Hinnanttemplate <class ..._Tuples> struct __tuple_cat_return;
10147f64810bSHoward Hinnant
10157f64810bSHoward Hinnanttemplate <class _Tuple0, class ..._Tuples>
10167f64810bSHoward Hinnantstruct __tuple_cat_return<_Tuple0, _Tuples...>
10177f64810bSHoward Hinnant    : public __tuple_cat_return_1<tuple<>,
10187f64810bSHoward Hinnant         __tuple_like<typename remove_reference<_Tuple0>::type>::value, _Tuple0,
10197f64810bSHoward Hinnant                                                                     _Tuples...>
10207f64810bSHoward Hinnant{
10217f64810bSHoward Hinnant};
10227f64810bSHoward Hinnant
10237f64810bSHoward Hinnanttemplate <>
10247f64810bSHoward Hinnantstruct __tuple_cat_return<>
10257f64810bSHoward Hinnant{
10267f64810bSHoward Hinnant    typedef tuple<> type;
10277f64810bSHoward Hinnant};
10287f64810bSHoward Hinnant
102975eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
10307f64810bSHoward Hinnanttuple<>
10317f64810bSHoward Hinnanttuple_cat()
10327f64810bSHoward Hinnant{
10337f64810bSHoward Hinnant    return tuple<>();
10343e519524SHoward Hinnant}
10353e519524SHoward Hinnant
1036c003db1fSHoward Hinnanttemplate <class _Rp, class _Indices, class _Tuple0, class ..._Tuples>
1037ba31cbdbSHoward Hinnantstruct __tuple_cat_return_ref_imp;
10383e519524SHoward Hinnant
1039ba31cbdbSHoward Hinnanttemplate <class ..._Types, size_t ..._I0, class _Tuple0>
1040ba31cbdbSHoward Hinnantstruct __tuple_cat_return_ref_imp<tuple<_Types...>, __tuple_indices<_I0...>, _Tuple0>
10413e519524SHoward Hinnant{
10427f64810bSHoward Hinnant    typedef typename remove_reference<_Tuple0>::type _T0;
1043ba31cbdbSHoward Hinnant    typedef tuple<_Types..., typename __apply_cv<_Tuple0,
1044ba31cbdbSHoward Hinnant                          typename tuple_element<_I0, _T0>::type>::type&&...> type;
1045ba31cbdbSHoward Hinnant};
1046ba31cbdbSHoward Hinnant
1047ba31cbdbSHoward Hinnanttemplate <class ..._Types, size_t ..._I0, class _Tuple0, class _Tuple1, class ..._Tuples>
1048ba31cbdbSHoward Hinnantstruct __tuple_cat_return_ref_imp<tuple<_Types...>, __tuple_indices<_I0...>,
1049ba31cbdbSHoward Hinnant                                  _Tuple0, _Tuple1, _Tuples...>
1050ba31cbdbSHoward Hinnant    : public __tuple_cat_return_ref_imp<
1051ba31cbdbSHoward Hinnant         tuple<_Types..., typename __apply_cv<_Tuple0,
1052ba31cbdbSHoward Hinnant               typename tuple_element<_I0,
1053ba31cbdbSHoward Hinnant                  typename remove_reference<_Tuple0>::type>::type>::type&&...>,
1054ba31cbdbSHoward Hinnant         typename __make_tuple_indices<tuple_size<typename
1055ba31cbdbSHoward Hinnant                                 remove_reference<_Tuple1>::type>::value>::type,
1056ba31cbdbSHoward Hinnant         _Tuple1, _Tuples...>
1057ba31cbdbSHoward Hinnant{
1058ba31cbdbSHoward Hinnant};
1059ba31cbdbSHoward Hinnant
1060ba31cbdbSHoward Hinnanttemplate <class _Tuple0, class ..._Tuples>
1061ba31cbdbSHoward Hinnantstruct __tuple_cat_return_ref
1062ba31cbdbSHoward Hinnant    : public __tuple_cat_return_ref_imp<tuple<>,
1063ba31cbdbSHoward Hinnant               typename __make_tuple_indices<
1064ba31cbdbSHoward Hinnant                        tuple_size<typename remove_reference<_Tuple0>::type>::value
1065ba31cbdbSHoward Hinnant               >::type, _Tuple0, _Tuples...>
1066ba31cbdbSHoward Hinnant{
1067ba31cbdbSHoward Hinnant};
1068ba31cbdbSHoward Hinnant
1069ba31cbdbSHoward Hinnanttemplate <class _Types, class _I0, class _J0>
1070ba31cbdbSHoward Hinnantstruct __tuple_cat;
1071ba31cbdbSHoward Hinnant
1072ba31cbdbSHoward Hinnanttemplate <class ..._Types, size_t ..._I0, size_t ..._J0>
1073ba31cbdbSHoward Hinnantstruct __tuple_cat<tuple<_Types...>, __tuple_indices<_I0...>, __tuple_indices<_J0...> >
1074ba31cbdbSHoward Hinnant{
1075ba31cbdbSHoward Hinnant    template <class _Tuple0>
107675eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
1077ba31cbdbSHoward Hinnant    typename __tuple_cat_return_ref<tuple<_Types...>&&, _Tuple0&&>::type
1078ba31cbdbSHoward Hinnant    operator()(tuple<_Types...> __t, _Tuple0&& __t0)
1079ba31cbdbSHoward Hinnant    {
1080f9af6140SMarshall Clow        return forward_as_tuple(_VSTD::forward<_Types>(_VSTD::get<_I0>(__t))...,
1081f9af6140SMarshall Clow                                      _VSTD::get<_J0>(_VSTD::forward<_Tuple0>(__t0))...);
10823e519524SHoward Hinnant    }
10833e519524SHoward Hinnant
10847f64810bSHoward Hinnant    template <class _Tuple0, class _Tuple1, class ..._Tuples>
108575eff748SMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
1086ba31cbdbSHoward Hinnant    typename __tuple_cat_return_ref<tuple<_Types...>&&, _Tuple0&&, _Tuple1&&, _Tuples&&...>::type
1087ba31cbdbSHoward Hinnant    operator()(tuple<_Types...> __t, _Tuple0&& __t0, _Tuple1&& __t1, _Tuples&& ...__tpls)
10883e519524SHoward Hinnant    {
1089ba31cbdbSHoward Hinnant        typedef typename remove_reference<_Tuple0>::type _T0;
1090ba31cbdbSHoward Hinnant        typedef typename remove_reference<_Tuple1>::type _T1;
1091ba31cbdbSHoward Hinnant        return __tuple_cat<
1092ba31cbdbSHoward Hinnant           tuple<_Types..., typename __apply_cv<_Tuple0, typename tuple_element<_J0, _T0>::type>::type&&...>,
1093ba31cbdbSHoward Hinnant           typename __make_tuple_indices<sizeof ...(_Types) + tuple_size<_T0>::value>::type,
1094ba31cbdbSHoward Hinnant           typename __make_tuple_indices<tuple_size<_T1>::value>::type>()
1095de9320aaSMarshall Clow                           (forward_as_tuple(
1096f9af6140SMarshall Clow                              _VSTD::forward<_Types>(_VSTD::get<_I0>(__t))...,
1097f9af6140SMarshall Clow                              _VSTD::get<_J0>(_VSTD::forward<_Tuple0>(__t0))...
1098ba31cbdbSHoward Hinnant                            ),
1099ce48a113SHoward Hinnant                            _VSTD::forward<_Tuple1>(__t1),
1100ce48a113SHoward Hinnant                            _VSTD::forward<_Tuples>(__tpls)...);
1101ba31cbdbSHoward Hinnant    }
1102ba31cbdbSHoward Hinnant};
1103ba31cbdbSHoward Hinnant
1104ba31cbdbSHoward Hinnanttemplate <class _Tuple0, class... _Tuples>
110575eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
1106ba31cbdbSHoward Hinnanttypename __tuple_cat_return<_Tuple0, _Tuples...>::type
1107ba31cbdbSHoward Hinnanttuple_cat(_Tuple0&& __t0, _Tuples&&... __tpls)
1108ba31cbdbSHoward Hinnant{
1109ba31cbdbSHoward Hinnant    typedef typename remove_reference<_Tuple0>::type _T0;
1110ba31cbdbSHoward Hinnant    return __tuple_cat<tuple<>, __tuple_indices<>,
1111ba31cbdbSHoward Hinnant                  typename __make_tuple_indices<tuple_size<_T0>::value>::type>()
1112ce48a113SHoward Hinnant                  (tuple<>(), _VSTD::forward<_Tuple0>(__t0),
1113ce48a113SHoward Hinnant                                            _VSTD::forward<_Tuples>(__tpls)...);
11143e519524SHoward Hinnant}
11153e519524SHoward Hinnant
11163e519524SHoward Hinnanttemplate <class ..._Tp, class _Alloc>
1117f0544c20SHoward Hinnantstruct _LIBCPP_TYPE_VIS_ONLY uses_allocator<tuple<_Tp...>, _Alloc>
11183e519524SHoward Hinnant    : true_type {};
11193e519524SHoward Hinnant
11203e519524SHoward Hinnanttemplate <class _T1, class _T2>
11213e519524SHoward Hinnanttemplate <class... _Args1, class... _Args2, size_t ..._I1, size_t ..._I2>
11223e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
11233e519524SHoward Hinnantpair<_T1, _T2>::pair(piecewise_construct_t,
11243e519524SHoward Hinnant                     tuple<_Args1...>& __first_args, tuple<_Args2...>& __second_args,
11253e519524SHoward Hinnant                     __tuple_indices<_I1...>, __tuple_indices<_I2...>)
1126f9af6140SMarshall Clow    :  first(_VSTD::forward<_Args1>(_VSTD::get<_I1>( __first_args))...),
1127f9af6140SMarshall Clow      second(_VSTD::forward<_Args2>(_VSTD::get<_I2>(__second_args))...)
11283e519524SHoward Hinnant{
11293e519524SHoward Hinnant}
11303e519524SHoward Hinnant
1131b3371f6fSHoward Hinnant#endif  // _LIBCPP_HAS_NO_VARIADICS
11323e519524SHoward Hinnant
11333e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
11343e519524SHoward Hinnant
11353e519524SHoward Hinnant#endif  // _LIBCPP_TUPLE
1136