Define std::to_array for Debug Mode
authorJonathan Wakely <jwakely@redhat.com>
Thu, 26 Sep 2019 16:08:44 +0000 (17:08 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Thu, 26 Sep 2019 16:08:44 +0000 (17:08 +0100)
* include/debug/array (to_array): Define for debug mode.

From-SVN: r276155

libstdc++-v3/ChangeLog
libstdc++-v3/include/debug/array

index 83e3225a432d4bb1307368561fcff11338bbe1c2..4b8bc7ac50f7f51f6342c99f69b806a94fb7bcd3 100644 (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)):
index 9e94e656c0418a81cfd2f3447e70944023512322..2f8eb842eb88965bf96942dc8bafaf9285b1d476 100644 (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