1*4d6fc14bSjoerg// -*- C++ -*- 2*4d6fc14bSjoerg//===----------------------------------------------------------------------===// 3*4d6fc14bSjoerg// 4*4d6fc14bSjoerg// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*4d6fc14bSjoerg// See https://llvm.org/LICENSE.txt for license information. 6*4d6fc14bSjoerg// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*4d6fc14bSjoerg// 8*4d6fc14bSjoerg//===----------------------------------------------------------------------===// 9*4d6fc14bSjoerg 10*4d6fc14bSjoerg#ifndef _LIBCPP___TUPLE 11*4d6fc14bSjoerg#define _LIBCPP___TUPLE 12*4d6fc14bSjoerg 13*4d6fc14bSjoerg#include <__config> 14*4d6fc14bSjoerg#include <cstddef> 15*4d6fc14bSjoerg#include <type_traits> 16*4d6fc14bSjoerg 17*4d6fc14bSjoerg#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 18*4d6fc14bSjoerg#pragma GCC system_header 19*4d6fc14bSjoerg#endif 20*4d6fc14bSjoerg 21*4d6fc14bSjoerg 22*4d6fc14bSjoerg_LIBCPP_BEGIN_NAMESPACE_STD 23*4d6fc14bSjoerg 24*4d6fc14bSjoergtemplate <class _Tp> struct _LIBCPP_TEMPLATE_VIS tuple_size; 25*4d6fc14bSjoerg 26*4d6fc14bSjoerg#if !defined(_LIBCPP_CXX03_LANG) 27*4d6fc14bSjoergtemplate <class _Tp, class...> 28*4d6fc14bSjoergusing __enable_if_tuple_size_imp = _Tp; 29*4d6fc14bSjoerg 30*4d6fc14bSjoergtemplate <class _Tp> 31*4d6fc14bSjoergstruct _LIBCPP_TEMPLATE_VIS tuple_size<__enable_if_tuple_size_imp< 32*4d6fc14bSjoerg const _Tp, 33*4d6fc14bSjoerg typename enable_if<!is_volatile<_Tp>::value>::type, 34*4d6fc14bSjoerg integral_constant<size_t, sizeof(tuple_size<_Tp>)>>> 35*4d6fc14bSjoerg : public integral_constant<size_t, tuple_size<_Tp>::value> {}; 36*4d6fc14bSjoerg 37*4d6fc14bSjoergtemplate <class _Tp> 38*4d6fc14bSjoergstruct _LIBCPP_TEMPLATE_VIS tuple_size<__enable_if_tuple_size_imp< 39*4d6fc14bSjoerg volatile _Tp, 40*4d6fc14bSjoerg typename enable_if<!is_const<_Tp>::value>::type, 41*4d6fc14bSjoerg integral_constant<size_t, sizeof(tuple_size<_Tp>)>>> 42*4d6fc14bSjoerg : public integral_constant<size_t, tuple_size<_Tp>::value> {}; 43*4d6fc14bSjoerg 44*4d6fc14bSjoergtemplate <class _Tp> 45*4d6fc14bSjoergstruct _LIBCPP_TEMPLATE_VIS tuple_size<__enable_if_tuple_size_imp< 46*4d6fc14bSjoerg const volatile _Tp, 47*4d6fc14bSjoerg integral_constant<size_t, sizeof(tuple_size<_Tp>)>>> 48*4d6fc14bSjoerg : public integral_constant<size_t, tuple_size<_Tp>::value> {}; 49*4d6fc14bSjoerg 50*4d6fc14bSjoerg#else 51*4d6fc14bSjoergtemplate <class _Tp> struct _LIBCPP_TEMPLATE_VIS tuple_size<const _Tp> : public tuple_size<_Tp> {}; 52*4d6fc14bSjoergtemplate <class _Tp> struct _LIBCPP_TEMPLATE_VIS tuple_size<volatile _Tp> : public tuple_size<_Tp> {}; 53*4d6fc14bSjoergtemplate <class _Tp> struct _LIBCPP_TEMPLATE_VIS tuple_size<const volatile _Tp> : public tuple_size<_Tp> {}; 54*4d6fc14bSjoerg#endif 55*4d6fc14bSjoerg 56*4d6fc14bSjoergtemplate <size_t _Ip, class _Tp> struct _LIBCPP_TEMPLATE_VIS tuple_element; 57*4d6fc14bSjoerg 58*4d6fc14bSjoergtemplate <size_t _Ip, class _Tp> 59*4d6fc14bSjoergstruct _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, const _Tp> 60*4d6fc14bSjoerg{ 61*4d6fc14bSjoerg typedef _LIBCPP_NODEBUG_TYPE typename add_const<typename tuple_element<_Ip, _Tp>::type>::type type; 62*4d6fc14bSjoerg}; 63*4d6fc14bSjoerg 64*4d6fc14bSjoergtemplate <size_t _Ip, class _Tp> 65*4d6fc14bSjoergstruct _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, volatile _Tp> 66*4d6fc14bSjoerg{ 67*4d6fc14bSjoerg typedef _LIBCPP_NODEBUG_TYPE typename add_volatile<typename tuple_element<_Ip, _Tp>::type>::type type; 68*4d6fc14bSjoerg}; 69*4d6fc14bSjoerg 70*4d6fc14bSjoergtemplate <size_t _Ip, class _Tp> 71*4d6fc14bSjoergstruct _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, const volatile _Tp> 72*4d6fc14bSjoerg{ 73*4d6fc14bSjoerg typedef _LIBCPP_NODEBUG_TYPE typename add_cv<typename tuple_element<_Ip, _Tp>::type>::type type; 74*4d6fc14bSjoerg}; 75*4d6fc14bSjoerg 76*4d6fc14bSjoergtemplate <class _Tp> struct __tuple_like : false_type {}; 77*4d6fc14bSjoerg 78*4d6fc14bSjoergtemplate <class _Tp> struct __tuple_like<const _Tp> : public __tuple_like<_Tp> {}; 79*4d6fc14bSjoergtemplate <class _Tp> struct __tuple_like<volatile _Tp> : public __tuple_like<_Tp> {}; 80*4d6fc14bSjoergtemplate <class _Tp> struct __tuple_like<const volatile _Tp> : public __tuple_like<_Tp> {}; 81*4d6fc14bSjoerg 82*4d6fc14bSjoerg// tuple specializations 83*4d6fc14bSjoerg 84*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 85*4d6fc14bSjoerg 86*4d6fc14bSjoergtemplate <size_t...> struct __tuple_indices {}; 87*4d6fc14bSjoerg 88*4d6fc14bSjoergtemplate <class _IdxType, _IdxType... _Values> 89*4d6fc14bSjoergstruct __integer_sequence { 90*4d6fc14bSjoerg template <template <class _OIdxType, _OIdxType...> class _ToIndexSeq, class _ToIndexType> 91*4d6fc14bSjoerg using __convert = _ToIndexSeq<_ToIndexType, _Values...>; 92*4d6fc14bSjoerg 93*4d6fc14bSjoerg template <size_t _Sp> 94*4d6fc14bSjoerg using __to_tuple_indices = __tuple_indices<(_Values + _Sp)...>; 95*4d6fc14bSjoerg}; 96*4d6fc14bSjoerg 97*4d6fc14bSjoerg#if !__has_builtin(__make_integer_seq) || defined(_LIBCPP_TESTING_FALLBACK_MAKE_INTEGER_SEQUENCE) 98*4d6fc14bSjoergnamespace __detail { 99*4d6fc14bSjoerg 100*4d6fc14bSjoergtemplate<typename _Tp, size_t ..._Extra> struct __repeat; 101*4d6fc14bSjoergtemplate<typename _Tp, _Tp ..._Np, size_t ..._Extra> struct __repeat<__integer_sequence<_Tp, _Np...>, _Extra...> { 102*4d6fc14bSjoerg typedef _LIBCPP_NODEBUG_TYPE __integer_sequence<_Tp, 103*4d6fc14bSjoerg _Np..., 104*4d6fc14bSjoerg sizeof...(_Np) + _Np..., 105*4d6fc14bSjoerg 2 * sizeof...(_Np) + _Np..., 106*4d6fc14bSjoerg 3 * sizeof...(_Np) + _Np..., 107*4d6fc14bSjoerg 4 * sizeof...(_Np) + _Np..., 108*4d6fc14bSjoerg 5 * sizeof...(_Np) + _Np..., 109*4d6fc14bSjoerg 6 * sizeof...(_Np) + _Np..., 110*4d6fc14bSjoerg 7 * sizeof...(_Np) + _Np..., 111*4d6fc14bSjoerg _Extra...> type; 112*4d6fc14bSjoerg}; 113*4d6fc14bSjoerg 114*4d6fc14bSjoergtemplate<size_t _Np> struct __parity; 115*4d6fc14bSjoergtemplate<size_t _Np> struct __make : __parity<_Np % 8>::template __pmake<_Np> {}; 116*4d6fc14bSjoerg 117*4d6fc14bSjoergtemplate<> struct __make<0> { typedef __integer_sequence<size_t> type; }; 118*4d6fc14bSjoergtemplate<> struct __make<1> { typedef __integer_sequence<size_t, 0> type; }; 119*4d6fc14bSjoergtemplate<> struct __make<2> { typedef __integer_sequence<size_t, 0, 1> type; }; 120*4d6fc14bSjoergtemplate<> struct __make<3> { typedef __integer_sequence<size_t, 0, 1, 2> type; }; 121*4d6fc14bSjoergtemplate<> struct __make<4> { typedef __integer_sequence<size_t, 0, 1, 2, 3> type; }; 122*4d6fc14bSjoergtemplate<> struct __make<5> { typedef __integer_sequence<size_t, 0, 1, 2, 3, 4> type; }; 123*4d6fc14bSjoergtemplate<> struct __make<6> { typedef __integer_sequence<size_t, 0, 1, 2, 3, 4, 5> type; }; 124*4d6fc14bSjoergtemplate<> struct __make<7> { typedef __integer_sequence<size_t, 0, 1, 2, 3, 4, 5, 6> type; }; 125*4d6fc14bSjoerg 126*4d6fc14bSjoergtemplate<> struct __parity<0> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type> {}; }; 127*4d6fc14bSjoergtemplate<> struct __parity<1> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 1> {}; }; 128*4d6fc14bSjoergtemplate<> struct __parity<2> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 2, _Np - 1> {}; }; 129*4d6fc14bSjoergtemplate<> struct __parity<3> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 3, _Np - 2, _Np - 1> {}; }; 130*4d6fc14bSjoergtemplate<> struct __parity<4> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; }; 131*4d6fc14bSjoergtemplate<> struct __parity<5> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 5, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; }; 132*4d6fc14bSjoergtemplate<> struct __parity<6> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 6, _Np - 5, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; }; 133*4d6fc14bSjoergtemplate<> struct __parity<7> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 7, _Np - 6, _Np - 5, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; }; 134*4d6fc14bSjoerg 135*4d6fc14bSjoerg} // namespace detail 136*4d6fc14bSjoerg 137*4d6fc14bSjoerg#endif // !__has_builtin(__make_integer_seq) || defined(_LIBCPP_TESTING_FALLBACK_MAKE_INTEGER_SEQUENCE) 138*4d6fc14bSjoerg 139*4d6fc14bSjoerg#if __has_builtin(__make_integer_seq) 140*4d6fc14bSjoergtemplate <size_t _Ep, size_t _Sp> 141*4d6fc14bSjoergusing __make_indices_imp = 142*4d6fc14bSjoerg typename __make_integer_seq<__integer_sequence, size_t, _Ep - _Sp>::template 143*4d6fc14bSjoerg __to_tuple_indices<_Sp>; 144*4d6fc14bSjoerg#else 145*4d6fc14bSjoergtemplate <size_t _Ep, size_t _Sp> 146*4d6fc14bSjoergusing __make_indices_imp = 147*4d6fc14bSjoerg typename __detail::__make<_Ep - _Sp>::type::template __to_tuple_indices<_Sp>; 148*4d6fc14bSjoerg 149*4d6fc14bSjoerg#endif 150*4d6fc14bSjoerg 151*4d6fc14bSjoergtemplate <size_t _Ep, size_t _Sp = 0> 152*4d6fc14bSjoergstruct __make_tuple_indices 153*4d6fc14bSjoerg{ 154*4d6fc14bSjoerg static_assert(_Sp <= _Ep, "__make_tuple_indices input error"); 155*4d6fc14bSjoerg typedef __make_indices_imp<_Ep, _Sp> type; 156*4d6fc14bSjoerg}; 157*4d6fc14bSjoerg 158*4d6fc14bSjoerg 159*4d6fc14bSjoergtemplate <class ..._Tp> class _LIBCPP_TEMPLATE_VIS tuple; 160*4d6fc14bSjoerg 161*4d6fc14bSjoergtemplate <class... _Tp> struct __tuple_like<tuple<_Tp...> > : true_type {}; 162*4d6fc14bSjoerg 163*4d6fc14bSjoergtemplate <class ..._Tp> 164*4d6fc14bSjoergstruct _LIBCPP_TEMPLATE_VIS tuple_size<tuple<_Tp...> > 165*4d6fc14bSjoerg : public integral_constant<size_t, sizeof...(_Tp)> 166*4d6fc14bSjoerg{ 167*4d6fc14bSjoerg}; 168*4d6fc14bSjoerg 169*4d6fc14bSjoergtemplate <size_t _Ip, class ..._Tp> 170*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 171*4d6fc14bSjoergtypename tuple_element<_Ip, tuple<_Tp...> >::type& 172*4d6fc14bSjoergget(tuple<_Tp...>&) _NOEXCEPT; 173*4d6fc14bSjoerg 174*4d6fc14bSjoergtemplate <size_t _Ip, class ..._Tp> 175*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 176*4d6fc14bSjoergconst typename tuple_element<_Ip, tuple<_Tp...> >::type& 177*4d6fc14bSjoergget(const tuple<_Tp...>&) _NOEXCEPT; 178*4d6fc14bSjoerg 179*4d6fc14bSjoergtemplate <size_t _Ip, class ..._Tp> 180*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 181*4d6fc14bSjoergtypename tuple_element<_Ip, tuple<_Tp...> >::type&& 182*4d6fc14bSjoergget(tuple<_Tp...>&&) _NOEXCEPT; 183*4d6fc14bSjoerg 184*4d6fc14bSjoergtemplate <size_t _Ip, class ..._Tp> 185*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 186*4d6fc14bSjoergconst typename tuple_element<_Ip, tuple<_Tp...> >::type&& 187*4d6fc14bSjoergget(const tuple<_Tp...>&&) _NOEXCEPT; 188*4d6fc14bSjoerg 189*4d6fc14bSjoerg#endif // !defined(_LIBCPP_CXX03_LANG) 190*4d6fc14bSjoerg 191*4d6fc14bSjoerg// pair specializations 192*4d6fc14bSjoerg 193*4d6fc14bSjoergtemplate <class _T1, class _T2> struct __tuple_like<pair<_T1, _T2> > : true_type {}; 194*4d6fc14bSjoerg 195*4d6fc14bSjoergtemplate <size_t _Ip, class _T1, class _T2> 196*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 197*4d6fc14bSjoergtypename tuple_element<_Ip, pair<_T1, _T2> >::type& 198*4d6fc14bSjoergget(pair<_T1, _T2>&) _NOEXCEPT; 199*4d6fc14bSjoerg 200*4d6fc14bSjoergtemplate <size_t _Ip, class _T1, class _T2> 201*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 202*4d6fc14bSjoergconst typename tuple_element<_Ip, pair<_T1, _T2> >::type& 203*4d6fc14bSjoergget(const pair<_T1, _T2>&) _NOEXCEPT; 204*4d6fc14bSjoerg 205*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 206*4d6fc14bSjoergtemplate <size_t _Ip, class _T1, class _T2> 207*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 208*4d6fc14bSjoergtypename tuple_element<_Ip, pair<_T1, _T2> >::type&& 209*4d6fc14bSjoergget(pair<_T1, _T2>&&) _NOEXCEPT; 210*4d6fc14bSjoerg 211*4d6fc14bSjoergtemplate <size_t _Ip, class _T1, class _T2> 212*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 213*4d6fc14bSjoergconst typename tuple_element<_Ip, pair<_T1, _T2> >::type&& 214*4d6fc14bSjoergget(const pair<_T1, _T2>&&) _NOEXCEPT; 215*4d6fc14bSjoerg#endif 216*4d6fc14bSjoerg 217*4d6fc14bSjoerg// array specializations 218*4d6fc14bSjoerg 219*4d6fc14bSjoergtemplate <class _Tp, size_t _Size> struct _LIBCPP_TEMPLATE_VIS array; 220*4d6fc14bSjoerg 221*4d6fc14bSjoergtemplate <class _Tp, size_t _Size> struct __tuple_like<array<_Tp, _Size> > : true_type {}; 222*4d6fc14bSjoerg 223*4d6fc14bSjoergtemplate <size_t _Ip, class _Tp, size_t _Size> 224*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 225*4d6fc14bSjoerg_Tp& 226*4d6fc14bSjoergget(array<_Tp, _Size>&) _NOEXCEPT; 227*4d6fc14bSjoerg 228*4d6fc14bSjoergtemplate <size_t _Ip, class _Tp, size_t _Size> 229*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 230*4d6fc14bSjoergconst _Tp& 231*4d6fc14bSjoergget(const array<_Tp, _Size>&) _NOEXCEPT; 232*4d6fc14bSjoerg 233*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 234*4d6fc14bSjoergtemplate <size_t _Ip, class _Tp, size_t _Size> 235*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 236*4d6fc14bSjoerg_Tp&& 237*4d6fc14bSjoergget(array<_Tp, _Size>&&) _NOEXCEPT; 238*4d6fc14bSjoerg 239*4d6fc14bSjoergtemplate <size_t _Ip, class _Tp, size_t _Size> 240*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 241*4d6fc14bSjoergconst _Tp&& 242*4d6fc14bSjoergget(const array<_Tp, _Size>&&) _NOEXCEPT; 243*4d6fc14bSjoerg#endif 244*4d6fc14bSjoerg 245*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 246*4d6fc14bSjoerg 247*4d6fc14bSjoerg// __tuple_types 248*4d6fc14bSjoerg 249*4d6fc14bSjoergtemplate <class ..._Tp> struct __tuple_types {}; 250*4d6fc14bSjoerg 251*4d6fc14bSjoerg#if !__has_builtin(__type_pack_element) 252*4d6fc14bSjoerg 253*4d6fc14bSjoergnamespace __indexer_detail { 254*4d6fc14bSjoerg 255*4d6fc14bSjoergtemplate <size_t _Idx, class _Tp> 256*4d6fc14bSjoergstruct __indexed { using type _LIBCPP_NODEBUG_TYPE = _Tp; }; 257*4d6fc14bSjoerg 258*4d6fc14bSjoergtemplate <class _Types, class _Indexes> struct __indexer; 259*4d6fc14bSjoerg 260*4d6fc14bSjoergtemplate <class ..._Types, size_t ..._Idx> 261*4d6fc14bSjoergstruct __indexer<__tuple_types<_Types...>, __tuple_indices<_Idx...>> 262*4d6fc14bSjoerg : __indexed<_Idx, _Types>... 263*4d6fc14bSjoerg{}; 264*4d6fc14bSjoerg 265*4d6fc14bSjoergtemplate <size_t _Idx, class _Tp> 266*4d6fc14bSjoerg__indexed<_Idx, _Tp> __at_index(__indexed<_Idx, _Tp> const&); 267*4d6fc14bSjoerg 268*4d6fc14bSjoerg} // namespace __indexer_detail 269*4d6fc14bSjoerg 270*4d6fc14bSjoergtemplate <size_t _Idx, class ..._Types> 271*4d6fc14bSjoergusing __type_pack_element _LIBCPP_NODEBUG_TYPE = typename decltype( 272*4d6fc14bSjoerg __indexer_detail::__at_index<_Idx>( 273*4d6fc14bSjoerg __indexer_detail::__indexer< 274*4d6fc14bSjoerg __tuple_types<_Types...>, 275*4d6fc14bSjoerg typename __make_tuple_indices<sizeof...(_Types)>::type 276*4d6fc14bSjoerg >{}) 277*4d6fc14bSjoerg )::type; 278*4d6fc14bSjoerg#endif 279*4d6fc14bSjoerg 280*4d6fc14bSjoergtemplate <size_t _Ip, class ..._Types> 281*4d6fc14bSjoergstruct _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, __tuple_types<_Types...>> 282*4d6fc14bSjoerg{ 283*4d6fc14bSjoerg static_assert(_Ip < sizeof...(_Types), "tuple_element index out of range"); 284*4d6fc14bSjoerg typedef _LIBCPP_NODEBUG_TYPE __type_pack_element<_Ip, _Types...> type; 285*4d6fc14bSjoerg}; 286*4d6fc14bSjoerg 287*4d6fc14bSjoerg 288*4d6fc14bSjoergtemplate <class ..._Tp> 289*4d6fc14bSjoergstruct _LIBCPP_TEMPLATE_VIS tuple_size<__tuple_types<_Tp...> > 290*4d6fc14bSjoerg : public integral_constant<size_t, sizeof...(_Tp)> 291*4d6fc14bSjoerg{ 292*4d6fc14bSjoerg}; 293*4d6fc14bSjoerg 294*4d6fc14bSjoergtemplate <class... _Tp> struct __tuple_like<__tuple_types<_Tp...> > : true_type {}; 295*4d6fc14bSjoerg 296*4d6fc14bSjoergtemplate <bool _ApplyLV, bool _ApplyConst, bool _ApplyVolatile> 297*4d6fc14bSjoergstruct __apply_cv_mf; 298*4d6fc14bSjoergtemplate <> 299*4d6fc14bSjoergstruct __apply_cv_mf<false, false, false> { 300*4d6fc14bSjoerg template <class _Tp> using __apply = _Tp; 301*4d6fc14bSjoerg}; 302*4d6fc14bSjoergtemplate <> 303*4d6fc14bSjoergstruct __apply_cv_mf<false, true, false> { 304*4d6fc14bSjoerg template <class _Tp> using __apply _LIBCPP_NODEBUG_TYPE = const _Tp; 305*4d6fc14bSjoerg}; 306*4d6fc14bSjoergtemplate <> 307*4d6fc14bSjoergstruct __apply_cv_mf<false, false, true> { 308*4d6fc14bSjoerg template <class _Tp> using __apply _LIBCPP_NODEBUG_TYPE = volatile _Tp; 309*4d6fc14bSjoerg}; 310*4d6fc14bSjoergtemplate <> 311*4d6fc14bSjoergstruct __apply_cv_mf<false, true, true> { 312*4d6fc14bSjoerg template <class _Tp> using __apply _LIBCPP_NODEBUG_TYPE = const volatile _Tp; 313*4d6fc14bSjoerg}; 314*4d6fc14bSjoergtemplate <> 315*4d6fc14bSjoergstruct __apply_cv_mf<true, false, false> { 316*4d6fc14bSjoerg template <class _Tp> using __apply _LIBCPP_NODEBUG_TYPE = _Tp&; 317*4d6fc14bSjoerg}; 318*4d6fc14bSjoergtemplate <> 319*4d6fc14bSjoergstruct __apply_cv_mf<true, true, false> { 320*4d6fc14bSjoerg template <class _Tp> using __apply _LIBCPP_NODEBUG_TYPE = const _Tp&; 321*4d6fc14bSjoerg}; 322*4d6fc14bSjoergtemplate <> 323*4d6fc14bSjoergstruct __apply_cv_mf<true, false, true> { 324*4d6fc14bSjoerg template <class _Tp> using __apply _LIBCPP_NODEBUG_TYPE = volatile _Tp&; 325*4d6fc14bSjoerg}; 326*4d6fc14bSjoergtemplate <> 327*4d6fc14bSjoergstruct __apply_cv_mf<true, true, true> { 328*4d6fc14bSjoerg template <class _Tp> using __apply _LIBCPP_NODEBUG_TYPE = const volatile _Tp&; 329*4d6fc14bSjoerg}; 330*4d6fc14bSjoergtemplate <class _Tp, class _RawTp = typename remove_reference<_Tp>::type> 331*4d6fc14bSjoergusing __apply_cv_t _LIBCPP_NODEBUG_TYPE = __apply_cv_mf< 332*4d6fc14bSjoerg is_lvalue_reference<_Tp>::value, 333*4d6fc14bSjoerg is_const<_RawTp>::value, 334*4d6fc14bSjoerg is_volatile<_RawTp>::value>; 335*4d6fc14bSjoerg 336*4d6fc14bSjoerg// __make_tuple_types 337*4d6fc14bSjoerg 338*4d6fc14bSjoerg// __make_tuple_types<_Tuple<_Types...>, _Ep, _Sp>::type is a 339*4d6fc14bSjoerg// __tuple_types<_Types...> using only those _Types in the range [_Sp, _Ep). 340*4d6fc14bSjoerg// _Sp defaults to 0 and _Ep defaults to tuple_size<_Tuple>. If _Tuple is a 341*4d6fc14bSjoerg// lvalue_reference type, then __tuple_types<_Types&...> is the result. 342*4d6fc14bSjoerg 343*4d6fc14bSjoergtemplate <class _TupleTypes, class _TupleIndices> 344*4d6fc14bSjoergstruct __make_tuple_types_flat; 345*4d6fc14bSjoerg 346*4d6fc14bSjoergtemplate <template <class...> class _Tuple, class ..._Types, size_t ..._Idx> 347*4d6fc14bSjoergstruct __make_tuple_types_flat<_Tuple<_Types...>, __tuple_indices<_Idx...>> { 348*4d6fc14bSjoerg // Specialization for pair, tuple, and __tuple_types 349*4d6fc14bSjoerg template <class _Tp, class _ApplyFn = __apply_cv_t<_Tp>> 350*4d6fc14bSjoerg using __apply_quals _LIBCPP_NODEBUG_TYPE = __tuple_types< 351*4d6fc14bSjoerg typename _ApplyFn::template __apply<__type_pack_element<_Idx, _Types...>>... 352*4d6fc14bSjoerg >; 353*4d6fc14bSjoerg}; 354*4d6fc14bSjoerg 355*4d6fc14bSjoergtemplate <class _Vt, size_t _Np, size_t ..._Idx> 356*4d6fc14bSjoergstruct __make_tuple_types_flat<array<_Vt, _Np>, __tuple_indices<_Idx...>> { 357*4d6fc14bSjoerg template <size_t> 358*4d6fc14bSjoerg using __value_type = _Vt; 359*4d6fc14bSjoerg template <class _Tp, class _ApplyFn = __apply_cv_t<_Tp>> 360*4d6fc14bSjoerg using __apply_quals = __tuple_types< 361*4d6fc14bSjoerg typename _ApplyFn::template __apply<__value_type<_Idx>>... 362*4d6fc14bSjoerg >; 363*4d6fc14bSjoerg}; 364*4d6fc14bSjoerg 365*4d6fc14bSjoergtemplate <class _Tp, size_t _Ep = tuple_size<typename remove_reference<_Tp>::type>::value, 366*4d6fc14bSjoerg size_t _Sp = 0, 367*4d6fc14bSjoerg bool _SameSize = (_Ep == tuple_size<typename remove_reference<_Tp>::type>::value)> 368*4d6fc14bSjoergstruct __make_tuple_types 369*4d6fc14bSjoerg{ 370*4d6fc14bSjoerg static_assert(_Sp <= _Ep, "__make_tuple_types input error"); 371*4d6fc14bSjoerg using _RawTp = typename remove_cv<typename remove_reference<_Tp>::type>::type; 372*4d6fc14bSjoerg using _Maker = __make_tuple_types_flat<_RawTp, typename __make_tuple_indices<_Ep, _Sp>::type>; 373*4d6fc14bSjoerg using type = typename _Maker::template __apply_quals<_Tp>; 374*4d6fc14bSjoerg}; 375*4d6fc14bSjoerg 376*4d6fc14bSjoergtemplate <class ..._Types, size_t _Ep> 377*4d6fc14bSjoergstruct __make_tuple_types<tuple<_Types...>, _Ep, 0, true> { 378*4d6fc14bSjoerg typedef _LIBCPP_NODEBUG_TYPE __tuple_types<_Types...> type; 379*4d6fc14bSjoerg}; 380*4d6fc14bSjoerg 381*4d6fc14bSjoergtemplate <class ..._Types, size_t _Ep> 382*4d6fc14bSjoergstruct __make_tuple_types<__tuple_types<_Types...>, _Ep, 0, true> { 383*4d6fc14bSjoerg typedef _LIBCPP_NODEBUG_TYPE __tuple_types<_Types...> type; 384*4d6fc14bSjoerg}; 385*4d6fc14bSjoerg 386*4d6fc14bSjoergtemplate <bool ..._Preds> 387*4d6fc14bSjoergstruct __all_dummy; 388*4d6fc14bSjoerg 389*4d6fc14bSjoergtemplate <bool ..._Pred> 390*4d6fc14bSjoergusing __all = _IsSame<__all_dummy<_Pred...>, __all_dummy<((void)_Pred, true)...>>; 391*4d6fc14bSjoerg 392*4d6fc14bSjoergstruct __tuple_sfinae_base { 393*4d6fc14bSjoerg template <template <class, class...> class _Trait, 394*4d6fc14bSjoerg class ..._LArgs, class ..._RArgs> 395*4d6fc14bSjoerg static auto __do_test(__tuple_types<_LArgs...>, __tuple_types<_RArgs...>) 396*4d6fc14bSjoerg -> __all<typename enable_if<_Trait<_LArgs, _RArgs>::value, bool>::type{true}...>; 397*4d6fc14bSjoerg template <template <class...> class> 398*4d6fc14bSjoerg static auto __do_test(...) -> false_type; 399*4d6fc14bSjoerg 400*4d6fc14bSjoerg template <class _FromArgs, class _ToArgs> 401*4d6fc14bSjoerg using __constructible = decltype(__do_test<is_constructible>(_ToArgs{}, _FromArgs{})); 402*4d6fc14bSjoerg template <class _FromArgs, class _ToArgs> 403*4d6fc14bSjoerg using __convertible = decltype(__do_test<is_convertible>(_FromArgs{}, _ToArgs{})); 404*4d6fc14bSjoerg template <class _FromArgs, class _ToArgs> 405*4d6fc14bSjoerg using __assignable = decltype(__do_test<is_assignable>(_ToArgs{}, _FromArgs{})); 406*4d6fc14bSjoerg}; 407*4d6fc14bSjoerg 408*4d6fc14bSjoerg// __tuple_convertible 409*4d6fc14bSjoerg 410*4d6fc14bSjoergtemplate <class _Tp, class _Up, bool = __tuple_like<typename remove_reference<_Tp>::type>::value, 411*4d6fc14bSjoerg bool = __tuple_like<_Up>::value> 412*4d6fc14bSjoergstruct __tuple_convertible 413*4d6fc14bSjoerg : public false_type {}; 414*4d6fc14bSjoerg 415*4d6fc14bSjoergtemplate <class _Tp, class _Up> 416*4d6fc14bSjoergstruct __tuple_convertible<_Tp, _Up, true, true> 417*4d6fc14bSjoerg : public __tuple_sfinae_base::__convertible< 418*4d6fc14bSjoerg typename __make_tuple_types<_Tp>::type 419*4d6fc14bSjoerg , typename __make_tuple_types<_Up>::type 420*4d6fc14bSjoerg > 421*4d6fc14bSjoerg{}; 422*4d6fc14bSjoerg 423*4d6fc14bSjoerg// __tuple_constructible 424*4d6fc14bSjoerg 425*4d6fc14bSjoergtemplate <class _Tp, class _Up, bool = __tuple_like<typename remove_reference<_Tp>::type>::value, 426*4d6fc14bSjoerg bool = __tuple_like<_Up>::value> 427*4d6fc14bSjoergstruct __tuple_constructible 428*4d6fc14bSjoerg : public false_type {}; 429*4d6fc14bSjoerg 430*4d6fc14bSjoergtemplate <class _Tp, class _Up> 431*4d6fc14bSjoergstruct __tuple_constructible<_Tp, _Up, true, true> 432*4d6fc14bSjoerg : public __tuple_sfinae_base::__constructible< 433*4d6fc14bSjoerg typename __make_tuple_types<_Tp>::type 434*4d6fc14bSjoerg , typename __make_tuple_types<_Up>::type 435*4d6fc14bSjoerg > 436*4d6fc14bSjoerg{}; 437*4d6fc14bSjoerg 438*4d6fc14bSjoerg// __tuple_assignable 439*4d6fc14bSjoerg 440*4d6fc14bSjoergtemplate <class _Tp, class _Up, bool = __tuple_like<typename remove_reference<_Tp>::type>::value, 441*4d6fc14bSjoerg bool = __tuple_like<_Up>::value> 442*4d6fc14bSjoergstruct __tuple_assignable 443*4d6fc14bSjoerg : public false_type {}; 444*4d6fc14bSjoerg 445*4d6fc14bSjoergtemplate <class _Tp, class _Up> 446*4d6fc14bSjoergstruct __tuple_assignable<_Tp, _Up, true, true> 447*4d6fc14bSjoerg : public __tuple_sfinae_base::__assignable< 448*4d6fc14bSjoerg typename __make_tuple_types<_Tp>::type 449*4d6fc14bSjoerg , typename __make_tuple_types<_Up&>::type 450*4d6fc14bSjoerg > 451*4d6fc14bSjoerg{}; 452*4d6fc14bSjoerg 453*4d6fc14bSjoerg 454*4d6fc14bSjoergtemplate <size_t _Ip, class ..._Tp> 455*4d6fc14bSjoergstruct _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, tuple<_Tp...> > 456*4d6fc14bSjoerg{ 457*4d6fc14bSjoerg typedef _LIBCPP_NODEBUG_TYPE typename tuple_element<_Ip, __tuple_types<_Tp...> >::type type; 458*4d6fc14bSjoerg}; 459*4d6fc14bSjoerg 460*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 11 461*4d6fc14bSjoergtemplate <size_t _Ip, class ..._Tp> 462*4d6fc14bSjoergusing tuple_element_t _LIBCPP_NODEBUG_TYPE = typename tuple_element <_Ip, _Tp...>::type; 463*4d6fc14bSjoerg#endif 464*4d6fc14bSjoerg 465*4d6fc14bSjoergtemplate <bool _IsTuple, class _SizeTrait, size_t _Expected> 466*4d6fc14bSjoergstruct __tuple_like_with_size_imp : false_type {}; 467*4d6fc14bSjoerg 468*4d6fc14bSjoergtemplate <class _SizeTrait, size_t _Expected> 469*4d6fc14bSjoergstruct __tuple_like_with_size_imp<true, _SizeTrait, _Expected> 470*4d6fc14bSjoerg : integral_constant<bool, _SizeTrait::value == _Expected> {}; 471*4d6fc14bSjoerg 472*4d6fc14bSjoergtemplate <class _Tuple, size_t _ExpectedSize, 473*4d6fc14bSjoerg class _RawTuple = typename __uncvref<_Tuple>::type> 474*4d6fc14bSjoergusing __tuple_like_with_size _LIBCPP_NODEBUG_TYPE = __tuple_like_with_size_imp< 475*4d6fc14bSjoerg __tuple_like<_RawTuple>::value, 476*4d6fc14bSjoerg tuple_size<_RawTuple>, _ExpectedSize 477*4d6fc14bSjoerg >; 478*4d6fc14bSjoerg 479*4d6fc14bSjoergstruct _LIBCPP_TYPE_VIS __check_tuple_constructor_fail { 480*4d6fc14bSjoerg 481*4d6fc14bSjoerg static constexpr bool __enable_explicit_default() { return false; } 482*4d6fc14bSjoerg static constexpr bool __enable_implicit_default() { return false; } 483*4d6fc14bSjoerg template <class ...> 484*4d6fc14bSjoerg static constexpr bool __enable_explicit() { return false; } 485*4d6fc14bSjoerg template <class ...> 486*4d6fc14bSjoerg static constexpr bool __enable_implicit() { return false; } 487*4d6fc14bSjoerg template <class ...> 488*4d6fc14bSjoerg static constexpr bool __enable_assign() { return false; } 489*4d6fc14bSjoerg}; 490*4d6fc14bSjoerg#endif // !defined(_LIBCPP_CXX03_LANG) 491*4d6fc14bSjoerg 492*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 14 493*4d6fc14bSjoerg 494*4d6fc14bSjoergtemplate <bool _CanCopy, bool _CanMove> 495*4d6fc14bSjoergstruct __sfinae_ctor_base {}; 496*4d6fc14bSjoergtemplate <> 497*4d6fc14bSjoergstruct __sfinae_ctor_base<false, false> { 498*4d6fc14bSjoerg __sfinae_ctor_base() = default; 499*4d6fc14bSjoerg __sfinae_ctor_base(__sfinae_ctor_base const&) = delete; 500*4d6fc14bSjoerg __sfinae_ctor_base(__sfinae_ctor_base &&) = delete; 501*4d6fc14bSjoerg __sfinae_ctor_base& operator=(__sfinae_ctor_base const&) = default; 502*4d6fc14bSjoerg __sfinae_ctor_base& operator=(__sfinae_ctor_base&&) = default; 503*4d6fc14bSjoerg}; 504*4d6fc14bSjoergtemplate <> 505*4d6fc14bSjoergstruct __sfinae_ctor_base<true, false> { 506*4d6fc14bSjoerg __sfinae_ctor_base() = default; 507*4d6fc14bSjoerg __sfinae_ctor_base(__sfinae_ctor_base const&) = default; 508*4d6fc14bSjoerg __sfinae_ctor_base(__sfinae_ctor_base &&) = delete; 509*4d6fc14bSjoerg __sfinae_ctor_base& operator=(__sfinae_ctor_base const&) = default; 510*4d6fc14bSjoerg __sfinae_ctor_base& operator=(__sfinae_ctor_base&&) = default; 511*4d6fc14bSjoerg}; 512*4d6fc14bSjoergtemplate <> 513*4d6fc14bSjoergstruct __sfinae_ctor_base<false, true> { 514*4d6fc14bSjoerg __sfinae_ctor_base() = default; 515*4d6fc14bSjoerg __sfinae_ctor_base(__sfinae_ctor_base const&) = delete; 516*4d6fc14bSjoerg __sfinae_ctor_base(__sfinae_ctor_base &&) = default; 517*4d6fc14bSjoerg __sfinae_ctor_base& operator=(__sfinae_ctor_base const&) = default; 518*4d6fc14bSjoerg __sfinae_ctor_base& operator=(__sfinae_ctor_base&&) = default; 519*4d6fc14bSjoerg}; 520*4d6fc14bSjoerg 521*4d6fc14bSjoergtemplate <bool _CanCopy, bool _CanMove> 522*4d6fc14bSjoergstruct __sfinae_assign_base {}; 523*4d6fc14bSjoergtemplate <> 524*4d6fc14bSjoergstruct __sfinae_assign_base<false, false> { 525*4d6fc14bSjoerg __sfinae_assign_base() = default; 526*4d6fc14bSjoerg __sfinae_assign_base(__sfinae_assign_base const&) = default; 527*4d6fc14bSjoerg __sfinae_assign_base(__sfinae_assign_base &&) = default; 528*4d6fc14bSjoerg __sfinae_assign_base& operator=(__sfinae_assign_base const&) = delete; 529*4d6fc14bSjoerg __sfinae_assign_base& operator=(__sfinae_assign_base&&) = delete; 530*4d6fc14bSjoerg}; 531*4d6fc14bSjoergtemplate <> 532*4d6fc14bSjoergstruct __sfinae_assign_base<true, false> { 533*4d6fc14bSjoerg __sfinae_assign_base() = default; 534*4d6fc14bSjoerg __sfinae_assign_base(__sfinae_assign_base const&) = default; 535*4d6fc14bSjoerg __sfinae_assign_base(__sfinae_assign_base &&) = default; 536*4d6fc14bSjoerg __sfinae_assign_base& operator=(__sfinae_assign_base const&) = default; 537*4d6fc14bSjoerg __sfinae_assign_base& operator=(__sfinae_assign_base&&) = delete; 538*4d6fc14bSjoerg}; 539*4d6fc14bSjoergtemplate <> 540*4d6fc14bSjoergstruct __sfinae_assign_base<false, true> { 541*4d6fc14bSjoerg __sfinae_assign_base() = default; 542*4d6fc14bSjoerg __sfinae_assign_base(__sfinae_assign_base const&) = default; 543*4d6fc14bSjoerg __sfinae_assign_base(__sfinae_assign_base &&) = default; 544*4d6fc14bSjoerg __sfinae_assign_base& operator=(__sfinae_assign_base const&) = delete; 545*4d6fc14bSjoerg __sfinae_assign_base& operator=(__sfinae_assign_base&&) = default; 546*4d6fc14bSjoerg}; 547*4d6fc14bSjoerg#endif // _LIBCPP_STD_VER > 14 548*4d6fc14bSjoerg 549*4d6fc14bSjoerg_LIBCPP_END_NAMESPACE_STD 550*4d6fc14bSjoerg 551*4d6fc14bSjoerg#endif // _LIBCPP___TUPLE 552