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