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