Define std::to_array for Debug Mode

* include/debug/array (to_array): Define for debug mode.

From-SVN: r276155
This commit is contained in:
Jonathan Wakely 2019-09-26 17:08:44 +01:00 committed by Jonathan Wakely
parent 7a9942f521
commit c9fb0a85b6
2 changed files with 41 additions and 0 deletions

View File

@ -1,5 +1,7 @@
2019-09-26 Jonathan Wakely <jwakely@redhat.com>
* include/debug/array (to_array): Define for debug mode.
* include/bits/stl_pair.h (pair): Add _GLIBCXX20_CONSTEXPR to
piecewise construction constructor, assignment operators, and swap.
* include/std/tuple (pair::pair(piecewise_construct_t, tuple, tuple)):

View File

@ -314,6 +314,45 @@ namespace __debug
static_assert(_Int < _Nm, "index is out of bounds");
return std::move(__debug::get<_Int>(__arr));
}
#if __cplusplus > 201703L
#define __cpp_lib_to_array 201907L
template<bool _Move = false, typename _Tp, size_t... _Idx>
constexpr array<remove_cv_t<_Tp>, sizeof...(_Idx)>
__to_array(_Tp (&__a)[sizeof...(_Idx)], index_sequence<_Idx...>)
{
if constexpr (_Move)
return {{std::move(__a[_Idx])...}};
else
return {{__a[_Idx]...}};
}
template<typename _Tp, size_t _Nm>
constexpr array<remove_cv_t<_Tp>, _Nm>
to_array(_Tp (&__a)[_Nm])
noexcept(is_nothrow_constructible_v<_Tp, _Tp&>)
{
static_assert(!is_array_v<_Tp>);
static_assert(is_constructible_v<_Tp, _Tp&>);
if constexpr (is_constructible_v<_Tp, _Tp&>)
return __debug::__to_array(__a, make_index_sequence<_Nm>{});
__builtin_unreachable(); // FIXME: see PR c++/91388
}
template<typename _Tp, size_t _Nm>
constexpr array<remove_cv_t<_Tp>, _Nm>
to_array(_Tp (&&__a)[_Nm])
noexcept(is_nothrow_move_constructible_v<_Tp>)
{
static_assert(!is_array_v<_Tp>);
static_assert(is_move_constructible_v<_Tp>);
if constexpr (is_move_constructible_v<_Tp>)
return __debug::__to_array<1>(__a, make_index_sequence<_Nm>{});
__builtin_unreachable(); // FIXME: see PR c++/91388
}
#endif // C++20
} // namespace __debug
_GLIBCXX_BEGIN_NAMESPACE_VERSION