]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Refactor __mdspan::__static_quotient.
authorLuc Grosheintz <luc.grosheintz@gmail.com>
Tue, 23 Sep 2025 13:10:04 +0000 (15:10 +0200)
committerTomasz Kamiński <tkaminsk@redhat.com>
Thu, 25 Sep 2025 13:55:43 +0000 (15:55 +0200)
For padded layouts we want to check that the product of the
padded stride with the remaining extents is representable.

Creating a second overload, allows passing in subspans of the
static extents and retains the ergonomics for the common case
of passing in all static extents.

libstdc++-v3/ChangeLog:

* include/std/mdspan (__static_quotient): New overload.

Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
Signed-off-by: Luc Grosheintz <luc.grosheintz@gmail.com>
libstdc++-v3/include/std/mdspan

index 01d3b2cb6b17ef2a611503113ccb89e5d39b88f1..d9b5152b69389899a050d8e471a0b11d4681ed8a 100644 (file)
@@ -597,13 +597,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        return __res;
       }
 
-    template<typename _Extents,
-             typename _IndexType = typename _Extents::index_type>
+    template<typename _IndexType>
       consteval _IndexType
-      __static_quotient(_IndexType __nom = __gnu_cxx::__int_traits<_IndexType>
-                                                   ::__max)
+      __static_quotient(std::span<const size_t> __sta_exts,
+       _IndexType __nom = __gnu_cxx::__int_traits<_IndexType>::__max)
       {
-       std::span<const size_t> __sta_exts = __static_extents<_Extents>();
        for (auto __factor : __sta_exts)
          {
            if (__factor != dynamic_extent)
@@ -614,6 +612,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        return __nom;
       }
 
+    template<typename _Extents,
+            typename _IndexType = typename _Extents::index_type>
+      requires __is_extents<_Extents>
+      consteval _IndexType
+      __static_quotient(_IndexType __nom
+                         = __gnu_cxx::__int_traits<_IndexType>::__max)
+      {
+       std::span<const size_t> __sta_exts = __static_extents<_Extents>();
+       return __static_quotient<_IndexType>(__sta_exts, __nom);
+      }
+
     template<typename _Extents>
       constexpr bool
       __is_representable_extents(const _Extents& __exts) noexcept