aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2019-09-26 17:08:44 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2019-09-26 17:08:44 +0100
commitc9fb0a85b68d1465ad1a88509a39190c27109c69 (patch)
tree715528007acbefeb5d2976bff5a494c2a97d2a03
parent7a9942f52157987785e964fe602306d477d1885e (diff)
downloadgcc-c9fb0a85b68d1465ad1a88509a39190c27109c69.zip
gcc-c9fb0a85b68d1465ad1a88509a39190c27109c69.tar.gz
gcc-c9fb0a85b68d1465ad1a88509a39190c27109c69.tar.bz2
Define std::to_array for Debug Mode
* include/debug/array (to_array): Define for debug mode. From-SVN: r276155
-rw-r--r--libstdc++-v3/ChangeLog2
-rw-r--r--libstdc++-v3/include/debug/array39
2 files changed, 41 insertions, 0 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 83e3225..4b8bc7a 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -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)):
diff --git a/libstdc++-v3/include/debug/array b/libstdc++-v3/include/debug/array
index 9e94e65..2f8eb84 100644
--- a/libstdc++-v3/include/debug/array
+++ b/libstdc++-v3/include/debug/array
@@ -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