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: 871013fe3cSEric Fiseliertemplate <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 15305c8dad2SMarshall Clow 1543e519524SHoward Hinnant// __tuple_leaf 1553e519524SHoward Hinnant 156ee187e24SEric Fiseliertemplate <size_t _Ip, class _Hp, 157ee187e24SEric Fiselier bool=is_empty<_Hp>::value && !__libcpp_is_final<_Hp>::value 15842b8bb50SHoward Hinnant > 1593e519524SHoward Hinnantclass __tuple_leaf; 1603e519524SHoward Hinnant 1613e519524SHoward Hinnanttemplate <size_t _Ip, class _Hp, bool _Ep> 162789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1633e519524SHoward Hinnantvoid swap(__tuple_leaf<_Ip, _Hp, _Ep>& __x, __tuple_leaf<_Ip, _Hp, _Ep>& __y) 16427d0a2a7SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_Hp>::value) 1653e519524SHoward Hinnant{ 1663e519524SHoward Hinnant swap(__x.get(), __y.get()); 1673e519524SHoward Hinnant} 1683e519524SHoward Hinnant 1693e519524SHoward Hinnanttemplate <size_t _Ip, class _Hp, bool> 1703e519524SHoward Hinnantclass __tuple_leaf 1713e519524SHoward Hinnant{ 1723e519524SHoward Hinnant _Hp value; 1733e519524SHoward Hinnant 174074f8d77SEric Fiselier template <class _Tp> 175074f8d77SEric Fiselier static constexpr bool __can_bind_reference() { 176074f8d77SEric Fiselier using _RawTp = typename remove_reference<_Tp>::type; 177074f8d77SEric Fiselier using _RawHp = typename remove_reference<_Hp>::type; 178074f8d77SEric Fiselier using _CheckLValueArg = integral_constant<bool, 179074f8d77SEric Fiselier is_lvalue_reference<_Tp>::value 180074f8d77SEric Fiselier || is_same<_RawTp, reference_wrapper<_RawHp>>::value 181074f8d77SEric Fiselier || is_same<_RawTp, reference_wrapper<typename remove_const<_RawHp>::type>>::value 182074f8d77SEric Fiselier >; 183074f8d77SEric Fiselier return !is_reference<_Hp>::value 184074f8d77SEric Fiselier || (is_lvalue_reference<_Hp>::value && _CheckLValueArg::value) 185074f8d77SEric Fiselier || (is_rvalue_reference<_Hp>::value && !is_lvalue_reference<_Tp>::value); 186074f8d77SEric Fiselier } 187074f8d77SEric Fiselier 1883e519524SHoward Hinnant __tuple_leaf& operator=(const __tuple_leaf&); 1893e519524SHoward Hinnantpublic: 190a0f4c45cSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR __tuple_leaf() 191a0f4c45cSHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<_Hp>::value) : value() 1923e519524SHoward Hinnant {static_assert(!is_reference<_Hp>::value, 1933e519524SHoward Hinnant "Attempted to default construct a reference element in a tuple");} 1943e519524SHoward Hinnant 1953e519524SHoward Hinnant template <class _Alloc> 1963e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1973e519524SHoward Hinnant __tuple_leaf(integral_constant<int, 0>, const _Alloc&) 1983e519524SHoward Hinnant : value() 1993e519524SHoward Hinnant {static_assert(!is_reference<_Hp>::value, 2003e519524SHoward Hinnant "Attempted to default construct a reference element in a tuple");} 2013e519524SHoward Hinnant 2023e519524SHoward Hinnant template <class _Alloc> 2033e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2043e519524SHoward Hinnant __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a) 2053e519524SHoward Hinnant : value(allocator_arg_t(), __a) 2063e519524SHoward Hinnant {static_assert(!is_reference<_Hp>::value, 2073e519524SHoward Hinnant "Attempted to default construct a reference element in a tuple");} 2083e519524SHoward Hinnant 2093e519524SHoward Hinnant template <class _Alloc> 2103e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2113e519524SHoward Hinnant __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a) 2123e519524SHoward Hinnant : value(__a) 2133e519524SHoward Hinnant {static_assert(!is_reference<_Hp>::value, 2143e519524SHoward Hinnant "Attempted to default construct a reference element in a tuple");} 2153e519524SHoward Hinnant 21630ad985bSHoward Hinnant template <class _Tp, 217567bb79bSEric Fiselier class = typename enable_if< 218567bb79bSEric Fiselier __lazy_and< 219567bb79bSEric Fiselier __lazy_not<is_same<typename decay<_Tp>::type, __tuple_leaf>> 220567bb79bSEric Fiselier , is_constructible<_Hp, _Tp> 221567bb79bSEric Fiselier >::value 222567bb79bSEric Fiselier >::type 223567bb79bSEric Fiselier > 22475eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 2258a9ee148SHoward Hinnant explicit __tuple_leaf(_Tp&& __t) _NOEXCEPT_((is_nothrow_constructible<_Hp, _Tp>::value)) 226ce48a113SHoward Hinnant : value(_VSTD::forward<_Tp>(__t)) 227074f8d77SEric Fiselier {static_assert(__can_bind_reference<_Tp>(), 2283e519524SHoward Hinnant "Attempted to construct a reference element in a tuple with an rvalue");} 2293e519524SHoward Hinnant 2303e519524SHoward Hinnant template <class _Tp, class _Alloc> 2313e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2323e519524SHoward Hinnant explicit __tuple_leaf(integral_constant<int, 0>, const _Alloc&, _Tp&& __t) 233ce48a113SHoward Hinnant : value(_VSTD::forward<_Tp>(__t)) 234074f8d77SEric Fiselier {static_assert(__can_bind_reference<_Tp>(), 2353e519524SHoward Hinnant "Attempted to construct a reference element in a tuple with an rvalue");} 2363e519524SHoward Hinnant 2373e519524SHoward Hinnant template <class _Tp, class _Alloc> 2383e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2393e519524SHoward Hinnant explicit __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a, _Tp&& __t) 240ce48a113SHoward Hinnant : value(allocator_arg_t(), __a, _VSTD::forward<_Tp>(__t)) 241074f8d77SEric Fiselier {static_assert(!is_reference<_Hp>::value, 242074f8d77SEric Fiselier "Attempted to uses-allocator construct a reference element in a tuple");} 2433e519524SHoward Hinnant 2443e519524SHoward Hinnant template <class _Tp, class _Alloc> 2453e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2463e519524SHoward Hinnant explicit __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a, _Tp&& __t) 247ce48a113SHoward Hinnant : value(_VSTD::forward<_Tp>(__t), __a) 248074f8d77SEric Fiselier {static_assert(!is_reference<_Hp>::value, 249074f8d77SEric Fiselier "Attempted to uses-allocator construct a reference element in a tuple");} 2503e519524SHoward Hinnant 2517546a111SMarshall Clow __tuple_leaf(const __tuple_leaf& __t) = default; 2527546a111SMarshall Clow __tuple_leaf(__tuple_leaf&& __t) = default; 2533e519524SHoward Hinnant 2543e519524SHoward Hinnant template <class _Tp> 2553e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2563e519524SHoward Hinnant __tuple_leaf& 2578a9ee148SHoward Hinnant operator=(_Tp&& __t) _NOEXCEPT_((is_nothrow_assignable<_Hp&, _Tp>::value)) 2583e519524SHoward Hinnant { 259ce48a113SHoward Hinnant value = _VSTD::forward<_Tp>(__t); 2603e519524SHoward Hinnant return *this; 2613e519524SHoward Hinnant } 2623e519524SHoward Hinnant 2633e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 26427d0a2a7SHoward Hinnant int swap(__tuple_leaf& __t) _NOEXCEPT_(__is_nothrow_swappable<__tuple_leaf>::value) 2653e519524SHoward Hinnant { 266ce48a113SHoward Hinnant _VSTD::swap(*this, __t); 2673e519524SHoward Hinnant return 0; 2683e519524SHoward Hinnant } 2693e519524SHoward Hinnant 27075eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 _Hp& get() _NOEXCEPT {return value;} 27175eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const _Hp& get() const _NOEXCEPT {return value;} 2723e519524SHoward Hinnant}; 2733e519524SHoward Hinnant 2743e519524SHoward Hinnanttemplate <size_t _Ip, class _Hp> 2753e519524SHoward Hinnantclass __tuple_leaf<_Ip, _Hp, true> 2763e519524SHoward Hinnant : private _Hp 2773e519524SHoward Hinnant{ 2783e519524SHoward Hinnant 2793e519524SHoward Hinnant __tuple_leaf& operator=(const __tuple_leaf&); 2803e519524SHoward Hinnantpublic: 281a0f4c45cSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR __tuple_leaf() 282a0f4c45cSHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<_Hp>::value) {} 2833e519524SHoward Hinnant 2843e519524SHoward Hinnant template <class _Alloc> 2853e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2863e519524SHoward Hinnant __tuple_leaf(integral_constant<int, 0>, const _Alloc&) {} 2873e519524SHoward Hinnant 2883e519524SHoward Hinnant template <class _Alloc> 2893e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2903e519524SHoward Hinnant __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a) 2913e519524SHoward Hinnant : _Hp(allocator_arg_t(), __a) {} 2923e519524SHoward Hinnant 2933e519524SHoward Hinnant template <class _Alloc> 2943e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2953e519524SHoward Hinnant __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a) 2963e519524SHoward Hinnant : _Hp(__a) {} 2973e519524SHoward Hinnant 29830ad985bSHoward Hinnant template <class _Tp, 299567bb79bSEric Fiselier class = typename enable_if< 300567bb79bSEric Fiselier __lazy_and< 301567bb79bSEric Fiselier __lazy_not<is_same<typename decay<_Tp>::type, __tuple_leaf>> 302567bb79bSEric Fiselier , is_constructible<_Hp, _Tp> 303567bb79bSEric Fiselier >::value 304567bb79bSEric Fiselier >::type 305567bb79bSEric Fiselier > 30675eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 3078a9ee148SHoward Hinnant explicit __tuple_leaf(_Tp&& __t) _NOEXCEPT_((is_nothrow_constructible<_Hp, _Tp>::value)) 308ce48a113SHoward Hinnant : _Hp(_VSTD::forward<_Tp>(__t)) {} 3093e519524SHoward Hinnant 3103e519524SHoward Hinnant template <class _Tp, class _Alloc> 3113e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3123e519524SHoward Hinnant explicit __tuple_leaf(integral_constant<int, 0>, const _Alloc&, _Tp&& __t) 313ce48a113SHoward Hinnant : _Hp(_VSTD::forward<_Tp>(__t)) {} 3143e519524SHoward Hinnant 3153e519524SHoward Hinnant template <class _Tp, class _Alloc> 3163e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3173e519524SHoward Hinnant explicit __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a, _Tp&& __t) 318ce48a113SHoward Hinnant : _Hp(allocator_arg_t(), __a, _VSTD::forward<_Tp>(__t)) {} 3193e519524SHoward Hinnant 3203e519524SHoward Hinnant template <class _Tp, class _Alloc> 3213e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3223e519524SHoward Hinnant explicit __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a, _Tp&& __t) 323ce48a113SHoward Hinnant : _Hp(_VSTD::forward<_Tp>(__t), __a) {} 3243e519524SHoward Hinnant 325567bb79bSEric Fiselier __tuple_leaf(__tuple_leaf const &) = default; 326567bb79bSEric Fiselier __tuple_leaf(__tuple_leaf &&) = default; 327567bb79bSEric Fiselier 3283e519524SHoward Hinnant template <class _Tp> 3293e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3303e519524SHoward Hinnant __tuple_leaf& 3318a9ee148SHoward Hinnant operator=(_Tp&& __t) _NOEXCEPT_((is_nothrow_assignable<_Hp&, _Tp>::value)) 3323e519524SHoward Hinnant { 333ce48a113SHoward Hinnant _Hp::operator=(_VSTD::forward<_Tp>(__t)); 3343e519524SHoward Hinnant return *this; 3353e519524SHoward Hinnant } 3363e519524SHoward Hinnant 33727d0a2a7SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 33827d0a2a7SHoward Hinnant int 33927d0a2a7SHoward Hinnant swap(__tuple_leaf& __t) _NOEXCEPT_(__is_nothrow_swappable<__tuple_leaf>::value) 3403e519524SHoward Hinnant { 341ce48a113SHoward Hinnant _VSTD::swap(*this, __t); 3423e519524SHoward Hinnant return 0; 3433e519524SHoward Hinnant } 3443e519524SHoward Hinnant 34575eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 _Hp& get() _NOEXCEPT {return static_cast<_Hp&>(*this);} 34675eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const _Hp& get() const _NOEXCEPT {return static_cast<const _Hp&>(*this);} 3473e519524SHoward Hinnant}; 3483e519524SHoward Hinnant 349789847ddSHoward Hinnanttemplate <class ..._Tp> 350789847ddSHoward Hinnant_LIBCPP_INLINE_VISIBILITY 3518a9ee148SHoward Hinnantvoid __swallow(_Tp&&...) _NOEXCEPT {} 3523e519524SHoward Hinnant 35390fb2bafSEric Fiseliertemplate <class ..._Tp> 35490fb2bafSEric Fiselierstruct __lazy_all : __all<_Tp::value...> {}; 35590fb2bafSEric Fiselier 35614c5ec51SMarshall Clowtemplate <class _Tp> 35714c5ec51SMarshall Clowstruct __all_default_constructible; 35827d0a2a7SHoward Hinnant 35914c5ec51SMarshall Clowtemplate <class ..._Tp> 36014c5ec51SMarshall Clowstruct __all_default_constructible<__tuple_types<_Tp...>> 36114c5ec51SMarshall Clow : __all<is_default_constructible<_Tp>::value...> 36214c5ec51SMarshall Clow{ }; 36327d0a2a7SHoward Hinnant 3643e519524SHoward Hinnant// __tuple_impl 3653e519524SHoward Hinnant 3663e519524SHoward Hinnanttemplate<class _Indx, class ..._Tp> struct __tuple_impl; 3673e519524SHoward Hinnant 3683e519524SHoward Hinnanttemplate<size_t ..._Indx, class ..._Tp> 3693e519524SHoward Hinnantstruct __tuple_impl<__tuple_indices<_Indx...>, _Tp...> 3703e519524SHoward Hinnant : public __tuple_leaf<_Indx, _Tp>... 3713e519524SHoward Hinnant{ 372a62ebe04SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 373a0f4c45cSHoward Hinnant _LIBCPP_CONSTEXPR __tuple_impl() 374a0f4c45cSHoward Hinnant _NOEXCEPT_(__all<is_nothrow_default_constructible<_Tp>::value...>::value) {} 375a62ebe04SHoward Hinnant 3763e519524SHoward Hinnant template <size_t ..._Uf, class ..._Tf, 3773e519524SHoward Hinnant size_t ..._Ul, class ..._Tl, class ..._Up> 37875eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 3793e519524SHoward Hinnant explicit 3803e519524SHoward Hinnant __tuple_impl(__tuple_indices<_Uf...>, __tuple_types<_Tf...>, 3813e519524SHoward Hinnant __tuple_indices<_Ul...>, __tuple_types<_Tl...>, 3828a9ee148SHoward Hinnant _Up&&... __u) 3838a9ee148SHoward Hinnant _NOEXCEPT_((__all<is_nothrow_constructible<_Tf, _Up>::value...>::value && 3848a9ee148SHoward Hinnant __all<is_nothrow_default_constructible<_Tl>::value...>::value)) : 385ce48a113SHoward Hinnant __tuple_leaf<_Uf, _Tf>(_VSTD::forward<_Up>(__u))..., 3863e519524SHoward Hinnant __tuple_leaf<_Ul, _Tl>()... 3873e519524SHoward Hinnant {} 3883e519524SHoward Hinnant 3893e519524SHoward Hinnant template <class _Alloc, size_t ..._Uf, class ..._Tf, 3903e519524SHoward Hinnant size_t ..._Ul, class ..._Tl, class ..._Up> 391789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3923e519524SHoward Hinnant explicit 3933e519524SHoward Hinnant __tuple_impl(allocator_arg_t, const _Alloc& __a, 3943e519524SHoward Hinnant __tuple_indices<_Uf...>, __tuple_types<_Tf...>, 3953e519524SHoward Hinnant __tuple_indices<_Ul...>, __tuple_types<_Tl...>, 3963e519524SHoward Hinnant _Up&&... __u) : 3973e519524SHoward Hinnant __tuple_leaf<_Uf, _Tf>(__uses_alloc_ctor<_Tf, _Alloc, _Up>(), __a, 398ce48a113SHoward Hinnant _VSTD::forward<_Up>(__u))..., 3993e519524SHoward Hinnant __tuple_leaf<_Ul, _Tl>(__uses_alloc_ctor<_Tl, _Alloc>(), __a)... 4003e519524SHoward Hinnant {} 4013e519524SHoward Hinnant 4023e519524SHoward Hinnant template <class _Tuple, 4033e519524SHoward Hinnant class = typename enable_if 4043e519524SHoward Hinnant < 405f3b02b17SHoward Hinnant __tuple_constructible<_Tuple, tuple<_Tp...> >::value 4063e519524SHoward Hinnant >::type 4073e519524SHoward Hinnant > 40875eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 4098a9ee148SHoward Hinnant __tuple_impl(_Tuple&& __t) _NOEXCEPT_((__all<is_nothrow_constructible<_Tp, typename tuple_element<_Indx, 4108a9ee148SHoward Hinnant typename __make_tuple_types<_Tuple>::type>::type>::value...>::value)) 411ce48a113SHoward Hinnant : __tuple_leaf<_Indx, _Tp>(_VSTD::forward<typename tuple_element<_Indx, 412ce48a113SHoward Hinnant typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<_Indx>(__t)))... 4133e519524SHoward Hinnant {} 4143e519524SHoward Hinnant 4153e519524SHoward Hinnant template <class _Alloc, class _Tuple, 4163e519524SHoward Hinnant class = typename enable_if 4173e519524SHoward Hinnant < 4189795699aSEric Fiselier __tuple_constructible<_Tuple, tuple<_Tp...> >::value 4193e519524SHoward Hinnant >::type 4203e519524SHoward Hinnant > 421789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4223e519524SHoward Hinnant __tuple_impl(allocator_arg_t, const _Alloc& __a, _Tuple&& __t) 4233e519524SHoward Hinnant : __tuple_leaf<_Indx, _Tp>(__uses_alloc_ctor<_Tp, _Alloc, typename tuple_element<_Indx, 4243e519524SHoward Hinnant typename __make_tuple_types<_Tuple>::type>::type>(), __a, 425ce48a113SHoward Hinnant _VSTD::forward<typename tuple_element<_Indx, 426ce48a113SHoward Hinnant typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<_Indx>(__t)))... 4273e519524SHoward Hinnant {} 4283e519524SHoward Hinnant 4293e519524SHoward Hinnant template <class _Tuple> 430789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4313e519524SHoward Hinnant typename enable_if 4323e519524SHoward Hinnant < 4333e519524SHoward Hinnant __tuple_assignable<_Tuple, tuple<_Tp...> >::value, 4343e519524SHoward Hinnant __tuple_impl& 4353e519524SHoward Hinnant >::type 4368a9ee148SHoward Hinnant operator=(_Tuple&& __t) _NOEXCEPT_((__all<is_nothrow_assignable<_Tp&, typename tuple_element<_Indx, 4378a9ee148SHoward Hinnant typename __make_tuple_types<_Tuple>::type>::type>::value...>::value)) 4383e519524SHoward Hinnant { 439ce48a113SHoward Hinnant __swallow(__tuple_leaf<_Indx, _Tp>::operator=(_VSTD::forward<typename tuple_element<_Indx, 440ce48a113SHoward Hinnant typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<_Indx>(__t)))...); 4413e519524SHoward Hinnant return *this; 4423e519524SHoward Hinnant } 4433e519524SHoward Hinnant 4444478b25aSHoward Hinnant __tuple_impl(const __tuple_impl&) = default; 4454478b25aSHoward Hinnant __tuple_impl(__tuple_impl&&) = default; 4464478b25aSHoward Hinnant 447789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 448fa8df7dbSHoward Hinnant __tuple_impl& 4498a9ee148SHoward Hinnant operator=(const __tuple_impl& __t) _NOEXCEPT_((__all<is_nothrow_copy_assignable<_Tp>::value...>::value)) 450fa8df7dbSHoward Hinnant { 451fa8df7dbSHoward Hinnant __swallow(__tuple_leaf<_Indx, _Tp>::operator=(static_cast<const __tuple_leaf<_Indx, _Tp>&>(__t).get())...); 452fa8df7dbSHoward Hinnant return *this; 453fa8df7dbSHoward Hinnant } 454fa8df7dbSHoward Hinnant 455fa8df7dbSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4564478b25aSHoward Hinnant __tuple_impl& 4574478b25aSHoward Hinnant operator=(__tuple_impl&& __t) _NOEXCEPT_((__all<is_nothrow_move_assignable<_Tp>::value...>::value)) 4584478b25aSHoward Hinnant { 4594478b25aSHoward Hinnant __swallow(__tuple_leaf<_Indx, _Tp>::operator=(_VSTD::forward<_Tp>(static_cast<__tuple_leaf<_Indx, _Tp>&>(__t).get()))...); 4604478b25aSHoward Hinnant return *this; 4614478b25aSHoward Hinnant } 4624478b25aSHoward Hinnant 4634478b25aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4643e519524SHoward Hinnant void swap(__tuple_impl& __t) 46527d0a2a7SHoward Hinnant _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value) 4663e519524SHoward Hinnant { 4673e519524SHoward Hinnant __swallow(__tuple_leaf<_Indx, _Tp>::swap(static_cast<__tuple_leaf<_Indx, _Tp>&>(__t))...); 4683e519524SHoward Hinnant } 4693e519524SHoward Hinnant}; 4703e519524SHoward Hinnant 47174cba642SEric Fiselier 47274cba642SEric Fiselier 4733e519524SHoward Hinnanttemplate <class ..._Tp> 474*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS tuple 4753e519524SHoward Hinnant{ 4763e519524SHoward Hinnant typedef __tuple_impl<typename __make_tuple_indices<sizeof...(_Tp)>::type, _Tp...> base; 4773e519524SHoward Hinnant 4783e519524SHoward Hinnant base base_; 4793e519524SHoward Hinnant 480bd688258SEric Fiselier#if defined(_LIBCPP_ENABLE_TUPLE_IMPLICIT_REDUCED_ARITY_EXTENSION) 481bd688258SEric Fiselier static constexpr bool _EnableImplicitReducedArityExtension = true; 482bd688258SEric Fiselier#else 483bd688258SEric Fiselier static constexpr bool _EnableImplicitReducedArityExtension = false; 484bd688258SEric Fiselier#endif 485bd688258SEric Fiselier 48674cba642SEric Fiselier template <class ..._Args> 48774cba642SEric Fiselier struct _PackExpandsToThisTuple : false_type {}; 48874cba642SEric Fiselier 48974cba642SEric Fiselier template <class _Arg> 49074cba642SEric Fiselier struct _PackExpandsToThisTuple<_Arg> 49174cba642SEric Fiselier : is_same<typename __uncvref<_Arg>::type, tuple> {}; 49274cba642SEric Fiselier 49374cba642SEric Fiselier template <bool _MaybeEnable, class _Dummy = void> 49474cba642SEric Fiselier struct _CheckArgsConstructor : __check_tuple_constructor_fail {}; 49574cba642SEric Fiselier 49674cba642SEric Fiselier template <class _Dummy> 49774cba642SEric Fiselier struct _CheckArgsConstructor<true, _Dummy> 49874cba642SEric Fiselier { 49974cba642SEric Fiselier template <class ..._Args> 5004927c295SEric Fiselier static constexpr bool __enable_default() { 5014927c295SEric Fiselier return __all<is_default_constructible<_Args>::value...>::value; 5024927c295SEric Fiselier } 5034927c295SEric Fiselier 5044927c295SEric Fiselier template <class ..._Args> 50574cba642SEric Fiselier static constexpr bool __enable_explicit() { 50674cba642SEric Fiselier return 50774cba642SEric Fiselier __tuple_constructible< 50874cba642SEric Fiselier tuple<_Args...>, 50974cba642SEric Fiselier typename __make_tuple_types<tuple, 51074cba642SEric Fiselier sizeof...(_Args) < sizeof...(_Tp) ? 51174cba642SEric Fiselier sizeof...(_Args) : 51274cba642SEric Fiselier sizeof...(_Tp)>::type 51374cba642SEric Fiselier >::value && 51474cba642SEric Fiselier !__tuple_convertible< 51574cba642SEric Fiselier tuple<_Args...>, 51674cba642SEric Fiselier typename __make_tuple_types<tuple, 51774cba642SEric Fiselier sizeof...(_Args) < sizeof...(_Tp) ? 51874cba642SEric Fiselier sizeof...(_Args) : 51974cba642SEric Fiselier sizeof...(_Tp)>::type 52074cba642SEric Fiselier >::value && 52174cba642SEric Fiselier __all_default_constructible< 52274cba642SEric Fiselier typename __make_tuple_types<tuple, sizeof...(_Tp), 52374cba642SEric Fiselier sizeof...(_Args) < sizeof...(_Tp) ? 52474cba642SEric Fiselier sizeof...(_Args) : 52574cba642SEric Fiselier sizeof...(_Tp)>::type 52674cba642SEric Fiselier >::value; 52774cba642SEric Fiselier } 52874cba642SEric Fiselier 52974cba642SEric Fiselier template <class ..._Args> 53074cba642SEric Fiselier static constexpr bool __enable_implicit() { 53174cba642SEric Fiselier return 53274cba642SEric Fiselier __tuple_convertible< 53374cba642SEric Fiselier tuple<_Args...>, 53474cba642SEric Fiselier typename __make_tuple_types<tuple, 53574cba642SEric Fiselier sizeof...(_Args) < sizeof...(_Tp) ? 53674cba642SEric Fiselier sizeof...(_Args) : 53774cba642SEric Fiselier sizeof...(_Tp)>::type 53874cba642SEric Fiselier >::value && 53974cba642SEric Fiselier __all_default_constructible< 54074cba642SEric Fiselier typename __make_tuple_types<tuple, sizeof...(_Tp), 54174cba642SEric Fiselier sizeof...(_Args) < sizeof...(_Tp) ? 54274cba642SEric Fiselier sizeof...(_Args) : 54374cba642SEric Fiselier sizeof...(_Tp)>::type 54474cba642SEric Fiselier >::value; 54574cba642SEric Fiselier } 54674cba642SEric Fiselier }; 54774cba642SEric Fiselier 54874cba642SEric Fiselier template <bool _MaybeEnable, 54974cba642SEric Fiselier bool = sizeof...(_Tp) == 1, 55074cba642SEric Fiselier class _Dummy = void> 55174cba642SEric Fiselier struct _CheckTupleLikeConstructor : __check_tuple_constructor_fail {}; 55274cba642SEric Fiselier 55374cba642SEric Fiselier template <class _Dummy> 55474cba642SEric Fiselier struct _CheckTupleLikeConstructor<true, false, _Dummy> 55574cba642SEric Fiselier { 55674cba642SEric Fiselier template <class _Tuple> 55774cba642SEric Fiselier static constexpr bool __enable_implicit() { 558347a1cc2SEric Fiselier return __tuple_convertible<_Tuple, tuple>::value; 55974cba642SEric Fiselier } 56074cba642SEric Fiselier 56174cba642SEric Fiselier template <class _Tuple> 56274cba642SEric Fiselier static constexpr bool __enable_explicit() { 563347a1cc2SEric Fiselier return __tuple_constructible<_Tuple, tuple>::value 564347a1cc2SEric Fiselier && !__tuple_convertible<_Tuple, tuple>::value; 56574cba642SEric Fiselier } 56674cba642SEric Fiselier }; 56774cba642SEric Fiselier 56874cba642SEric Fiselier template <class _Dummy> 56974cba642SEric Fiselier struct _CheckTupleLikeConstructor<true, true, _Dummy> 57074cba642SEric Fiselier { 57174cba642SEric Fiselier // This trait is used to disable the tuple-like constructor when 57274cba642SEric Fiselier // the UTypes... constructor should be selected instead. 57374cba642SEric Fiselier // See LWG issue #2549. 57474cba642SEric Fiselier template <class _Tuple> 57574cba642SEric Fiselier using _PreferTupleLikeConstructor = __lazy_or< 57674cba642SEric Fiselier // Don't attempt the two checks below if the tuple we are given 57774cba642SEric Fiselier // has the same type as this tuple. 57874cba642SEric Fiselier is_same<typename __uncvref<_Tuple>::type, tuple>, 57974cba642SEric Fiselier __lazy_and< 58074cba642SEric Fiselier __lazy_not<is_constructible<_Tp..., _Tuple>>, 58174cba642SEric Fiselier __lazy_not<is_convertible<_Tuple, _Tp...>> 58274cba642SEric Fiselier > 58374cba642SEric Fiselier >; 58474cba642SEric Fiselier 58574cba642SEric Fiselier template <class _Tuple> 58674cba642SEric Fiselier static constexpr bool __enable_implicit() { 58774cba642SEric Fiselier return __lazy_and< 58874cba642SEric Fiselier __tuple_convertible<_Tuple, tuple>, 58974cba642SEric Fiselier _PreferTupleLikeConstructor<_Tuple> 59074cba642SEric Fiselier >::value; 59174cba642SEric Fiselier } 59274cba642SEric Fiselier 59374cba642SEric Fiselier template <class _Tuple> 59474cba642SEric Fiselier static constexpr bool __enable_explicit() { 59574cba642SEric Fiselier return __lazy_and< 59674cba642SEric Fiselier __tuple_constructible<_Tuple, tuple>, 59774cba642SEric Fiselier _PreferTupleLikeConstructor<_Tuple>, 59874cba642SEric Fiselier __lazy_not<__tuple_convertible<_Tuple, tuple>> 59974cba642SEric Fiselier >::value; 60074cba642SEric Fiselier } 60174cba642SEric Fiselier }; 60274cba642SEric Fiselier 6038bf1f08aSMarshall Clow template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11 604c206366fSHoward Hinnant typename tuple_element<_Jp, tuple<_Up...> >::type& get(tuple<_Up...>&) _NOEXCEPT; 6058bf1f08aSMarshall Clow template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11 606c206366fSHoward Hinnant const typename tuple_element<_Jp, tuple<_Up...> >::type& get(const tuple<_Up...>&) _NOEXCEPT; 6078bf1f08aSMarshall Clow template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11 608c206366fSHoward Hinnant typename tuple_element<_Jp, tuple<_Up...> >::type&& get(tuple<_Up...>&&) _NOEXCEPT; 609545b8861SEric Fiselier template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11 610545b8861SEric Fiselier const typename tuple_element<_Jp, tuple<_Up...> >::type&& get(const tuple<_Up...>&&) _NOEXCEPT; 6113e519524SHoward Hinnantpublic: 6123e519524SHoward Hinnant 61365500d4bSEric Fiselier template <bool _Dummy = true, class = typename enable_if< 6144927c295SEric Fiselier _CheckArgsConstructor<_Dummy>::template __enable_default<_Tp...>() 61514c5ec51SMarshall Clow >::type> 616789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 617a0f4c45cSHoward Hinnant _LIBCPP_CONSTEXPR tuple() 618a0f4c45cSHoward Hinnant _NOEXCEPT_(__all<is_nothrow_default_constructible<_Tp>::value...>::value) {} 619a62ebe04SHoward Hinnant 620aedcbf89SEric Fiselier tuple(tuple const&) = default; 621aedcbf89SEric Fiselier tuple(tuple&&) = default; 622aedcbf89SEric Fiselier 62390fb2bafSEric Fiselier template <class _AllocArgT, class _Alloc, bool _Dummy = true, class = typename enable_if< 62490fb2bafSEric Fiselier __lazy_and< 62509238677SEric Fiselier is_same<allocator_arg_t, _AllocArgT>, 62690fb2bafSEric Fiselier __lazy_all<__dependent_type<is_default_constructible<_Tp>, _Dummy>...> 62790fb2bafSEric Fiselier >::value 62890fb2bafSEric Fiselier >::type> 62990fb2bafSEric Fiselier _LIBCPP_INLINE_VISIBILITY 63090fb2bafSEric Fiselier tuple(_AllocArgT, _Alloc const& __a) 63190fb2bafSEric Fiselier : base_(allocator_arg_t(), __a, 63290fb2bafSEric Fiselier __tuple_indices<>(), __tuple_types<>(), 63390fb2bafSEric Fiselier typename __make_tuple_indices<sizeof...(_Tp), 0>::type(), 63490fb2bafSEric Fiselier __tuple_types<_Tp...>()) {} 63590fb2bafSEric Fiselier 6369795699aSEric Fiselier template <bool _Dummy = true, 6379795699aSEric Fiselier typename enable_if 6389795699aSEric Fiselier < 6399795699aSEric Fiselier _CheckArgsConstructor< 6409795699aSEric Fiselier _Dummy 64140905833SEric Fiselier >::template __enable_implicit<_Tp const&...>(), 6429795699aSEric Fiselier bool 6439795699aSEric Fiselier >::type = false 6449795699aSEric Fiselier > 6459795699aSEric Fiselier _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 6469795699aSEric Fiselier tuple(const _Tp& ... __t) _NOEXCEPT_((__all<is_nothrow_copy_constructible<_Tp>::value...>::value)) 6479795699aSEric Fiselier : base_(typename __make_tuple_indices<sizeof...(_Tp)>::type(), 6489795699aSEric Fiselier typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(), 6499795699aSEric Fiselier typename __make_tuple_indices<0>::type(), 6509795699aSEric Fiselier typename __make_tuple_types<tuple, 0>::type(), 6519795699aSEric Fiselier __t... 6529795699aSEric Fiselier ) {} 6539795699aSEric Fiselier 6549795699aSEric Fiselier template <bool _Dummy = true, 6559795699aSEric Fiselier typename enable_if 6569795699aSEric Fiselier < 6579795699aSEric Fiselier _CheckArgsConstructor< 6589795699aSEric Fiselier _Dummy 65940905833SEric Fiselier >::template __enable_explicit<_Tp const&...>(), 6609795699aSEric Fiselier bool 6619795699aSEric Fiselier >::type = false 6629795699aSEric Fiselier > 66375eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 6648a9ee148SHoward Hinnant explicit tuple(const _Tp& ... __t) _NOEXCEPT_((__all<is_nothrow_copy_constructible<_Tp>::value...>::value)) 6653e519524SHoward Hinnant : base_(typename __make_tuple_indices<sizeof...(_Tp)>::type(), 6663e519524SHoward Hinnant typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(), 6673e519524SHoward Hinnant typename __make_tuple_indices<0>::type(), 6683e519524SHoward Hinnant typename __make_tuple_types<tuple, 0>::type(), 6693e519524SHoward Hinnant __t... 6703e519524SHoward Hinnant ) {} 6713e519524SHoward Hinnant 6729795699aSEric Fiselier template <class _Alloc, bool _Dummy = true, 6739795699aSEric Fiselier typename enable_if 6749795699aSEric Fiselier < 6759795699aSEric Fiselier _CheckArgsConstructor< 6769795699aSEric Fiselier _Dummy 67740905833SEric Fiselier >::template __enable_implicit<_Tp const&...>(), 6789795699aSEric Fiselier bool 6799795699aSEric Fiselier >::type = false 6809795699aSEric Fiselier > 681789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6823e519524SHoward Hinnant tuple(allocator_arg_t, const _Alloc& __a, const _Tp& ... __t) 6833e519524SHoward Hinnant : base_(allocator_arg_t(), __a, 6843e519524SHoward Hinnant typename __make_tuple_indices<sizeof...(_Tp)>::type(), 6853e519524SHoward Hinnant typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(), 6863e519524SHoward Hinnant typename __make_tuple_indices<0>::type(), 6873e519524SHoward Hinnant typename __make_tuple_types<tuple, 0>::type(), 6883e519524SHoward Hinnant __t... 6893e519524SHoward Hinnant ) {} 6903e519524SHoward Hinnant 6919795699aSEric Fiselier template <class _Alloc, bool _Dummy = true, 6929795699aSEric Fiselier typename enable_if 6939795699aSEric Fiselier < 6949795699aSEric Fiselier _CheckArgsConstructor< 6959795699aSEric Fiselier _Dummy 69640905833SEric Fiselier >::template __enable_explicit<_Tp const&...>(), 6979795699aSEric Fiselier bool 6989795699aSEric Fiselier >::type = false 6999795699aSEric Fiselier > 7009795699aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 7019795699aSEric Fiselier explicit 7029795699aSEric Fiselier tuple(allocator_arg_t, const _Alloc& __a, const _Tp& ... __t) 7039795699aSEric Fiselier : base_(allocator_arg_t(), __a, 7049795699aSEric Fiselier typename __make_tuple_indices<sizeof...(_Tp)>::type(), 7059795699aSEric Fiselier typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(), 7069795699aSEric Fiselier typename __make_tuple_indices<0>::type(), 7079795699aSEric Fiselier typename __make_tuple_types<tuple, 0>::type(), 7089795699aSEric Fiselier __t... 7099795699aSEric Fiselier ) {} 7109795699aSEric Fiselier 7113e519524SHoward Hinnant template <class ..._Up, 712bd688258SEric Fiselier bool _PackIsTuple = _PackExpandsToThisTuple<_Up...>::value, 7130527c620SHoward Hinnant typename enable_if 7143e519524SHoward Hinnant < 71574cba642SEric Fiselier _CheckArgsConstructor< 716bd688258SEric Fiselier sizeof...(_Up) == sizeof...(_Tp) 717bd688258SEric Fiselier && !_PackIsTuple 718bd688258SEric Fiselier >::template __enable_implicit<_Up...>() || 719bd688258SEric Fiselier _CheckArgsConstructor< 720bd688258SEric Fiselier _EnableImplicitReducedArityExtension 721bd688258SEric Fiselier && sizeof...(_Up) < sizeof...(_Tp) 722bd688258SEric Fiselier && !_PackIsTuple 72374cba642SEric Fiselier >::template __enable_implicit<_Up...>(), 7240527c620SHoward Hinnant bool 7250527c620SHoward Hinnant >::type = false 7260527c620SHoward Hinnant > 72775eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 7280527c620SHoward Hinnant tuple(_Up&&... __u) 7298a9ee148SHoward Hinnant _NOEXCEPT_(( 73010a65e2eSMarshall Clow is_nothrow_constructible<base, 7318a9ee148SHoward Hinnant typename __make_tuple_indices<sizeof...(_Up)>::type, 7328a9ee148SHoward Hinnant typename __make_tuple_types<tuple, sizeof...(_Up)>::type, 7338a9ee148SHoward Hinnant typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type, 7348a9ee148SHoward Hinnant typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type, 73510a65e2eSMarshall Clow _Up... 7368a9ee148SHoward Hinnant >::value 7378a9ee148SHoward Hinnant )) 7380527c620SHoward Hinnant : base_(typename __make_tuple_indices<sizeof...(_Up)>::type(), 7390527c620SHoward Hinnant typename __make_tuple_types<tuple, sizeof...(_Up)>::type(), 7400527c620SHoward Hinnant typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(), 7410527c620SHoward Hinnant typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(), 7420527c620SHoward Hinnant _VSTD::forward<_Up>(__u)...) {} 7430527c620SHoward Hinnant 7440527c620SHoward Hinnant template <class ..._Up, 7450527c620SHoward Hinnant typename enable_if 7460527c620SHoward Hinnant < 74774cba642SEric Fiselier _CheckArgsConstructor< 74874cba642SEric Fiselier sizeof...(_Up) <= sizeof...(_Tp) 74974cba642SEric Fiselier && !_PackExpandsToThisTuple<_Up...>::value 750bd688258SEric Fiselier >::template __enable_explicit<_Up...>() || 751bd688258SEric Fiselier _CheckArgsConstructor< 752bd688258SEric Fiselier !_EnableImplicitReducedArityExtension 753bd688258SEric Fiselier && sizeof...(_Up) < sizeof...(_Tp) 754bd688258SEric Fiselier && !_PackExpandsToThisTuple<_Up...>() 755bd688258SEric Fiselier >::template __enable_implicit<_Up...>(), 7560527c620SHoward Hinnant bool 7570527c620SHoward Hinnant >::type = false 7583e519524SHoward Hinnant > 75975eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 7603e519524SHoward Hinnant explicit 7613e519524SHoward Hinnant tuple(_Up&&... __u) 7628a9ee148SHoward Hinnant _NOEXCEPT_(( 76310a65e2eSMarshall Clow is_nothrow_constructible<base, 7648a9ee148SHoward Hinnant typename __make_tuple_indices<sizeof...(_Up)>::type, 7658a9ee148SHoward Hinnant typename __make_tuple_types<tuple, sizeof...(_Up)>::type, 7668a9ee148SHoward Hinnant typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type, 7678a9ee148SHoward Hinnant typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type, 7688a9ee148SHoward Hinnant _Up... 7698a9ee148SHoward Hinnant >::value 7708a9ee148SHoward Hinnant )) 7713e519524SHoward Hinnant : base_(typename __make_tuple_indices<sizeof...(_Up)>::type(), 7723e519524SHoward Hinnant typename __make_tuple_types<tuple, sizeof...(_Up)>::type(), 7733e519524SHoward Hinnant typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(), 7743e519524SHoward Hinnant typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(), 775ce48a113SHoward Hinnant _VSTD::forward<_Up>(__u)...) {} 7763e519524SHoward Hinnant 7773e519524SHoward Hinnant template <class _Alloc, class ..._Up, 7789795699aSEric Fiselier typename enable_if 7793e519524SHoward Hinnant < 78074cba642SEric Fiselier _CheckArgsConstructor< 78190fb2bafSEric Fiselier sizeof...(_Up) == sizeof...(_Tp) && 78274cba642SEric Fiselier !_PackExpandsToThisTuple<_Up...>::value 7839795699aSEric Fiselier >::template __enable_implicit<_Up...>(), 7849795699aSEric Fiselier bool 7859795699aSEric Fiselier >::type = false 7863e519524SHoward Hinnant > 787789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7883e519524SHoward Hinnant tuple(allocator_arg_t, const _Alloc& __a, _Up&&... __u) 7893e519524SHoward Hinnant : base_(allocator_arg_t(), __a, 7903e519524SHoward Hinnant 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 7969795699aSEric Fiselier template <class _Alloc, class ..._Up, 7979795699aSEric Fiselier typename enable_if 7989795699aSEric Fiselier < 7999795699aSEric Fiselier _CheckArgsConstructor< 8009795699aSEric Fiselier sizeof...(_Up) == sizeof...(_Tp) && 8019795699aSEric Fiselier !_PackExpandsToThisTuple<_Up...>::value 8029795699aSEric Fiselier >::template __enable_explicit<_Up...>(), 8039795699aSEric Fiselier bool 8049795699aSEric Fiselier >::type = false 8059795699aSEric Fiselier > 8069795699aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 8079795699aSEric Fiselier explicit 8089795699aSEric Fiselier tuple(allocator_arg_t, const _Alloc& __a, _Up&&... __u) 8099795699aSEric Fiselier : base_(allocator_arg_t(), __a, 8109795699aSEric Fiselier typename __make_tuple_indices<sizeof...(_Up)>::type(), 8119795699aSEric Fiselier typename __make_tuple_types<tuple, sizeof...(_Up)>::type(), 8129795699aSEric Fiselier typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(), 8139795699aSEric Fiselier typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(), 8149795699aSEric Fiselier _VSTD::forward<_Up>(__u)...) {} 8159795699aSEric Fiselier 8163e519524SHoward Hinnant template <class _Tuple, 8170527c620SHoward Hinnant typename enable_if 8183e519524SHoward Hinnant < 81974cba642SEric Fiselier _CheckTupleLikeConstructor< 820347a1cc2SEric Fiselier __tuple_like_with_size<_Tuple, sizeof...(_Tp)>::value 821347a1cc2SEric Fiselier && !_PackExpandsToThisTuple<_Tuple>::value 822347a1cc2SEric Fiselier >::template __enable_implicit<_Tuple>(), 8230527c620SHoward Hinnant bool 8240527c620SHoward Hinnant >::type = false 8253e519524SHoward Hinnant > 82675eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 827347a1cc2SEric Fiselier tuple(_Tuple&& __t) _NOEXCEPT_((is_nothrow_constructible<base, _Tuple>::value)) 828347a1cc2SEric Fiselier : base_(_VSTD::forward<_Tuple>(__t)) {} 8293e519524SHoward Hinnant 8300527c620SHoward Hinnant template <class _Tuple, 8310527c620SHoward Hinnant typename enable_if 8320527c620SHoward Hinnant < 83374cba642SEric Fiselier _CheckTupleLikeConstructor< 834347a1cc2SEric Fiselier __tuple_like_with_size<_Tuple, sizeof...(_Tp)>::value 835347a1cc2SEric Fiselier && !_PackExpandsToThisTuple<_Tuple>::value 836347a1cc2SEric Fiselier >::template __enable_explicit<_Tuple>(), 8370527c620SHoward Hinnant bool 8380527c620SHoward Hinnant >::type = false 8390527c620SHoward Hinnant > 84075eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 8410527c620SHoward Hinnant explicit 842347a1cc2SEric Fiselier tuple(_Tuple&& __t) _NOEXCEPT_((is_nothrow_constructible<base, _Tuple>::value)) 843347a1cc2SEric Fiselier : base_(_VSTD::forward<_Tuple>(__t)) {} 8440527c620SHoward Hinnant 8453e519524SHoward Hinnant template <class _Alloc, class _Tuple, 8469795699aSEric Fiselier typename enable_if 8473e519524SHoward Hinnant < 84874cba642SEric Fiselier _CheckTupleLikeConstructor< 849347a1cc2SEric Fiselier __tuple_like_with_size<_Tuple, sizeof...(_Tp)>::value 850347a1cc2SEric Fiselier >::template __enable_implicit<_Tuple>(), 8519795699aSEric Fiselier bool 8529795699aSEric Fiselier >::type = false 8533e519524SHoward Hinnant > 854789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8553e519524SHoward Hinnant tuple(allocator_arg_t, const _Alloc& __a, _Tuple&& __t) 856347a1cc2SEric Fiselier : base_(allocator_arg_t(), __a, _VSTD::forward<_Tuple>(__t)) {} 8573e519524SHoward Hinnant 8589795699aSEric Fiselier template <class _Alloc, class _Tuple, 8599795699aSEric Fiselier typename enable_if 8609795699aSEric Fiselier < 8619795699aSEric Fiselier _CheckTupleLikeConstructor< 862347a1cc2SEric Fiselier __tuple_like_with_size<_Tuple, sizeof...(_Tp)>::value 863347a1cc2SEric Fiselier >::template __enable_explicit<_Tuple>(), 8649795699aSEric Fiselier bool 8659795699aSEric Fiselier >::type = false 8669795699aSEric Fiselier > 8679795699aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 8689795699aSEric Fiselier explicit 8699795699aSEric Fiselier tuple(allocator_arg_t, const _Alloc& __a, _Tuple&& __t) 870347a1cc2SEric Fiselier : base_(allocator_arg_t(), __a, _VSTD::forward<_Tuple>(__t)) {} 8719795699aSEric Fiselier 872aedcbf89SEric Fiselier using _CanCopyAssign = __all<is_copy_assignable<_Tp>::value...>; 873aedcbf89SEric Fiselier using _CanMoveAssign = __all<is_move_assignable<_Tp>::value...>; 874aedcbf89SEric Fiselier 875aedcbf89SEric Fiselier _LIBCPP_INLINE_VISIBILITY 876347a1cc2SEric Fiselier tuple& operator=(typename conditional<_CanCopyAssign::value, tuple, __nat>::type const& __t) 877aedcbf89SEric Fiselier _NOEXCEPT_((__all<is_nothrow_copy_assignable<_Tp>::value...>::value)) 878aedcbf89SEric Fiselier { 879aedcbf89SEric Fiselier base_.operator=(__t.base_); 880aedcbf89SEric Fiselier return *this; 881aedcbf89SEric Fiselier } 882aedcbf89SEric Fiselier 883aedcbf89SEric Fiselier _LIBCPP_INLINE_VISIBILITY 884aedcbf89SEric Fiselier tuple& operator=(typename conditional<_CanMoveAssign::value, tuple, __nat>::type&& __t) 885aedcbf89SEric Fiselier _NOEXCEPT_((__all<is_nothrow_move_assignable<_Tp>::value...>::value)) 886aedcbf89SEric Fiselier { 887aedcbf89SEric Fiselier base_.operator=(static_cast<base&&>(__t.base_)); 888aedcbf89SEric Fiselier return *this; 889aedcbf89SEric Fiselier } 890aedcbf89SEric Fiselier 8913e519524SHoward Hinnant template <class _Tuple, 8923e519524SHoward Hinnant class = typename enable_if 8933e519524SHoward Hinnant < 894347a1cc2SEric Fiselier __tuple_assignable<_Tuple, tuple>::value 8953e519524SHoward Hinnant >::type 8963e519524SHoward Hinnant > 897789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8983e519524SHoward Hinnant tuple& 899347a1cc2SEric Fiselier operator=(_Tuple&& __t) _NOEXCEPT_((is_nothrow_assignable<base&, _Tuple>::value)) 9003e519524SHoward Hinnant { 901347a1cc2SEric Fiselier base_.operator=(_VSTD::forward<_Tuple>(__t)); 9023e519524SHoward Hinnant return *this; 9033e519524SHoward Hinnant } 9043e519524SHoward Hinnant 905789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 90627d0a2a7SHoward Hinnant void swap(tuple& __t) _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value) 90727d0a2a7SHoward Hinnant {base_.swap(__t.base_);} 9083e519524SHoward Hinnant}; 9093e519524SHoward Hinnant 9103e519524SHoward Hinnanttemplate <> 911*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS tuple<> 9123e519524SHoward Hinnant{ 9133e519524SHoward Hinnantpublic: 914789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 915a0f4c45cSHoward Hinnant _LIBCPP_CONSTEXPR tuple() _NOEXCEPT {} 9163e519524SHoward Hinnant template <class _Alloc> 917789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9188a9ee148SHoward Hinnant tuple(allocator_arg_t, const _Alloc&) _NOEXCEPT {} 9193e519524SHoward Hinnant template <class _Alloc> 920789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9218a9ee148SHoward Hinnant tuple(allocator_arg_t, const _Alloc&, const tuple&) _NOEXCEPT {} 922c003db1fSHoward Hinnant template <class _Up> 923789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9248a9ee148SHoward Hinnant tuple(array<_Up, 0>) _NOEXCEPT {} 925c003db1fSHoward Hinnant template <class _Alloc, class _Up> 926789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9278a9ee148SHoward Hinnant tuple(allocator_arg_t, const _Alloc&, array<_Up, 0>) _NOEXCEPT {} 928789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 92927d0a2a7SHoward Hinnant void swap(tuple&) _NOEXCEPT {} 9303e519524SHoward Hinnant}; 9313e519524SHoward Hinnant 9323e519524SHoward Hinnanttemplate <class ..._Tp> 9333e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 934bc95cf0dSHoward Hinnanttypename enable_if 935bc95cf0dSHoward Hinnant< 936bc95cf0dSHoward Hinnant __all<__is_swappable<_Tp>::value...>::value, 9373e519524SHoward Hinnant void 938bc95cf0dSHoward Hinnant>::type 93927d0a2a7SHoward Hinnantswap(tuple<_Tp...>& __t, tuple<_Tp...>& __u) 94027d0a2a7SHoward Hinnant _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value) 94127d0a2a7SHoward Hinnant {__t.swap(__u);} 9423e519524SHoward Hinnant 9433e519524SHoward Hinnant// get 9443e519524SHoward Hinnant 9453e519524SHoward Hinnanttemplate <size_t _Ip, class ..._Tp> 9468bf1f08aSMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 9473e519524SHoward Hinnanttypename tuple_element<_Ip, tuple<_Tp...> >::type& 948c206366fSHoward Hinnantget(tuple<_Tp...>& __t) _NOEXCEPT 9493e519524SHoward Hinnant{ 9503e519524SHoward Hinnant typedef typename tuple_element<_Ip, tuple<_Tp...> >::type type; 9513e519524SHoward Hinnant return static_cast<__tuple_leaf<_Ip, type>&>(__t.base_).get(); 9523e519524SHoward Hinnant} 9533e519524SHoward Hinnant 9543e519524SHoward Hinnanttemplate <size_t _Ip, class ..._Tp> 9558bf1f08aSMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 9563e519524SHoward Hinnantconst typename tuple_element<_Ip, tuple<_Tp...> >::type& 957c206366fSHoward Hinnantget(const tuple<_Tp...>& __t) _NOEXCEPT 9583e519524SHoward Hinnant{ 9593e519524SHoward Hinnant typedef typename tuple_element<_Ip, tuple<_Tp...> >::type type; 9603e519524SHoward Hinnant return static_cast<const __tuple_leaf<_Ip, type>&>(__t.base_).get(); 9613e519524SHoward Hinnant} 9623e519524SHoward Hinnant 963601afb30SHoward Hinnanttemplate <size_t _Ip, class ..._Tp> 9648bf1f08aSMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 965601afb30SHoward Hinnanttypename tuple_element<_Ip, tuple<_Tp...> >::type&& 966c206366fSHoward Hinnantget(tuple<_Tp...>&& __t) _NOEXCEPT 967601afb30SHoward Hinnant{ 968601afb30SHoward Hinnant typedef typename tuple_element<_Ip, tuple<_Tp...> >::type type; 9692a3f1bc1SHoward Hinnant return static_cast<type&&>( 970912e161cSDouglas Gregor static_cast<__tuple_leaf<_Ip, type>&&>(__t.base_).get()); 971601afb30SHoward Hinnant} 972601afb30SHoward Hinnant 973545b8861SEric Fiseliertemplate <size_t _Ip, class ..._Tp> 974545b8861SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 975545b8861SEric Fiselierconst typename tuple_element<_Ip, tuple<_Tp...> >::type&& 976545b8861SEric Fiselierget(const tuple<_Tp...>&& __t) _NOEXCEPT 977545b8861SEric Fiselier{ 978545b8861SEric Fiselier typedef typename tuple_element<_Ip, tuple<_Tp...> >::type type; 979545b8861SEric Fiselier return static_cast<const type&&>( 980545b8861SEric Fiselier static_cast<const __tuple_leaf<_Ip, type>&&>(__t.base_).get()); 981545b8861SEric Fiselier} 982545b8861SEric Fiselier 983e99520c7SMarshall Clow#if _LIBCPP_STD_VER > 11 984e99520c7SMarshall Clow 985f447e62eSEric Fiseliernamespace __find_detail { 986f447e62eSEric Fiselier 987f447e62eSEric Fiselierstatic constexpr size_t __not_found = -1; 988f447e62eSEric Fiselierstatic constexpr size_t __ambiguous = __not_found - 1; 989f447e62eSEric Fiselier 990f447e62eSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 991f447e62eSEric Fiselierconstexpr size_t __find_idx_return(size_t __curr_i, size_t __res, bool __matches) { 992f447e62eSEric Fiselier return !__matches ? __res : 993f447e62eSEric Fiselier (__res == __not_found ? __curr_i : __ambiguous); 994f447e62eSEric Fiselier} 995f447e62eSEric Fiselier 996f447e62eSEric Fiseliertemplate <size_t _Nx> 997f447e62eSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 998f447e62eSEric Fiselierconstexpr size_t __find_idx(size_t __i, const bool (&__matches)[_Nx]) { 999f447e62eSEric Fiselier return __i == _Nx ? __not_found : 1000f447e62eSEric Fiselier __find_idx_return(__i, __find_idx(__i + 1, __matches), __matches[__i]); 1001f447e62eSEric Fiselier} 1002f447e62eSEric Fiselier 1003f447e62eSEric Fiseliertemplate <class _T1, class ..._Args> 1004f447e62eSEric Fiselierstruct __find_exactly_one_checked { 1005f447e62eSEric Fiselier static constexpr bool __matches[] = {is_same<_T1, _Args>::value...}; 1006f447e62eSEric Fiselier static constexpr size_t value = __find_detail::__find_idx(0, __matches); 1007f447e62eSEric Fiselier static_assert (value != __not_found, "type not found in type list" ); 1008f447e62eSEric Fiselier static_assert(value != __ambiguous,"type occurs more than once in type list"); 1009e99520c7SMarshall Clow}; 1010e99520c7SMarshall Clow 10114f905b8dSEric Fiseliertemplate <class _T1> 10124f905b8dSEric Fiselierstruct __find_exactly_one_checked<_T1> { 10134f905b8dSEric Fiselier static_assert(!is_same<_T1, _T1>::value, "type not in empty type list"); 10144f905b8dSEric Fiselier}; 10154f905b8dSEric Fiselier 1016f447e62eSEric Fiselier} // namespace __find_detail; 1017e99520c7SMarshall Clow 1018e99520c7SMarshall Clowtemplate <typename _T1, typename... _Args> 1019f447e62eSEric Fiselierstruct __find_exactly_one_t 1020f447e62eSEric Fiselier : public __find_detail::__find_exactly_one_checked<_T1, _Args...> { 1021e99520c7SMarshall Clow}; 1022e99520c7SMarshall Clow 1023e99520c7SMarshall Clowtemplate <class _T1, class... _Args> 1024e99520c7SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 1025e99520c7SMarshall Clowconstexpr _T1& get(tuple<_Args...>& __tup) noexcept 1026e99520c7SMarshall Clow{ 1027e99520c7SMarshall Clow return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(__tup); 1028e99520c7SMarshall Clow} 1029e99520c7SMarshall Clow 1030e99520c7SMarshall Clowtemplate <class _T1, class... _Args> 1031e99520c7SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 1032e99520c7SMarshall Clowconstexpr _T1 const& get(tuple<_Args...> const& __tup) noexcept 1033e99520c7SMarshall Clow{ 1034e99520c7SMarshall Clow return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(__tup); 1035e99520c7SMarshall Clow} 1036e99520c7SMarshall Clow 1037e99520c7SMarshall Clowtemplate <class _T1, class... _Args> 1038e99520c7SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 1039e99520c7SMarshall Clowconstexpr _T1&& get(tuple<_Args...>&& __tup) noexcept 1040e99520c7SMarshall Clow{ 10411c682f0fSMarshall Clow return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(_VSTD::move(__tup)); 1042e99520c7SMarshall Clow} 1043e99520c7SMarshall Clow 1044545b8861SEric Fiseliertemplate <class _T1, class... _Args> 1045545b8861SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 1046545b8861SEric Fiselierconstexpr _T1 const&& get(tuple<_Args...> const&& __tup) noexcept 1047545b8861SEric Fiselier{ 1048545b8861SEric Fiselier return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(_VSTD::move(__tup)); 1049545b8861SEric Fiselier} 1050545b8861SEric Fiselier 1051e99520c7SMarshall Clow#endif 1052e99520c7SMarshall Clow 10533e519524SHoward Hinnant// tie 10543e519524SHoward Hinnant 10553e519524SHoward Hinnanttemplate <class ..._Tp> 10560d1560e1SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 10573e519524SHoward Hinnanttuple<_Tp&...> 10588a9ee148SHoward Hinnanttie(_Tp&... __t) _NOEXCEPT 10593e519524SHoward Hinnant{ 10603e519524SHoward Hinnant return tuple<_Tp&...>(__t...); 10613e519524SHoward Hinnant} 10623e519524SHoward Hinnant 10633e519524SHoward Hinnanttemplate <class _Up> 10643e519524SHoward Hinnantstruct __ignore_t 10653e519524SHoward Hinnant{ 10663e519524SHoward Hinnant template <class _Tp> 1067789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10683e519524SHoward Hinnant const __ignore_t& operator=(_Tp&&) const {return *this;} 10693e519524SHoward Hinnant}; 10703e519524SHoward Hinnant 10713e519524SHoward Hinnantnamespace { const __ignore_t<unsigned char> ignore = __ignore_t<unsigned char>(); } 10723e519524SHoward Hinnant 10733e519524SHoward Hinnanttemplate <class _Tp> 10740724bf67SMarshall Clowstruct __make_tuple_return_impl 10753e519524SHoward Hinnant{ 10763e519524SHoward Hinnant typedef _Tp type; 10773e519524SHoward Hinnant}; 10783e519524SHoward Hinnant 10793e519524SHoward Hinnanttemplate <class _Tp> 10800724bf67SMarshall Clowstruct __make_tuple_return_impl<reference_wrapper<_Tp> > 10813e519524SHoward Hinnant{ 10823e519524SHoward Hinnant typedef _Tp& type; 10833e519524SHoward Hinnant}; 10843e519524SHoward Hinnant 10853e519524SHoward Hinnanttemplate <class _Tp> 10863e519524SHoward Hinnantstruct __make_tuple_return 10873e519524SHoward Hinnant{ 10880724bf67SMarshall Clow typedef typename __make_tuple_return_impl<typename decay<_Tp>::type>::type type; 10893e519524SHoward Hinnant}; 10903e519524SHoward Hinnant 10913e519524SHoward Hinnanttemplate <class... _Tp> 109275eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 10933e519524SHoward Hinnanttuple<typename __make_tuple_return<_Tp>::type...> 10943e519524SHoward Hinnantmake_tuple(_Tp&&... __t) 10953e519524SHoward Hinnant{ 1096ce48a113SHoward Hinnant return tuple<typename __make_tuple_return<_Tp>::type...>(_VSTD::forward<_Tp>(__t)...); 10973e519524SHoward Hinnant} 10983e519524SHoward Hinnant 10991102fbbdSHoward Hinnanttemplate <class... _Tp> 110075eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 110175eff748SMarshall Clowtuple<_Tp&&...> 11028a9ee148SHoward Hinnantforward_as_tuple(_Tp&&... __t) _NOEXCEPT 11031102fbbdSHoward Hinnant{ 1104ce48a113SHoward Hinnant return tuple<_Tp&&...>(_VSTD::forward<_Tp>(__t)...); 11051102fbbdSHoward Hinnant} 11061102fbbdSHoward Hinnant 1107c003db1fSHoward Hinnanttemplate <size_t _Ip> 11083e519524SHoward Hinnantstruct __tuple_equal 11093e519524SHoward Hinnant{ 11103e519524SHoward Hinnant template <class _Tp, class _Up> 111175eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 11123e519524SHoward Hinnant bool operator()(const _Tp& __x, const _Up& __y) 11133e519524SHoward Hinnant { 1114f9af6140SMarshall Clow return __tuple_equal<_Ip - 1>()(__x, __y) && _VSTD::get<_Ip-1>(__x) == _VSTD::get<_Ip-1>(__y); 11153e519524SHoward Hinnant } 11163e519524SHoward Hinnant}; 11173e519524SHoward Hinnant 11183e519524SHoward Hinnanttemplate <> 11193e519524SHoward Hinnantstruct __tuple_equal<0> 11203e519524SHoward Hinnant{ 11213e519524SHoward Hinnant template <class _Tp, class _Up> 112275eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 11233e519524SHoward Hinnant bool operator()(const _Tp&, const _Up&) 11243e519524SHoward Hinnant { 11253e519524SHoward Hinnant return true; 11263e519524SHoward Hinnant } 11273e519524SHoward Hinnant}; 11283e519524SHoward Hinnant 11293e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up> 113075eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 11313e519524SHoward Hinnantbool 11323e519524SHoward Hinnantoperator==(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 11333e519524SHoward Hinnant{ 11343e519524SHoward Hinnant return __tuple_equal<sizeof...(_Tp)>()(__x, __y); 11353e519524SHoward Hinnant} 11363e519524SHoward Hinnant 11373e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up> 113875eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 11393e519524SHoward Hinnantbool 11403e519524SHoward Hinnantoperator!=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 11413e519524SHoward Hinnant{ 11423e519524SHoward Hinnant return !(__x == __y); 11433e519524SHoward Hinnant} 11443e519524SHoward Hinnant 1145c003db1fSHoward Hinnanttemplate <size_t _Ip> 11463e519524SHoward Hinnantstruct __tuple_less 11473e519524SHoward Hinnant{ 11483e519524SHoward Hinnant template <class _Tp, class _Up> 114975eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 11503e519524SHoward Hinnant bool operator()(const _Tp& __x, const _Up& __y) 11513e519524SHoward Hinnant { 115253afae49SDuncan P. N. Exon Smith const size_t __idx = tuple_size<_Tp>::value - _Ip; 115353afae49SDuncan P. N. Exon Smith if (_VSTD::get<__idx>(__x) < _VSTD::get<__idx>(__y)) 115453afae49SDuncan P. N. Exon Smith return true; 115553afae49SDuncan P. N. Exon Smith if (_VSTD::get<__idx>(__y) < _VSTD::get<__idx>(__x)) 115653afae49SDuncan P. N. Exon Smith return false; 115753afae49SDuncan P. N. Exon Smith return __tuple_less<_Ip-1>()(__x, __y); 11583e519524SHoward Hinnant } 11593e519524SHoward Hinnant}; 11603e519524SHoward Hinnant 11613e519524SHoward Hinnanttemplate <> 11623e519524SHoward Hinnantstruct __tuple_less<0> 11633e519524SHoward Hinnant{ 11643e519524SHoward Hinnant template <class _Tp, class _Up> 116575eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 11663e519524SHoward Hinnant bool operator()(const _Tp&, const _Up&) 11673e519524SHoward Hinnant { 11683e519524SHoward Hinnant return false; 11693e519524SHoward Hinnant } 11703e519524SHoward Hinnant}; 11713e519524SHoward Hinnant 11723e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up> 117375eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 11743e519524SHoward Hinnantbool 11753e519524SHoward Hinnantoperator<(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 11763e519524SHoward Hinnant{ 11773e519524SHoward Hinnant return __tuple_less<sizeof...(_Tp)>()(__x, __y); 11783e519524SHoward Hinnant} 11793e519524SHoward Hinnant 11803e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up> 118175eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 11823e519524SHoward Hinnantbool 11833e519524SHoward Hinnantoperator>(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 11843e519524SHoward Hinnant{ 11853e519524SHoward Hinnant return __y < __x; 11863e519524SHoward Hinnant} 11873e519524SHoward Hinnant 11883e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up> 118975eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 11903e519524SHoward Hinnantbool 11913e519524SHoward Hinnantoperator>=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 11923e519524SHoward Hinnant{ 11933e519524SHoward Hinnant return !(__x < __y); 11943e519524SHoward Hinnant} 11953e519524SHoward Hinnant 11963e519524SHoward Hinnanttemplate <class ..._Tp, class ..._Up> 119775eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 11983e519524SHoward Hinnantbool 11993e519524SHoward Hinnantoperator<=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 12003e519524SHoward Hinnant{ 12013e519524SHoward Hinnant return !(__y < __x); 12023e519524SHoward Hinnant} 12033e519524SHoward Hinnant 12043e519524SHoward Hinnant// tuple_cat 12053e519524SHoward Hinnant 12067f64810bSHoward Hinnanttemplate <class _Tp, class _Up> struct __tuple_cat_type; 12077f64810bSHoward Hinnant 12087f64810bSHoward Hinnanttemplate <class ..._Ttypes, class ..._Utypes> 12097f64810bSHoward Hinnantstruct __tuple_cat_type<tuple<_Ttypes...>, __tuple_types<_Utypes...> > 12103e519524SHoward Hinnant{ 12117f64810bSHoward Hinnant typedef tuple<_Ttypes..., _Utypes...> type; 12127f64810bSHoward Hinnant}; 12137f64810bSHoward Hinnant 12147f64810bSHoward Hinnanttemplate <class _ResultTuple, bool _Is_Tuple0TupleLike, class ..._Tuples> 12157f64810bSHoward Hinnantstruct __tuple_cat_return_1 12167f64810bSHoward Hinnant{ 12177f64810bSHoward Hinnant}; 12187f64810bSHoward Hinnant 12197f64810bSHoward Hinnanttemplate <class ..._Types, class _Tuple0> 12207f64810bSHoward Hinnantstruct __tuple_cat_return_1<tuple<_Types...>, true, _Tuple0> 12217f64810bSHoward Hinnant{ 12227f64810bSHoward Hinnant typedef typename __tuple_cat_type<tuple<_Types...>, 12237f64810bSHoward Hinnant typename __make_tuple_types<typename remove_reference<_Tuple0>::type>::type>::type 12247f64810bSHoward Hinnant type; 12257f64810bSHoward Hinnant}; 12267f64810bSHoward Hinnant 12277f64810bSHoward Hinnanttemplate <class ..._Types, class _Tuple0, class _Tuple1, class ..._Tuples> 12287f64810bSHoward Hinnantstruct __tuple_cat_return_1<tuple<_Types...>, true, _Tuple0, _Tuple1, _Tuples...> 12297f64810bSHoward Hinnant : public __tuple_cat_return_1< 12307f64810bSHoward Hinnant typename __tuple_cat_type< 12317f64810bSHoward Hinnant tuple<_Types...>, 12327f64810bSHoward Hinnant typename __make_tuple_types<typename remove_reference<_Tuple0>::type>::type 12337f64810bSHoward Hinnant >::type, 12347f64810bSHoward Hinnant __tuple_like<typename remove_reference<_Tuple1>::type>::value, 12357f64810bSHoward Hinnant _Tuple1, _Tuples...> 12367f64810bSHoward Hinnant{ 12377f64810bSHoward Hinnant}; 12387f64810bSHoward Hinnant 12397f64810bSHoward Hinnanttemplate <class ..._Tuples> struct __tuple_cat_return; 12407f64810bSHoward Hinnant 12417f64810bSHoward Hinnanttemplate <class _Tuple0, class ..._Tuples> 12427f64810bSHoward Hinnantstruct __tuple_cat_return<_Tuple0, _Tuples...> 12437f64810bSHoward Hinnant : public __tuple_cat_return_1<tuple<>, 12447f64810bSHoward Hinnant __tuple_like<typename remove_reference<_Tuple0>::type>::value, _Tuple0, 12457f64810bSHoward Hinnant _Tuples...> 12467f64810bSHoward Hinnant{ 12477f64810bSHoward Hinnant}; 12487f64810bSHoward Hinnant 12497f64810bSHoward Hinnanttemplate <> 12507f64810bSHoward Hinnantstruct __tuple_cat_return<> 12517f64810bSHoward Hinnant{ 12527f64810bSHoward Hinnant typedef tuple<> type; 12537f64810bSHoward Hinnant}; 12547f64810bSHoward Hinnant 125575eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 12567f64810bSHoward Hinnanttuple<> 12577f64810bSHoward Hinnanttuple_cat() 12587f64810bSHoward Hinnant{ 12597f64810bSHoward Hinnant return tuple<>(); 12603e519524SHoward Hinnant} 12613e519524SHoward Hinnant 1262c003db1fSHoward Hinnanttemplate <class _Rp, class _Indices, class _Tuple0, class ..._Tuples> 1263ba31cbdbSHoward Hinnantstruct __tuple_cat_return_ref_imp; 12643e519524SHoward Hinnant 1265ba31cbdbSHoward Hinnanttemplate <class ..._Types, size_t ..._I0, class _Tuple0> 1266ba31cbdbSHoward Hinnantstruct __tuple_cat_return_ref_imp<tuple<_Types...>, __tuple_indices<_I0...>, _Tuple0> 12673e519524SHoward Hinnant{ 12687f64810bSHoward Hinnant typedef typename remove_reference<_Tuple0>::type _T0; 1269ba31cbdbSHoward Hinnant typedef tuple<_Types..., typename __apply_cv<_Tuple0, 1270ba31cbdbSHoward Hinnant typename tuple_element<_I0, _T0>::type>::type&&...> type; 1271ba31cbdbSHoward Hinnant}; 1272ba31cbdbSHoward Hinnant 1273ba31cbdbSHoward Hinnanttemplate <class ..._Types, size_t ..._I0, class _Tuple0, class _Tuple1, class ..._Tuples> 1274ba31cbdbSHoward Hinnantstruct __tuple_cat_return_ref_imp<tuple<_Types...>, __tuple_indices<_I0...>, 1275ba31cbdbSHoward Hinnant _Tuple0, _Tuple1, _Tuples...> 1276ba31cbdbSHoward Hinnant : public __tuple_cat_return_ref_imp< 1277ba31cbdbSHoward Hinnant tuple<_Types..., typename __apply_cv<_Tuple0, 1278ba31cbdbSHoward Hinnant typename tuple_element<_I0, 1279ba31cbdbSHoward Hinnant typename remove_reference<_Tuple0>::type>::type>::type&&...>, 1280ba31cbdbSHoward Hinnant typename __make_tuple_indices<tuple_size<typename 1281ba31cbdbSHoward Hinnant remove_reference<_Tuple1>::type>::value>::type, 1282ba31cbdbSHoward Hinnant _Tuple1, _Tuples...> 1283ba31cbdbSHoward Hinnant{ 1284ba31cbdbSHoward Hinnant}; 1285ba31cbdbSHoward Hinnant 1286ba31cbdbSHoward Hinnanttemplate <class _Tuple0, class ..._Tuples> 1287ba31cbdbSHoward Hinnantstruct __tuple_cat_return_ref 1288ba31cbdbSHoward Hinnant : public __tuple_cat_return_ref_imp<tuple<>, 1289ba31cbdbSHoward Hinnant typename __make_tuple_indices< 1290ba31cbdbSHoward Hinnant tuple_size<typename remove_reference<_Tuple0>::type>::value 1291ba31cbdbSHoward Hinnant >::type, _Tuple0, _Tuples...> 1292ba31cbdbSHoward Hinnant{ 1293ba31cbdbSHoward Hinnant}; 1294ba31cbdbSHoward Hinnant 1295ba31cbdbSHoward Hinnanttemplate <class _Types, class _I0, class _J0> 1296ba31cbdbSHoward Hinnantstruct __tuple_cat; 1297ba31cbdbSHoward Hinnant 1298ba31cbdbSHoward Hinnanttemplate <class ..._Types, size_t ..._I0, size_t ..._J0> 1299ba31cbdbSHoward Hinnantstruct __tuple_cat<tuple<_Types...>, __tuple_indices<_I0...>, __tuple_indices<_J0...> > 1300ba31cbdbSHoward Hinnant{ 1301ba31cbdbSHoward Hinnant template <class _Tuple0> 130275eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1303ba31cbdbSHoward Hinnant typename __tuple_cat_return_ref<tuple<_Types...>&&, _Tuple0&&>::type 1304ba31cbdbSHoward Hinnant operator()(tuple<_Types...> __t, _Tuple0&& __t0) 1305ba31cbdbSHoward Hinnant { 1306f9af6140SMarshall Clow return forward_as_tuple(_VSTD::forward<_Types>(_VSTD::get<_I0>(__t))..., 1307f9af6140SMarshall Clow _VSTD::get<_J0>(_VSTD::forward<_Tuple0>(__t0))...); 13083e519524SHoward Hinnant } 13093e519524SHoward Hinnant 13107f64810bSHoward Hinnant template <class _Tuple0, class _Tuple1, class ..._Tuples> 131175eff748SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1312ba31cbdbSHoward Hinnant typename __tuple_cat_return_ref<tuple<_Types...>&&, _Tuple0&&, _Tuple1&&, _Tuples&&...>::type 1313ba31cbdbSHoward Hinnant operator()(tuple<_Types...> __t, _Tuple0&& __t0, _Tuple1&& __t1, _Tuples&& ...__tpls) 13143e519524SHoward Hinnant { 1315ba31cbdbSHoward Hinnant typedef typename remove_reference<_Tuple0>::type _T0; 1316ba31cbdbSHoward Hinnant typedef typename remove_reference<_Tuple1>::type _T1; 1317ba31cbdbSHoward Hinnant return __tuple_cat< 1318ba31cbdbSHoward Hinnant tuple<_Types..., typename __apply_cv<_Tuple0, typename tuple_element<_J0, _T0>::type>::type&&...>, 1319ba31cbdbSHoward Hinnant typename __make_tuple_indices<sizeof ...(_Types) + tuple_size<_T0>::value>::type, 1320ba31cbdbSHoward Hinnant typename __make_tuple_indices<tuple_size<_T1>::value>::type>() 1321de9320aaSMarshall Clow (forward_as_tuple( 1322f9af6140SMarshall Clow _VSTD::forward<_Types>(_VSTD::get<_I0>(__t))..., 1323f9af6140SMarshall Clow _VSTD::get<_J0>(_VSTD::forward<_Tuple0>(__t0))... 1324ba31cbdbSHoward Hinnant ), 1325ce48a113SHoward Hinnant _VSTD::forward<_Tuple1>(__t1), 1326ce48a113SHoward Hinnant _VSTD::forward<_Tuples>(__tpls)...); 1327ba31cbdbSHoward Hinnant } 1328ba31cbdbSHoward Hinnant}; 1329ba31cbdbSHoward Hinnant 1330ba31cbdbSHoward Hinnanttemplate <class _Tuple0, class... _Tuples> 133175eff748SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1332ba31cbdbSHoward Hinnanttypename __tuple_cat_return<_Tuple0, _Tuples...>::type 1333ba31cbdbSHoward Hinnanttuple_cat(_Tuple0&& __t0, _Tuples&&... __tpls) 1334ba31cbdbSHoward Hinnant{ 1335ba31cbdbSHoward Hinnant typedef typename remove_reference<_Tuple0>::type _T0; 1336ba31cbdbSHoward Hinnant return __tuple_cat<tuple<>, __tuple_indices<>, 1337ba31cbdbSHoward Hinnant typename __make_tuple_indices<tuple_size<_T0>::value>::type>() 1338ce48a113SHoward Hinnant (tuple<>(), _VSTD::forward<_Tuple0>(__t0), 1339ce48a113SHoward Hinnant _VSTD::forward<_Tuples>(__tpls)...); 13403e519524SHoward Hinnant} 13413e519524SHoward Hinnant 13423e519524SHoward Hinnanttemplate <class ..._Tp, class _Alloc> 1343*e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS uses_allocator<tuple<_Tp...>, _Alloc> 13443e519524SHoward Hinnant : true_type {}; 13453e519524SHoward Hinnant 13464927c295SEric Fiselier#endif // _LIBCPP_HAS_NO_VARIADICS 13474927c295SEric Fiselier 13484927c295SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 13493e519524SHoward Hinnanttemplate <class _T1, class _T2> 13503e519524SHoward Hinnanttemplate <class... _Args1, class... _Args2, size_t ..._I1, size_t ..._I2> 13513e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 13523e519524SHoward Hinnantpair<_T1, _T2>::pair(piecewise_construct_t, 13533e519524SHoward Hinnant tuple<_Args1...>& __first_args, tuple<_Args2...>& __second_args, 13543e519524SHoward Hinnant __tuple_indices<_I1...>, __tuple_indices<_I2...>) 1355f9af6140SMarshall Clow : first(_VSTD::forward<_Args1>(_VSTD::get<_I1>( __first_args))...), 1356f9af6140SMarshall Clow second(_VSTD::forward<_Args2>(_VSTD::get<_I2>(__second_args))...) 13573e519524SHoward Hinnant{ 13583e519524SHoward Hinnant} 13594927c295SEric Fiselier#endif // _LIBCPP_CXX03_LANG 13603e519524SHoward Hinnant 136103e29a29SEric Fiselier#if _LIBCPP_STD_VER > 14 136203e29a29SEric Fiseliertemplate <class _Tp> 136303e29a29SEric Fiselierconstexpr size_t tuple_size_v = tuple_size<_Tp>::value; 136403e29a29SEric Fiselier 136503e29a29SEric Fiselier#define _LIBCPP_NOEXCEPT_RETURN(...) noexcept(noexcept(__VA_ARGS__)) { return __VA_ARGS__; } 136603e29a29SEric Fiselier 136703e29a29SEric Fiseliertemplate <class _Fn, class _Tuple, size_t ..._Id> 136803e29a29SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 136903e29a29SEric Fiselierconstexpr decltype(auto) __apply_tuple_impl(_Fn && __f, _Tuple && __t, 137003e29a29SEric Fiselier __tuple_indices<_Id...>) 137103e29a29SEric Fiselier_LIBCPP_NOEXCEPT_RETURN( 137203e29a29SEric Fiselier _VSTD::__invoke_constexpr( 137303e29a29SEric Fiselier _VSTD::forward<_Fn>(__f), 137403e29a29SEric Fiselier _VSTD::get<_Id>(_VSTD::forward<_Tuple>(__t))...) 137503e29a29SEric Fiselier) 137603e29a29SEric Fiselier 137703e29a29SEric Fiseliertemplate <class _Fn, class _Tuple> 137803e29a29SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 137903e29a29SEric Fiselierconstexpr decltype(auto) apply(_Fn && __f, _Tuple && __t) 138003e29a29SEric Fiselier_LIBCPP_NOEXCEPT_RETURN( 138103e29a29SEric Fiselier _VSTD::__apply_tuple_impl( 138203e29a29SEric Fiselier _VSTD::forward<_Fn>(__f), _VSTD::forward<_Tuple>(__t), 138303e29a29SEric Fiselier typename __make_tuple_indices<tuple_size_v<decay_t<_Tuple>>>::type{}) 138403e29a29SEric Fiselier) 138503e29a29SEric Fiselier 138603e29a29SEric Fiseliertemplate <class _Tp, class _Tuple, size_t... _Idx> 138703e29a29SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 138803e29a29SEric Fiselierconstexpr _Tp __make_from_tuple_impl(_Tuple&& __t, __tuple_indices<_Idx...>) 138903e29a29SEric Fiselier_LIBCPP_NOEXCEPT_RETURN( 139003e29a29SEric Fiselier _Tp(_VSTD::get<_Idx>(_VSTD::forward<_Tuple>(__t))...) 139103e29a29SEric Fiselier) 139203e29a29SEric Fiselier 139303e29a29SEric Fiseliertemplate <class _Tp, class _Tuple> 139403e29a29SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 139503e29a29SEric Fiselierconstexpr _Tp make_from_tuple(_Tuple&& __t) 139603e29a29SEric Fiselier_LIBCPP_NOEXCEPT_RETURN( 139703e29a29SEric Fiselier _VSTD::__make_from_tuple_impl<_Tp>(_VSTD::forward<_Tuple>(__t), 139803e29a29SEric Fiselier typename __make_tuple_indices<tuple_size_v<decay_t<_Tuple>>>::type{}) 139903e29a29SEric Fiselier) 140003e29a29SEric Fiselier 140103e29a29SEric Fiselier#undef _LIBCPP_NOEXCEPT_RETURN 140203e29a29SEric Fiselier 140303e29a29SEric Fiselier#endif // _LIBCPP_STD_VER > 14 140403e29a29SEric Fiselier 14053e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 14063e519524SHoward Hinnant 14073e519524SHoward Hinnant#endif // _LIBCPP_TUPLE 1408