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