@@ -232,7 +232,6 @@ template <class... Types>
232
232
# include < __memory/uses_allocator.h>
233
233
# include < __tuple/find_index.h>
234
234
# include < __tuple/ignore.h>
235
- # include < __tuple/make_tuple_types.h>
236
235
# include < __tuple/tuple_element.h>
237
236
# include < __tuple/tuple_like.h>
238
237
# include < __tuple/tuple_like_ext.h>
@@ -534,11 +533,10 @@ struct _LIBCPP_DECLSPEC_EMPTY_BASES
534
533
535
534
template <class _Tuple >
536
535
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 __tuple_impl (__from_tuple, _Tuple&& __t ) noexcept (
537
- (__all<is_nothrow_constructible<
538
- _Tp,
539
- typename tuple_element<_Indx, typename __make_tuple_types<_Tuple>::type>::type>::value...>::value))
536
+ (__all<is_nothrow_constructible<_Tp, __copy_cvref_t <_Tuple, __tuple_element_t <_Indx, __remove_cvref_t <_Tuple>>>>::
537
+ value...>::value))
540
538
: __tuple_leaf<_Indx, _Tp>(
541
- std::forward<typename tuple_element <_Indx, typename __make_tuple_types <_Tuple>::type>::type >(
539
+ std::forward<__copy_cvref_t <_Tuple, __tuple_element_t <_Indx, __remove_cvref_t <_Tuple>>> >(
542
540
std::get<_Indx>(__t )))... {}
543
541
544
542
template <class _Alloc , class _Tuple >
@@ -547,9 +545,9 @@ struct _LIBCPP_DECLSPEC_EMPTY_BASES
547
545
: __tuple_leaf<_Indx, _Tp>(
548
546
__uses_alloc_ctor<_Tp,
549
547
_Alloc,
550
- typename tuple_element <_Indx, typename __make_tuple_types <_Tuple>::type>::type >(),
548
+ __copy_cvref_t <_Tuple, __tuple_element_t <_Indx, __remove_cvref_t <_Tuple>>> >(),
551
549
__a,
552
- std::forward<typename tuple_element <_Indx, typename __make_tuple_types <_Tuple>::type>::type >(
550
+ std::forward<__copy_cvref_t <_Tuple, __tuple_element_t <_Indx, __remove_cvref_t <_Tuple>>> >(
553
551
std::get<_Indx>(__t )))... {}
554
552
555
553
__tuple_impl (const __tuple_impl&) = default ;
@@ -1272,47 +1270,36 @@ operator<=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) {
1272
1270
1273
1271
// tuple_cat
1274
1272
1275
- template <class _Tp , class _Up >
1276
- struct __tuple_cat_type ;
1273
+ template <class ... _Tuples >
1274
+ struct __tuple_cat_return_impl ;
1277
1275
1278
- template <class ... _Ttypes, class ... _Utypes >
1279
- struct __tuple_cat_type <tuple<_Ttypes...>, __tuple_types<_Utypes...> > {
1280
- using type _LIBCPP_NODEBUG = tuple<_Ttypes..., _Utypes...> ;
1276
+ template <class _Tuple >
1277
+ struct __tuple_cat_return_impl <_Tuple > {
1278
+ using type _LIBCPP_NODEBUG = _Tuple ;
1281
1279
};
1282
1280
1283
- template <class _ResultTuple , bool _Is_Tuple0TupleLike, class ... _Tuples>
1284
- struct __tuple_cat_return_1 {};
1281
+ template <class ... _Types0, template <class ...> class _Tuple , class ... _Types1, class ... _Tuples>
1282
+ struct __tuple_cat_return_impl <tuple<_Types0...>, _Tuple<_Types1...>, _Tuples...>
1283
+ : __tuple_cat_return_impl<tuple<_Types0..., _Types1...>, _Tuples...> {};
1285
1284
1286
- template <class ... _Types, class _Tuple0 >
1287
- struct __tuple_cat_return_1 <tuple<_Types...>, true , _Tuple0> {
1288
- using type _LIBCPP_NODEBUG =
1289
- typename __tuple_cat_type< tuple<_Types...>,
1290
- typename __make_tuple_types<__remove_cvref_t <_Tuple0> >::type >::type;
1291
- };
1285
+ template <class , class , class >
1286
+ struct __tuple_cat_array ;
1292
1287
1293
- template <class ... _Types, class _Tuple0 , class _Tuple1 , class ... _Tuples>
1294
- struct __tuple_cat_return_1 <tuple<_Types...>, true , _Tuple0, _Tuple1, _Tuples...>
1295
- : public __tuple_cat_return_1<
1296
- typename __tuple_cat_type< tuple<_Types...>,
1297
- typename __make_tuple_types<__remove_cvref_t <_Tuple0> >::type >::type,
1298
- __tuple_like_ext<__libcpp_remove_reference_t <_Tuple1> >::value,
1299
- _Tuple1,
1300
- _Tuples...> {};
1288
+ template <class ... _Types, class _ValueT , size_t ... _Indices>
1289
+ struct __tuple_cat_array <tuple<_Types...>, _ValueT, __index_sequence<_Indices...>> {
1290
+ template <size_t >
1291
+ using __value_type = _ValueT;
1301
1292
1302
- template < class ... _Tuples>
1303
- struct __tuple_cat_return ;
1293
+ using type _LIBCPP_NODEBUG = tuple<_Types ..., __value_type<_Indices>...>;
1294
+ } ;
1304
1295
1305
- template <class _Tuple0 , class ... _Tuples>
1306
- struct __tuple_cat_return <_Tuple0, _Tuples...>
1307
- : public __tuple_cat_return_1<tuple<>,
1308
- __tuple_like_ext<__libcpp_remove_reference_t <_Tuple0> >::value,
1309
- _Tuple0,
1310
- _Tuples...> {};
1296
+ template <class ... _Types, class _ValueT , size_t _Np, class ... _Tuples>
1297
+ struct __tuple_cat_return_impl <tuple<_Types...>, array<_ValueT, _Np>, _Tuples...>
1298
+ : __tuple_cat_return_impl<typename __tuple_cat_array<tuple<_Types...>, _ValueT, __make_index_sequence<_Np>>::type,
1299
+ _Tuples...> {};
1311
1300
1312
- template <>
1313
- struct __tuple_cat_return <> {
1314
- using type _LIBCPP_NODEBUG = tuple<>;
1315
- };
1301
+ template <class ... _Tuples>
1302
+ using __tuple_cat_return_t = typename __tuple_cat_return_impl<tuple<>, __remove_cvref_t <_Tuples>...>::type;
1316
1303
1317
1304
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 tuple<> tuple_cat () { return tuple<>(); }
1318
1305
@@ -1381,11 +1368,15 @@ __tuple_cat_select_element_wise(_TupleSrc&& __src, __index_sequence<_Indices...>
1381
1368
return _TupleDst (std::get<_Indices>(std::forward<_TupleSrc>(__src))...);
1382
1369
}
1383
1370
1384
- template <class _Tuple0 , class ... _Tuples>
1385
- inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 typename __tuple_cat_return<_Tuple0, _Tuples...>::type
1371
+ template <class _Tuple0 ,
1372
+ class ... _Tuples,
1373
+ __enable_if_t <
1374
+ _And<__tuple_like_ext<__remove_cvref_t <_Tuple0>>, __tuple_like_ext<__remove_cvref_t <_Tuples>>...>::value,
1375
+ int > = 0 >
1376
+ inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 __tuple_cat_return_t <_Tuple0, _Tuples...>
1386
1377
tuple_cat (_Tuple0&& __t0, _Tuples&&... __tpls) {
1387
1378
using _T0 _LIBCPP_NODEBUG = __libcpp_remove_reference_t <_Tuple0>;
1388
- using _TRet _LIBCPP_NODEBUG = typename __tuple_cat_return <_Tuple0, _Tuples...>::type ;
1379
+ using _TRet _LIBCPP_NODEBUG = __tuple_cat_return_t <_Tuple0, _Tuples...>;
1389
1380
using _T0Indices _LIBCPP_NODEBUG = __make_index_sequence<tuple_size<_T0>::value>;
1390
1381
using _TRetIndices _LIBCPP_NODEBUG = __make_index_sequence<tuple_size<_TRet>::value>;
1391
1382
return std::__tuple_cat_select_element_wise<_TRet>(
0 commit comments