xref: /llvm-project-15.0.7/libcxx/include/tuple (revision 1102fbbd)
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();
243e519524SHoward Hinnant    explicit tuple(const T&...);
253e519524SHoward Hinnant    template <class... U>
263e519524SHoward Hinnant        explicit tuple(U&&...);
273e519524SHoward Hinnant    tuple(const tuple&) = default;
283e519524SHoward Hinnant    tuple(tuple&&);
293e519524SHoward Hinnant    template <class... U>
303e519524SHoward Hinnant        tuple(const tuple<U...>&);
313e519524SHoward Hinnant    template <class... U>
323e519524SHoward Hinnant        tuple(tuple<U...>&&);
333e519524SHoward Hinnant    template <class U1, class U2>
343e519524SHoward Hinnant        tuple(const pair<U1, U2>&); // iff sizeof...(T) == 2
353e519524SHoward Hinnant    template <class U1, class U2>
363e519524SHoward Hinnant        tuple(pair<U1, U2>&&); // iff sizeof...(T) == 2
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&);
593e519524SHoward Hinnant    tuple& operator=(tuple&&);
603e519524SHoward Hinnant    template <class... U>
613e519524SHoward Hinnant        tuple& operator=(const tuple<U...>&);
623e519524SHoward Hinnant    template <class... U>
633e519524SHoward Hinnant        tuple& operator=(tuple<U...>&&);
643e519524SHoward Hinnant    template <class U1, class U2>
653e519524SHoward Hinnant        tuple& operator=(const pair<U1, U2>&); // iff sizeof...(T) == 2
663e519524SHoward Hinnant    template <class U1, class U2>
673e519524SHoward Hinnant        tuple& operator=(pair<U1, U2>&&); //iffsizeof...(T) == 2
683e519524SHoward Hinnant
693e519524SHoward Hinnant    void swap(tuple&);
703e519524SHoward Hinnant};
713e519524SHoward Hinnant
723e519524SHoward Hinnantconst unspecified ignore;
733e519524SHoward Hinnant
743e519524SHoward Hinnanttemplate <class... T> tuple<V...>  make_tuple(T&&...);
75*1102fbbdSHoward Hinnanttemplate <class... T> tuple<ATypes...> forward_as_tuple(T&&...);
763e519524SHoward Hinnanttemplate <class... T> tuple<T&...> tie(T&...);
773e519524SHoward Hinnanttemplate <class... T, class... U> tuple<T..., U...> tuple_cat(const tuple<T...>&, const tuple<U...>&);
783e519524SHoward Hinnanttemplate <class... T, class... U> tuple<T..., U...> tuple_cat(tuple<T...>&&, const tuple<U...>&);
793e519524SHoward Hinnanttemplate <class... T, class... U> tuple<T..., U...> tuple_cat(const tuple<T...>&, tuple<U...>&&);
803e519524SHoward Hinnanttemplate <class... T, class... U> tuple<T..., U...> tuple_cat(tuple<T...>&&, tuple<U...>&&);
813e519524SHoward Hinnant
823e519524SHoward Hinnant// 20.4.1.4, tuple helper classes:
833e519524SHoward Hinnanttemplate <class T> class tuple_size; // undefined
843e519524SHoward Hinnanttemplate <class... T> class tuple_size<tuple<T...>>;
853e519524SHoward Hinnanttemplate <intsize_t I, class T> class tuple_element; // undefined
863e519524SHoward Hinnanttemplate <intsize_t I, class... T> class tuple_element<I, tuple<T...>>;
873e519524SHoward Hinnant
883e519524SHoward Hinnant// 20.4.1.5, element access:
893e519524SHoward Hinnanttemplate <intsize_t I, class... T> typename tuple_element<I, tuple<T...>>::type& get(tuple<T...>&);
903e519524SHoward Hinnanttemplate <intsize_t I, class... T> typename tuple_element<I, tuple<T...>>::type const& get(const tuple<T...>&);
913e519524SHoward Hinnant
923e519524SHoward Hinnant// 20.4.1.6, relational operators:
933e519524SHoward Hinnanttemplate<class... T, class... U> bool operator==(const tuple<T...>&, const tuple<U...>&);
943e519524SHoward Hinnanttemplate<class... T, class... U> bool operator<(const tuple<T...>&, const tuple<U...>&);
953e519524SHoward Hinnanttemplate<class... T, class... U> bool operator!=(const tuple<T...>&, const tuple<U...>&);
963e519524SHoward Hinnanttemplate<class... T, class... U> bool operator>(const tuple<T...>&, const tuple<U...>&);
973e519524SHoward Hinnanttemplate<class... T, class... U> bool operator<=(const tuple<T...>&, const tuple<U...>&);
983e519524SHoward Hinnanttemplate<class... T, class... U> bool operator>=(const tuple<T...>&, const tuple<U...>&);
993e519524SHoward Hinnant
1003e519524SHoward Hinnanttemplate <class... Types, class Alloc>
1013e519524SHoward Hinnant  struct uses_allocator<tuple<Types...>, Alloc>;
1023e519524SHoward Hinnant
1033e519524SHoward Hinnanttemplate <class... Types>
1043e519524SHoward Hinnant  void swap(tuple<Types...>& x, tuple<Types...>& y);
1053e519524SHoward Hinnant
1063e519524SHoward Hinnanttemplate <class InputIterator>
1073e519524SHoward Hinnant  InputIterator begin(const std::tuple<InputIterator, InputIterator>& t);
1083e519524SHoward Hinnant
1093e519524SHoward Hinnanttemplate <class InputIterator>
1103e519524SHoward Hinnant  InputIterator end(const std::tuple<InputIterator, InputIterator>& t);
1113e519524SHoward Hinnant
1123e519524SHoward Hinnant}  // std
1133e519524SHoward Hinnant
1143e519524SHoward Hinnant*/
1153e519524SHoward Hinnant
1163e519524SHoward Hinnant#include <__config>
1173e519524SHoward Hinnant#include <__tuple>
1183e519524SHoward Hinnant#include <cstddef>
1193e519524SHoward Hinnant#include <memory>
1203e519524SHoward Hinnant#include <type_traits>
1213e519524SHoward Hinnant
1223e519524SHoward Hinnant#pragma GCC system_header
1233e519524SHoward Hinnant
1243e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
1253e519524SHoward Hinnant
1263e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS
1273e519524SHoward Hinnant
1283e519524SHoward Hinnant// tuple_size
1293e519524SHoward Hinnant
1303e519524SHoward Hinnanttemplate <class ..._Tp>
1313e519524SHoward Hinnantclass tuple_size<tuple<_Tp...>>
1323e519524SHoward Hinnant    : public integral_constant<size_t, sizeof...(_Tp)>
1333e519524SHoward Hinnant{
1343e519524SHoward Hinnant};
1353e519524SHoward Hinnant
1363e519524SHoward Hinnanttemplate <class ..._Tp>
1373e519524SHoward Hinnantclass tuple_size<const tuple<_Tp...>>
1383e519524SHoward Hinnant    : public integral_constant<size_t, sizeof...(_Tp)>
1393e519524SHoward Hinnant{
1403e519524SHoward Hinnant};
1413e519524SHoward Hinnant
1423e519524SHoward Hinnant// tuple_element
1433e519524SHoward Hinnant
1443e519524SHoward Hinnanttemplate <size_t _Ip, class ..._Tp>
1453e519524SHoward Hinnantclass tuple_element<_Ip, tuple<_Tp...>>
1463e519524SHoward Hinnant{
1473e519524SHoward Hinnantpublic:
1483e519524SHoward Hinnant    typedef typename tuple_element<_Ip, __tuple_types<_Tp...>>::type type;
1493e519524SHoward Hinnant};
1503e519524SHoward Hinnant
1513e519524SHoward Hinnanttemplate <size_t _Ip, class ..._Tp>
1523e519524SHoward Hinnantclass tuple_element<_Ip, const tuple<_Tp...>>
1533e519524SHoward Hinnant{
1543e519524SHoward Hinnantpublic:
1553e519524SHoward Hinnant    typedef const typename tuple_element<_Ip, __tuple_types<_Tp...>>::type type;
1563e519524SHoward Hinnant};
1573e519524SHoward Hinnant
1583e519524SHoward Hinnant// __tuple_leaf
1593e519524SHoward Hinnant
1603e519524SHoward Hinnanttemplate <size_t _Ip, class _Hp, bool=is_empty<_Hp>::value>
1613e519524SHoward Hinnantclass __tuple_leaf;
1623e519524SHoward Hinnant
1633e519524SHoward Hinnanttemplate <size_t _Ip, class _Hp, bool _Ep>
1643e519524SHoward Hinnantinline
1653e519524SHoward Hinnantvoid swap(__tuple_leaf<_Ip, _Hp, _Ep>& __x, __tuple_leaf<_Ip, _Hp, _Ep>& __y)
1663e519524SHoward Hinnant{
1673e519524SHoward Hinnant    swap(__x.get(), __y.get());
1683e519524SHoward Hinnant}
1693e519524SHoward Hinnant
1703e519524SHoward Hinnanttemplate <size_t _Ip, class _Hp, bool>
1713e519524SHoward Hinnantclass __tuple_leaf
1723e519524SHoward Hinnant{
1733e519524SHoward Hinnant    _Hp value;
1743e519524SHoward Hinnant
1753e519524SHoward Hinnant    __tuple_leaf& operator=(const __tuple_leaf&);
1763e519524SHoward Hinnantpublic:
1773e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __tuple_leaf() : value()
1783e519524SHoward Hinnant       {static_assert(!is_reference<_Hp>::value,
1793e519524SHoward Hinnant              "Attempted to default construct a reference element in a tuple");}
1803e519524SHoward Hinnant
1813e519524SHoward Hinnant    template <class _Alloc>
1823e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1833e519524SHoward Hinnant        __tuple_leaf(integral_constant<int, 0>, const _Alloc&)
1843e519524SHoward Hinnant            : value()
1853e519524SHoward Hinnant        {static_assert(!is_reference<_Hp>::value,
1863e519524SHoward Hinnant              "Attempted to default construct a reference element in a tuple");}
1873e519524SHoward Hinnant
1883e519524SHoward Hinnant    template <class _Alloc>
1893e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1903e519524SHoward Hinnant        __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a)
1913e519524SHoward Hinnant            : value(allocator_arg_t(), __a)
1923e519524SHoward Hinnant        {static_assert(!is_reference<_Hp>::value,
1933e519524SHoward Hinnant              "Attempted to default construct a reference element in a tuple");}
1943e519524SHoward Hinnant
1953e519524SHoward Hinnant    template <class _Alloc>
1963e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1973e519524SHoward Hinnant        __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a)
1983e519524SHoward Hinnant            : value(__a)
1993e519524SHoward Hinnant        {static_assert(!is_reference<_Hp>::value,
2003e519524SHoward Hinnant              "Attempted to default construct a reference element in a tuple");}
2013e519524SHoward Hinnant
2023e519524SHoward Hinnant    template <class _Tp>
2033e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2043e519524SHoward Hinnant        explicit __tuple_leaf(_Tp&& __t)
2053e519524SHoward Hinnant            : value(_STD::forward<_Tp>(__t))
2063e519524SHoward Hinnant        {static_assert(!is_lvalue_reference<_Hp>::value ||
2073e519524SHoward Hinnant                        is_lvalue_reference<_Hp>::value &&
2083e519524SHoward Hinnant                        (is_lvalue_reference<_Tp>::value ||
2093e519524SHoward Hinnant                         is_same<typename remove_reference<_Tp>::type,
2103e519524SHoward Hinnant                                 reference_wrapper<
2113e519524SHoward Hinnant                                    typename remove_reference<_Hp>::type
2123e519524SHoward Hinnant                                 >
2133e519524SHoward Hinnant                                >::value),
2143e519524SHoward Hinnant       "Attempted to construct a reference element in a tuple with an rvalue");}
2153e519524SHoward Hinnant
2163e519524SHoward Hinnant    template <class _Tp, class _Alloc>
2173e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2183e519524SHoward Hinnant        explicit __tuple_leaf(integral_constant<int, 0>, const _Alloc&, _Tp&& __t)
2193e519524SHoward Hinnant            : value(_STD::forward<_Tp>(__t))
2203e519524SHoward Hinnant        {static_assert(!is_lvalue_reference<_Hp>::value ||
2213e519524SHoward Hinnant                        is_lvalue_reference<_Hp>::value &&
2223e519524SHoward Hinnant                        (is_lvalue_reference<_Tp>::value ||
2233e519524SHoward Hinnant                         is_same<typename remove_reference<_Tp>::type,
2243e519524SHoward Hinnant                                 reference_wrapper<
2253e519524SHoward Hinnant                                    typename remove_reference<_Hp>::type
2263e519524SHoward Hinnant                                 >
2273e519524SHoward Hinnant                                >::value),
2283e519524SHoward Hinnant       "Attempted to construct a reference element in a tuple with an rvalue");}
2293e519524SHoward Hinnant
2303e519524SHoward Hinnant    template <class _Tp, class _Alloc>
2313e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2323e519524SHoward Hinnant        explicit __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a, _Tp&& __t)
2333e519524SHoward Hinnant            : value(allocator_arg_t(), __a, _STD::forward<_Tp>(__t))
2343e519524SHoward Hinnant        {static_assert(!is_lvalue_reference<_Hp>::value ||
2353e519524SHoward Hinnant                        is_lvalue_reference<_Hp>::value &&
2363e519524SHoward Hinnant                        (is_lvalue_reference<_Tp>::value ||
2373e519524SHoward Hinnant                         is_same<typename remove_reference<_Tp>::type,
2383e519524SHoward Hinnant                                 reference_wrapper<
2393e519524SHoward Hinnant                                    typename remove_reference<_Hp>::type
2403e519524SHoward Hinnant                                 >
2413e519524SHoward Hinnant                                >::value),
2423e519524SHoward Hinnant       "Attempted to construct a reference element in a tuple with an rvalue");}
2433e519524SHoward Hinnant
2443e519524SHoward Hinnant    template <class _Tp, class _Alloc>
2453e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2463e519524SHoward Hinnant        explicit __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a, _Tp&& __t)
2473e519524SHoward Hinnant            : value(_STD::forward<_Tp>(__t), __a)
2483e519524SHoward Hinnant        {static_assert(!is_lvalue_reference<_Hp>::value ||
2493e519524SHoward Hinnant                        is_lvalue_reference<_Hp>::value &&
2503e519524SHoward Hinnant                        (is_lvalue_reference<_Tp>::value ||
2513e519524SHoward Hinnant                         is_same<typename remove_reference<_Tp>::type,
2523e519524SHoward Hinnant                                 reference_wrapper<
2533e519524SHoward Hinnant                                    typename remove_reference<_Hp>::type
2543e519524SHoward Hinnant                                 >
2553e519524SHoward Hinnant                                >::value),
2563e519524SHoward Hinnant       "Attempted to construct a reference element in a tuple with an rvalue");}
2573e519524SHoward Hinnant
2583e519524SHoward Hinnant    template <class _Tp>
2593e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2603e519524SHoward Hinnant        explicit __tuple_leaf(const __tuple_leaf<_Ip, _Tp>& __t)
2613e519524SHoward Hinnant            : value(__t.get()) {}
2623e519524SHoward Hinnant
2633e519524SHoward Hinnant    template <class _Tp>
2643e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2653e519524SHoward Hinnant        __tuple_leaf&
2663e519524SHoward Hinnant        operator=(_Tp&& __t)
2673e519524SHoward Hinnant        {
2683e519524SHoward Hinnant            value = _STD::forward<_Tp>(__t);
2693e519524SHoward Hinnant            return *this;
2703e519524SHoward Hinnant        }
2713e519524SHoward Hinnant
2723e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2733e519524SHoward Hinnant    int swap(__tuple_leaf& __t)
2743e519524SHoward Hinnant    {
2753e519524SHoward Hinnant        _STD::swap(*this, __t);
2763e519524SHoward Hinnant        return 0;
2773e519524SHoward Hinnant    }
2783e519524SHoward Hinnant
2793e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY       _Hp& get()       {return value;}
2803e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY const _Hp& get() const {return value;}
2813e519524SHoward Hinnant};
2823e519524SHoward Hinnant
2833e519524SHoward Hinnanttemplate <size_t _Ip, class _Hp>
2843e519524SHoward Hinnantclass __tuple_leaf<_Ip, _Hp, true>
2853e519524SHoward Hinnant    : private _Hp
2863e519524SHoward Hinnant{
2873e519524SHoward Hinnant
2883e519524SHoward Hinnant    __tuple_leaf& operator=(const __tuple_leaf&);
2893e519524SHoward Hinnantpublic:
2903e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __tuple_leaf() {}
2913e519524SHoward Hinnant
2923e519524SHoward Hinnant    template <class _Alloc>
2933e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2943e519524SHoward Hinnant        __tuple_leaf(integral_constant<int, 0>, const _Alloc&) {}
2953e519524SHoward Hinnant
2963e519524SHoward Hinnant    template <class _Alloc>
2973e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2983e519524SHoward Hinnant        __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a)
2993e519524SHoward Hinnant            : _Hp(allocator_arg_t(), __a) {}
3003e519524SHoward Hinnant
3013e519524SHoward Hinnant    template <class _Alloc>
3023e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
3033e519524SHoward Hinnant        __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a)
3043e519524SHoward Hinnant            : _Hp(__a) {}
3053e519524SHoward Hinnant
3063e519524SHoward Hinnant    template <class _Tp>
3073e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
3083e519524SHoward Hinnant        explicit __tuple_leaf(_Tp&& __t)
3093e519524SHoward Hinnant            : _Hp(_STD::forward<_Tp>(__t)) {}
3103e519524SHoward Hinnant
3113e519524SHoward Hinnant    template <class _Tp, class _Alloc>
3123e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
3133e519524SHoward Hinnant        explicit __tuple_leaf(integral_constant<int, 0>, const _Alloc&, _Tp&& __t)
3143e519524SHoward Hinnant            : _Hp(_STD::forward<_Tp>(__t)) {}
3153e519524SHoward Hinnant
3163e519524SHoward Hinnant    template <class _Tp, class _Alloc>
3173e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
3183e519524SHoward Hinnant        explicit __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a, _Tp&& __t)
3193e519524SHoward Hinnant            : _Hp(allocator_arg_t(), __a, _STD::forward<_Tp>(__t)) {}
3203e519524SHoward Hinnant
3213e519524SHoward Hinnant    template <class _Tp, class _Alloc>
3223e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
3233e519524SHoward Hinnant        explicit __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a, _Tp&& __t)
3243e519524SHoward Hinnant            : _Hp(_STD::forward<_Tp>(__t), __a) {}
3253e519524SHoward Hinnant
3263e519524SHoward Hinnant    template <class _Tp>
3273e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
3283e519524SHoward Hinnant        explicit __tuple_leaf(const __tuple_leaf<_Ip, _Tp>& __t)
3293e519524SHoward Hinnant            : _Hp(__t.get()) {}
3303e519524SHoward Hinnant
3313e519524SHoward Hinnant    template <class _Tp>
3323e519524SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
3333e519524SHoward Hinnant        __tuple_leaf&
3343e519524SHoward Hinnant        operator=(_Tp&& __t)
3353e519524SHoward Hinnant        {
3363e519524SHoward Hinnant            _Hp::operator=(_STD::forward<_Tp>(__t));
3373e519524SHoward Hinnant            return *this;
3383e519524SHoward Hinnant        }
3393e519524SHoward Hinnant
3403e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY int swap(__tuple_leaf& __t)
3413e519524SHoward Hinnant    {
3423e519524SHoward Hinnant        _STD::swap(*this, __t);
3433e519524SHoward Hinnant        return 0;
3443e519524SHoward Hinnant    }
3453e519524SHoward Hinnant
3463e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY       _Hp& get()       {return static_cast<_Hp&>(*this);}
3473e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY const _Hp& get() const {return static_cast<const _Hp&>(*this);}
3483e519524SHoward Hinnant};
3493e519524SHoward Hinnant
3503e519524SHoward Hinnanttemplate <class ..._Tp> void __swallow(_Tp&&...) {}
3513e519524SHoward Hinnant
3523e519524SHoward Hinnant// __tuple_impl
3533e519524SHoward Hinnant
3543e519524SHoward Hinnanttemplate<class _Indx, class ..._Tp> struct __tuple_impl;
3553e519524SHoward Hinnant
3563e519524SHoward Hinnanttemplate<size_t ..._Indx, class ..._Tp>
3573e519524SHoward Hinnantstruct __tuple_impl<__tuple_indices<_Indx...>, _Tp...>
3583e519524SHoward Hinnant    : public __tuple_leaf<_Indx, _Tp>...
3593e519524SHoward Hinnant{
3603e519524SHoward Hinnant    template <size_t ..._Uf, class ..._Tf,
3613e519524SHoward Hinnant              size_t ..._Ul, class ..._Tl, class ..._Up>
3623e519524SHoward Hinnant        explicit
3633e519524SHoward Hinnant        __tuple_impl(__tuple_indices<_Uf...>, __tuple_types<_Tf...>,
3643e519524SHoward Hinnant                     __tuple_indices<_Ul...>, __tuple_types<_Tl...>,
3653e519524SHoward Hinnant                     _Up&&... __u) :
3663e519524SHoward Hinnant            __tuple_leaf<_Uf, _Tf>(_STD::forward<_Up>(__u))...,
3673e519524SHoward Hinnant            __tuple_leaf<_Ul, _Tl>()...
3683e519524SHoward Hinnant            {}
3693e519524SHoward Hinnant
3703e519524SHoward Hinnant    template <class _Alloc, size_t ..._Uf, class ..._Tf,
3713e519524SHoward Hinnant              size_t ..._Ul, class ..._Tl, class ..._Up>
3723e519524SHoward Hinnant        explicit
3733e519524SHoward Hinnant        __tuple_impl(allocator_arg_t, const _Alloc& __a,
3743e519524SHoward Hinnant                     __tuple_indices<_Uf...>, __tuple_types<_Tf...>,
3753e519524SHoward Hinnant                     __tuple_indices<_Ul...>, __tuple_types<_Tl...>,
3763e519524SHoward Hinnant                     _Up&&... __u) :
3773e519524SHoward Hinnant            __tuple_leaf<_Uf, _Tf>(__uses_alloc_ctor<_Tf, _Alloc, _Up>(), __a,
3783e519524SHoward Hinnant            _STD::forward<_Up>(__u))...,
3793e519524SHoward Hinnant            __tuple_leaf<_Ul, _Tl>(__uses_alloc_ctor<_Tl, _Alloc>(), __a)...
3803e519524SHoward Hinnant            {}
3813e519524SHoward Hinnant
3823e519524SHoward Hinnant    template <class _Tuple,
3833e519524SHoward Hinnant              class = typename enable_if
3843e519524SHoward Hinnant                      <
3853e519524SHoward Hinnant                         __tuple_convertible<_Tuple, tuple<_Tp...>>::value
3863e519524SHoward Hinnant                      >::type
3873e519524SHoward Hinnant             >
3883e519524SHoward Hinnant        __tuple_impl(_Tuple&& __t)
3893e519524SHoward Hinnant            : __tuple_leaf<_Indx, _Tp>(_STD::forward<typename tuple_element<_Indx,
3903e519524SHoward Hinnant                                       typename __make_tuple_types<_Tuple>::type>::type>(_STD::get<_Indx>(__t)))...
3913e519524SHoward Hinnant            {}
3923e519524SHoward Hinnant
3933e519524SHoward Hinnant    template <class _Alloc, class _Tuple,
3943e519524SHoward Hinnant              class = typename enable_if
3953e519524SHoward Hinnant                      <
3963e519524SHoward Hinnant                         __tuple_convertible<_Tuple, tuple<_Tp...>>::value
3973e519524SHoward Hinnant                      >::type
3983e519524SHoward Hinnant             >
3993e519524SHoward Hinnant        __tuple_impl(allocator_arg_t, const _Alloc& __a, _Tuple&& __t)
4003e519524SHoward Hinnant            : __tuple_leaf<_Indx, _Tp>(__uses_alloc_ctor<_Tp, _Alloc, typename tuple_element<_Indx,
4013e519524SHoward Hinnant                                       typename __make_tuple_types<_Tuple>::type>::type>(), __a,
4023e519524SHoward Hinnant                                       _STD::forward<typename tuple_element<_Indx,
4033e519524SHoward Hinnant                                       typename __make_tuple_types<_Tuple>::type>::type>(_STD::get<_Indx>(__t)))...
4043e519524SHoward Hinnant            {}
4053e519524SHoward Hinnant
4063e519524SHoward Hinnant    template <class _Tuple>
4073e519524SHoward Hinnant        typename enable_if
4083e519524SHoward Hinnant        <
4093e519524SHoward Hinnant            __tuple_assignable<_Tuple, tuple<_Tp...>>::value,
4103e519524SHoward Hinnant            __tuple_impl&
4113e519524SHoward Hinnant        >::type
4123e519524SHoward Hinnant        operator=(_Tuple&& __t)
4133e519524SHoward Hinnant        {
4143e519524SHoward Hinnant            __swallow(__tuple_leaf<_Indx, _Tp>::operator=(_STD::forward<typename tuple_element<_Indx,
4153e519524SHoward Hinnant                                       typename __make_tuple_types<_Tuple>::type>::type>(_STD::get<_Indx>(__t)))...);
4163e519524SHoward Hinnant            return *this;
4173e519524SHoward Hinnant        }
4183e519524SHoward Hinnant
4193e519524SHoward Hinnant    void swap(__tuple_impl& __t)
4203e519524SHoward Hinnant    {
4213e519524SHoward Hinnant        __swallow(__tuple_leaf<_Indx, _Tp>::swap(static_cast<__tuple_leaf<_Indx, _Tp>&>(__t))...);
4223e519524SHoward Hinnant    }
4233e519524SHoward Hinnant};
4243e519524SHoward Hinnant
4253e519524SHoward Hinnanttemplate <class ..._Tp>
4263e519524SHoward Hinnantclass tuple
4273e519524SHoward Hinnant{
4283e519524SHoward Hinnant    typedef __tuple_impl<typename __make_tuple_indices<sizeof...(_Tp)>::type, _Tp...> base;
4293e519524SHoward Hinnant
4303e519524SHoward Hinnant    base base_;
4313e519524SHoward Hinnant
4323e519524SHoward Hinnant    template <size_t _Jp, class ..._Up> friend
4333e519524SHoward Hinnant        typename tuple_element<_Jp, tuple<_Up...>>::type& get(tuple<_Up...>&);
4343e519524SHoward Hinnant    template <size_t _Jp, class ..._Up> friend
4353e519524SHoward Hinnant        const typename tuple_element<_Jp, tuple<_Up...>>::type& get(const tuple<_Up...>&);
4363e519524SHoward Hinnantpublic:
4373e519524SHoward Hinnant
4383e519524SHoward Hinnant    explicit tuple(const _Tp& ... __t)
4393e519524SHoward Hinnant        : base_(typename __make_tuple_indices<sizeof...(_Tp)>::type(),
4403e519524SHoward Hinnant                typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(),
4413e519524SHoward Hinnant                typename __make_tuple_indices<0>::type(),
4423e519524SHoward Hinnant                typename __make_tuple_types<tuple, 0>::type(),
4433e519524SHoward Hinnant                __t...
4443e519524SHoward Hinnant               ) {}
4453e519524SHoward Hinnant
4463e519524SHoward Hinnant    template <class _Alloc>
4473e519524SHoward Hinnant      tuple(allocator_arg_t, const _Alloc& __a, const _Tp& ... __t)
4483e519524SHoward Hinnant        : base_(allocator_arg_t(), __a,
4493e519524SHoward Hinnant                typename __make_tuple_indices<sizeof...(_Tp)>::type(),
4503e519524SHoward Hinnant                typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(),
4513e519524SHoward Hinnant                typename __make_tuple_indices<0>::type(),
4523e519524SHoward Hinnant                typename __make_tuple_types<tuple, 0>::type(),
4533e519524SHoward Hinnant                __t...
4543e519524SHoward Hinnant               ) {}
4553e519524SHoward Hinnant
4563e519524SHoward Hinnant    template <class ..._Up,
4573e519524SHoward Hinnant              class = typename enable_if
4583e519524SHoward Hinnant                      <
4593e519524SHoward Hinnant                         sizeof...(_Up) <= sizeof...(_Tp) &&
4603e519524SHoward Hinnant                         __tuple_convertible
4613e519524SHoward Hinnant                         <
4623e519524SHoward Hinnant                            tuple<_Up...>,
4633e519524SHoward Hinnant                            typename __make_tuple_types<tuple,
4643e519524SHoward Hinnant                                     sizeof...(_Up) < sizeof...(_Tp) ?
4653e519524SHoward Hinnant                                        sizeof...(_Up) :
4663e519524SHoward Hinnant                                        sizeof...(_Tp)>::type
4673e519524SHoward Hinnant                         >::value
4683e519524SHoward Hinnant                      >::type
4693e519524SHoward Hinnant             >
4703e519524SHoward Hinnant        explicit
4713e519524SHoward Hinnant        tuple(_Up&&... __u)
4723e519524SHoward Hinnant            : base_(typename __make_tuple_indices<sizeof...(_Up)>::type(),
4733e519524SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Up)>::type(),
4743e519524SHoward Hinnant                    typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(),
4753e519524SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(),
4763e519524SHoward Hinnant                    _STD::forward<_Up>(__u)...) {}
4773e519524SHoward Hinnant
4783e519524SHoward Hinnant    template <class _Alloc, class ..._Up,
4793e519524SHoward Hinnant              class = typename enable_if
4803e519524SHoward Hinnant                      <
4813e519524SHoward Hinnant                         sizeof...(_Up) <= sizeof...(_Tp) &&
4823e519524SHoward Hinnant                         __tuple_convertible
4833e519524SHoward Hinnant                         <
4843e519524SHoward Hinnant                            tuple<_Up...>,
4853e519524SHoward Hinnant                            typename __make_tuple_types<tuple,
4863e519524SHoward Hinnant                                     sizeof...(_Up) < sizeof...(_Tp) ?
4873e519524SHoward Hinnant                                        sizeof...(_Up) :
4883e519524SHoward Hinnant                                        sizeof...(_Tp)>::type
4893e519524SHoward Hinnant                         >::value
4903e519524SHoward Hinnant                      >::type
4913e519524SHoward Hinnant             >
4923e519524SHoward Hinnant        tuple(allocator_arg_t, const _Alloc& __a, _Up&&... __u)
4933e519524SHoward Hinnant            : base_(allocator_arg_t(), __a,
4943e519524SHoward Hinnant                    typename __make_tuple_indices<sizeof...(_Up)>::type(),
4953e519524SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Up)>::type(),
4963e519524SHoward Hinnant                    typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(),
4973e519524SHoward Hinnant                    typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(),
4983e519524SHoward Hinnant                    _STD::forward<_Up>(__u)...) {}
4993e519524SHoward Hinnant
5003e519524SHoward Hinnant    template <class _Tuple,
5013e519524SHoward Hinnant              class = typename enable_if
5023e519524SHoward Hinnant                      <
5033e519524SHoward Hinnant                         __tuple_convertible<_Tuple, tuple>::value
5043e519524SHoward Hinnant                      >::type
5053e519524SHoward Hinnant             >
5063e519524SHoward Hinnant        tuple(_Tuple&& __t)
5073e519524SHoward Hinnant            : base_(_STD::forward<_Tuple>(__t)) {}
5083e519524SHoward Hinnant
5093e519524SHoward Hinnant    template <class _Alloc, class _Tuple,
5103e519524SHoward Hinnant              class = typename enable_if
5113e519524SHoward Hinnant                      <
5123e519524SHoward Hinnant                         __tuple_convertible<_Tuple, tuple>::value
5133e519524SHoward Hinnant                      >::type
5143e519524SHoward Hinnant             >
5153e519524SHoward Hinnant        tuple(allocator_arg_t, const _Alloc& __a, _Tuple&& __t)
5163e519524SHoward Hinnant            : base_(allocator_arg_t(), __a, _STD::forward<_Tuple>(__t)) {}
5173e519524SHoward Hinnant
5183e519524SHoward Hinnant    template <class _Tuple,
5193e519524SHoward Hinnant              class = typename enable_if
5203e519524SHoward Hinnant                      <
5213e519524SHoward Hinnant                         __tuple_assignable<_Tuple, tuple>::value
5223e519524SHoward Hinnant                      >::type
5233e519524SHoward Hinnant             >
5243e519524SHoward Hinnant        tuple&
5253e519524SHoward Hinnant        operator=(_Tuple&& __t)
5263e519524SHoward Hinnant        {
5273e519524SHoward Hinnant            base_.operator=(_STD::forward<_Tuple>(__t));
5283e519524SHoward Hinnant            return *this;
5293e519524SHoward Hinnant        }
5303e519524SHoward Hinnant
5313e519524SHoward Hinnant    void swap(tuple& __t) {base_.swap(__t.base_);}
5323e519524SHoward Hinnant};
5333e519524SHoward Hinnant
5343e519524SHoward Hinnanttemplate <>
5353e519524SHoward Hinnantclass tuple<>
5363e519524SHoward Hinnant{
5373e519524SHoward Hinnantpublic:
5383e519524SHoward Hinnant    tuple() {}
5393e519524SHoward Hinnant    template <class _Alloc>
5403e519524SHoward Hinnant        tuple(allocator_arg_t, const _Alloc&) {}
5413e519524SHoward Hinnant    template <class _Alloc>
5423e519524SHoward Hinnant        tuple(allocator_arg_t, const _Alloc&, const tuple&) {}
5433e519524SHoward Hinnant    template <class _U>
5443e519524SHoward Hinnant        tuple(array<_U, 0>) {}
5453e519524SHoward Hinnant    template <class _Alloc, class _U>
5463e519524SHoward Hinnant        tuple(allocator_arg_t, const _Alloc&, array<_U, 0>) {}
5473e519524SHoward Hinnant    void swap(tuple&) {}
5483e519524SHoward Hinnant};
5493e519524SHoward Hinnant
5503e519524SHoward Hinnanttemplate <class ..._Tp>
5513e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
5523e519524SHoward Hinnantvoid
5533e519524SHoward Hinnantswap(tuple<_Tp...>& __t, tuple<_Tp...>& __u) {__t.swap(__u);}
5543e519524SHoward Hinnant
5553e519524SHoward Hinnant// get
5563e519524SHoward Hinnant
5573e519524SHoward Hinnanttemplate <size_t _Ip, class ..._Tp>
5583e519524SHoward Hinnantinline
5593e519524SHoward Hinnanttypename tuple_element<_Ip, tuple<_Tp...>>::type&
5603e519524SHoward Hinnantget(tuple<_Tp...>& __t)
5613e519524SHoward Hinnant{
5623e519524SHoward Hinnant    typedef typename tuple_element<_Ip, tuple<_Tp...>>::type type;
5633e519524SHoward Hinnant    return static_cast<__tuple_leaf<_Ip, type>&>(__t.base_).get();
5643e519524SHoward Hinnant}
5653e519524SHoward Hinnant
5663e519524SHoward Hinnanttemplate <size_t _Ip, class ..._Tp>
5673e519524SHoward Hinnantinline
5683e519524SHoward Hinnantconst typename tuple_element<_Ip, tuple<_Tp...>>::type&
5693e519524SHoward Hinnantget(const tuple<_Tp...>& __t)
5703e519524SHoward Hinnant{
5713e519524SHoward Hinnant    typedef typename tuple_element<_Ip, tuple<_Tp...>>::type type;
5723e519524SHoward Hinnant    return static_cast<const __tuple_leaf<_Ip, type>&>(__t.base_).get();
5733e519524SHoward Hinnant}
5743e519524SHoward Hinnant
5753e519524SHoward Hinnant// tie
5763e519524SHoward Hinnant
5773e519524SHoward Hinnanttemplate <class ..._Tp>
5783e519524SHoward Hinnantinline
5793e519524SHoward Hinnanttuple<_Tp&...>
5803e519524SHoward Hinnanttie(_Tp&... __t)
5813e519524SHoward Hinnant{
5823e519524SHoward Hinnant    return tuple<_Tp&...>(__t...);
5833e519524SHoward Hinnant}
5843e519524SHoward Hinnant
5853e519524SHoward Hinnanttemplate <class _Up>
5863e519524SHoward Hinnantstruct __ignore_t
5873e519524SHoward Hinnant{
5883e519524SHoward Hinnant    __ignore_t() {}
5893e519524SHoward Hinnant    template <class _Tp>
5903e519524SHoward Hinnant        __ignore_t(_Tp&&) {}
5913e519524SHoward Hinnant    template <class _Tp>
5923e519524SHoward Hinnant        const __ignore_t& operator=(_Tp&&) const {return *this;}
5933e519524SHoward Hinnant};
5943e519524SHoward Hinnant
5953e519524SHoward Hinnantnamespace { const __ignore_t<unsigned char> ignore = __ignore_t<unsigned char>(); }
5963e519524SHoward Hinnant
5973e519524SHoward Hinnanttemplate <class _Tp> class reference_wrapper;
5983e519524SHoward Hinnant
5993e519524SHoward Hinnanttemplate <class _Tp>
6003e519524SHoward Hinnantstruct ___make_tuple_return
6013e519524SHoward Hinnant{
6023e519524SHoward Hinnant    typedef _Tp type;
6033e519524SHoward Hinnant};
6043e519524SHoward Hinnant
6053e519524SHoward Hinnanttemplate <class _Tp>
6063e519524SHoward Hinnantstruct ___make_tuple_return<reference_wrapper<_Tp>>
6073e519524SHoward Hinnant{
6083e519524SHoward Hinnant    typedef _Tp& type;
6093e519524SHoward Hinnant};
6103e519524SHoward Hinnant
6113e519524SHoward Hinnanttemplate <class _Tp>
6123e519524SHoward Hinnantstruct __make_tuple_return
6133e519524SHoward Hinnant{
6143e519524SHoward Hinnant    typedef typename ___make_tuple_return<typename decay<_Tp>::type>::type type;
6153e519524SHoward Hinnant};
6163e519524SHoward Hinnant
6173e519524SHoward Hinnanttemplate <class... _Tp>
6183e519524SHoward Hinnantinline
6193e519524SHoward Hinnanttuple<typename __make_tuple_return<_Tp>::type...>
6203e519524SHoward Hinnantmake_tuple(_Tp&&... __t)
6213e519524SHoward Hinnant{
6223e519524SHoward Hinnant    return tuple<typename __make_tuple_return<_Tp>::type...>(_STD::forward<_Tp>(__t)...);
6233e519524SHoward Hinnant}
6243e519524SHoward Hinnant
625*1102fbbdSHoward Hinnanttemplate <class... _Tp>
626*1102fbbdSHoward Hinnantinline
627*1102fbbdSHoward Hinnanttuple<_Tp&&...>
628*1102fbbdSHoward Hinnantforward_as_tuple(_Tp&&... __t)
629*1102fbbdSHoward Hinnant{
630*1102fbbdSHoward Hinnant    return tuple<_Tp&&...>(_STD::forward<_Tp>(__t)...);
631*1102fbbdSHoward Hinnant}
632*1102fbbdSHoward Hinnant
6333e519524SHoward Hinnanttemplate <size_t _I>
6343e519524SHoward Hinnantstruct __tuple_equal
6353e519524SHoward Hinnant{
6363e519524SHoward Hinnant    template <class _Tp, class _Up>
6373e519524SHoward Hinnant    bool operator()(const _Tp& __x, const _Up& __y)
6383e519524SHoward Hinnant    {
6393e519524SHoward Hinnant        return __tuple_equal<_I - 1>()(__x, __y) && get<_I-1>(__x) == get<_I-1>(__y);
6403e519524SHoward Hinnant    }
6413e519524SHoward Hinnant};
6423e519524SHoward Hinnant
6433e519524SHoward Hinnanttemplate <>
6443e519524SHoward Hinnantstruct __tuple_equal<0>
6453e519524SHoward Hinnant{
6463e519524SHoward Hinnant    template <class _Tp, class _Up>
6473e519524SHoward Hinnant    bool operator()(const _Tp&, const _Up&)
6483e519524SHoward Hinnant    {
6493e519524SHoward Hinnant        return true;
6503e519524SHoward Hinnant    }
6513e519524SHoward Hinnant};
6523e519524SHoward Hinnant
6533e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up>
6543e519524SHoward Hinnantinline
6553e519524SHoward Hinnantbool
6563e519524SHoward Hinnantoperator==(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
6573e519524SHoward Hinnant{
6583e519524SHoward Hinnant    return __tuple_equal<sizeof...(_Tp)>()(__x, __y);
6593e519524SHoward Hinnant}
6603e519524SHoward Hinnant
6613e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up>
6623e519524SHoward Hinnantinline
6633e519524SHoward Hinnantbool
6643e519524SHoward Hinnantoperator!=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
6653e519524SHoward Hinnant{
6663e519524SHoward Hinnant    return !(__x == __y);
6673e519524SHoward Hinnant}
6683e519524SHoward Hinnant
6693e519524SHoward Hinnanttemplate <size_t _I>
6703e519524SHoward Hinnantstruct __tuple_less
6713e519524SHoward Hinnant{
6723e519524SHoward Hinnant    template <class _Tp, class _Up>
6733e519524SHoward Hinnant    bool operator()(const _Tp& __x, const _Up& __y)
6743e519524SHoward Hinnant    {
6753e519524SHoward Hinnant        return __tuple_less<_I-1>()(__x, __y) ||
6763e519524SHoward Hinnant             (!__tuple_less<_I-1>()(__y, __x) && get<_I-1>(__x) < get<_I-1>(__y));
6773e519524SHoward Hinnant    }
6783e519524SHoward Hinnant};
6793e519524SHoward Hinnant
6803e519524SHoward Hinnanttemplate <>
6813e519524SHoward Hinnantstruct __tuple_less<0>
6823e519524SHoward Hinnant{
6833e519524SHoward Hinnant    template <class _Tp, class _Up>
6843e519524SHoward Hinnant    bool operator()(const _Tp&, const _Up&)
6853e519524SHoward Hinnant    {
6863e519524SHoward Hinnant        return false;
6873e519524SHoward Hinnant    }
6883e519524SHoward Hinnant};
6893e519524SHoward Hinnant
6903e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up>
6913e519524SHoward Hinnantinline
6923e519524SHoward Hinnantbool
6933e519524SHoward Hinnantoperator<(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
6943e519524SHoward Hinnant{
6953e519524SHoward Hinnant    return __tuple_less<sizeof...(_Tp)>()(__x, __y);
6963e519524SHoward Hinnant}
6973e519524SHoward Hinnant
6983e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up>
6993e519524SHoward Hinnantinline
7003e519524SHoward Hinnantbool
7013e519524SHoward Hinnantoperator>(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
7023e519524SHoward Hinnant{
7033e519524SHoward Hinnant    return __y < __x;
7043e519524SHoward Hinnant}
7053e519524SHoward Hinnant
7063e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up>
7073e519524SHoward Hinnantinline
7083e519524SHoward Hinnantbool
7093e519524SHoward Hinnantoperator>=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
7103e519524SHoward Hinnant{
7113e519524SHoward Hinnant    return !(__x < __y);
7123e519524SHoward Hinnant}
7133e519524SHoward Hinnant
7143e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up>
7153e519524SHoward Hinnantinline
7163e519524SHoward Hinnantbool
7173e519524SHoward Hinnantoperator<=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
7183e519524SHoward Hinnant{
7193e519524SHoward Hinnant    return !(__y < __x);
7203e519524SHoward Hinnant}
7213e519524SHoward Hinnant
7223e519524SHoward Hinnant// tuple_cat
7233e519524SHoward Hinnant
7243e519524SHoward Hinnanttemplate <class... _Tp, size_t ..._I1, class... _Up, size_t ..._I2>
7253e519524SHoward Hinnantinline
7263e519524SHoward Hinnanttuple<_Tp..., _Up...>
7273e519524SHoward Hinnant__tuple_cat(const tuple<_Tp...>& __x, __tuple_indices<_I1...>, const tuple<_Up...>& __y, __tuple_indices<_I2...>)
7283e519524SHoward Hinnant{
7293e519524SHoward Hinnant    return tuple<_Tp..., _Up...>(get<_I1>(__x)..., get<_I2>(__y)...);
7303e519524SHoward Hinnant}
7313e519524SHoward Hinnant
7323e519524SHoward Hinnanttemplate <class... _Tp, class... _Up>
7333e519524SHoward Hinnantinline
7343e519524SHoward Hinnanttuple<_Tp..., _Up...>
7353e519524SHoward Hinnanttuple_cat(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
7363e519524SHoward Hinnant{
7373e519524SHoward Hinnant    return __tuple_cat(__x, typename __make_tuple_indices<sizeof...(_Tp)>::type(),
7383e519524SHoward Hinnant                       __y, typename __make_tuple_indices<sizeof...(_Up)>::type());
7393e519524SHoward Hinnant}
7403e519524SHoward Hinnant
7413e519524SHoward Hinnanttemplate <class... _Tp, size_t ..._I1, class... _Up, size_t ..._I2>
7423e519524SHoward Hinnantinline
7433e519524SHoward Hinnanttuple<_Tp..., _Up...>
7443e519524SHoward Hinnant__tuple_cat(tuple<_Tp...>&& __x, __tuple_indices<_I1...>, const tuple<_Up...>& __y, __tuple_indices<_I2...>)
7453e519524SHoward Hinnant{
7463e519524SHoward Hinnant    return tuple<_Tp..., _Up...>(_STD::forward<_Tp>(get<_I1>(__x))..., get<_I2>(__y)...);
7473e519524SHoward Hinnant}
7483e519524SHoward Hinnant
7493e519524SHoward Hinnanttemplate <class... _Tp, class... _Up>
7503e519524SHoward Hinnantinline
7513e519524SHoward Hinnanttuple<_Tp..., _Up...>
7523e519524SHoward Hinnanttuple_cat(tuple<_Tp...>&& __x, const tuple<_Up...>& __y)
7533e519524SHoward Hinnant{
7543e519524SHoward Hinnant    return __tuple_cat(_STD::move(__x), typename __make_tuple_indices<sizeof...(_Tp)>::type(),
7553e519524SHoward Hinnant                       __y, typename __make_tuple_indices<sizeof...(_Up)>::type());
7563e519524SHoward Hinnant}
7573e519524SHoward Hinnant
7583e519524SHoward Hinnanttemplate <class... _Tp, size_t ..._I1, class... _Up, size_t ..._I2>
7593e519524SHoward Hinnantinline
7603e519524SHoward Hinnanttuple<_Tp..., _Up...>
7613e519524SHoward Hinnant__tuple_cat(const tuple<_Tp...>& __x, __tuple_indices<_I1...>, tuple<_Up...>&& __y, __tuple_indices<_I2...>)
7623e519524SHoward Hinnant{
7633e519524SHoward Hinnant    return tuple<_Tp..., _Up...>(get<_I1>(__x)..., _STD::forward<_Up>(get<_I2>(__y))...);
7643e519524SHoward Hinnant}
7653e519524SHoward Hinnant
7663e519524SHoward Hinnanttemplate <class... _Tp, class... _Up>
7673e519524SHoward Hinnantinline
7683e519524SHoward Hinnanttuple<_Tp..., _Up...>
7693e519524SHoward Hinnanttuple_cat(const tuple<_Tp...>& __x, tuple<_Up...>&& __y)
7703e519524SHoward Hinnant{
7713e519524SHoward Hinnant    return __tuple_cat(__x, typename __make_tuple_indices<sizeof...(_Tp)>::type(),
7723e519524SHoward Hinnant                       _STD::move(__y), typename __make_tuple_indices<sizeof...(_Up)>::type());
7733e519524SHoward Hinnant}
7743e519524SHoward Hinnant
7753e519524SHoward Hinnanttemplate <class... _Tp, size_t ..._I1, class... _Up, size_t ..._I2>
7763e519524SHoward Hinnantinline
7773e519524SHoward Hinnanttuple<_Tp..., _Up...>
7783e519524SHoward Hinnant__tuple_cat(tuple<_Tp...>&& __x, __tuple_indices<_I1...>, tuple<_Up...>&& __y, __tuple_indices<_I2...>)
7793e519524SHoward Hinnant{
7803e519524SHoward Hinnant    return tuple<_Tp..., _Up...>(_STD::forward<_Tp>(get<_I1>(__x))..., _STD::forward<_Up>(get<_I2>(__y))...);
7813e519524SHoward Hinnant}
7823e519524SHoward Hinnant
7833e519524SHoward Hinnanttemplate <class... _Tp, class... _Up>
7843e519524SHoward Hinnantinline
7853e519524SHoward Hinnanttuple<_Tp..., _Up...>
7863e519524SHoward Hinnanttuple_cat(tuple<_Tp...>&& __x, tuple<_Up...>&& __y)
7873e519524SHoward Hinnant{
7883e519524SHoward Hinnant    return __tuple_cat(_STD::move(__x), typename __make_tuple_indices<sizeof...(_Tp)>::type(),
7893e519524SHoward Hinnant                       _STD::move(__y), typename __make_tuple_indices<sizeof...(_Up)>::type());
7903e519524SHoward Hinnant}
7913e519524SHoward Hinnant
7923e519524SHoward Hinnanttemplate <class ..._Tp, class _Alloc>
7933e519524SHoward Hinnantstruct uses_allocator<tuple<_Tp...>, _Alloc>
7943e519524SHoward Hinnant    : true_type {};
7953e519524SHoward Hinnant
7963e519524SHoward Hinnanttemplate <class _InputIterator>
7973e519524SHoward Hinnantinline
7983e519524SHoward Hinnant_InputIterator
7993e519524SHoward Hinnantbegin(const std::tuple<_InputIterator, _InputIterator>& __t)
8003e519524SHoward Hinnant{
8013e519524SHoward Hinnant    return get<0>(__t);
8023e519524SHoward Hinnant}
8033e519524SHoward Hinnant
8043e519524SHoward Hinnanttemplate <class _InputIterator>
8053e519524SHoward Hinnantinline
8063e519524SHoward Hinnant_InputIterator
8073e519524SHoward Hinnantend(const std::tuple<_InputIterator, _InputIterator>& __t)
8083e519524SHoward Hinnant{
8093e519524SHoward Hinnant    return get<1>(__t);
8103e519524SHoward Hinnant}
8113e519524SHoward Hinnant
8123e519524SHoward Hinnanttemplate <class _T1, class _T2>
8133e519524SHoward Hinnanttemplate <class... _Args1, class... _Args2, size_t ..._I1, size_t ..._I2>
8143e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
8153e519524SHoward Hinnantpair<_T1, _T2>::pair(piecewise_construct_t,
8163e519524SHoward Hinnant                     tuple<_Args1...>& __first_args, tuple<_Args2...>& __second_args,
8173e519524SHoward Hinnant                     __tuple_indices<_I1...>, __tuple_indices<_I2...>)
8183e519524SHoward Hinnant    :  first(_STD::forward<_Args1>(get<_I1>( __first_args))...),
8193e519524SHoward Hinnant      second(_STD::forward<_Args2>(get<_I2>(__second_args))...)
8203e519524SHoward Hinnant{
8213e519524SHoward Hinnant}
8223e519524SHoward Hinnant
8233e519524SHoward Hinnant#endif
8243e519524SHoward Hinnant
8253e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
8263e519524SHoward Hinnant
8273e519524SHoward Hinnant#endif  // _LIBCPP_TUPLE
828