[v2,4/5] libstdc++: Refactor __mdspan::__static_quotient.

Message ID 20250911113917.350920-5-luc.grosheintz@gmail.com
State New
Headers
Series libstdc++: Implement std::layout_left_padded. |

Commit Message

Luc Grosheintz Sept. 11, 2025, 11:39 a.m. UTC
  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.

Signed-off-by: Luc Grosheintz <luc.grosheintz@gmail.com>
---
 libstdc++-v3/include/std/mdspan | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)
  

Comments

Tomasz Kamiński Sept. 11, 2025, 11:58 a.m. UTC | #1
On Thu, Sep 11, 2025 at 1:48 PM Luc Grosheintz <luc.grosheintz@gmail.com>
wrote:

> 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.
>
> Signed-off-by: Luc Grosheintz <luc.grosheintz@gmail.com>
> ---
>
LGTM.

>  libstdc++-v3/include/std/mdspan | 19 ++++++++++++++-----
>  1 file changed, 14 insertions(+), 5 deletions(-)
>
> diff --git a/libstdc++-v3/include/std/mdspan
> b/libstdc++-v3/include/std/mdspan
> index 01d3b2cb6b1..9dd0c85f5b0 100644
> --- a/libstdc++-v3/include/std/mdspan
> +++ b/libstdc++-v3/include/std/mdspan
> @@ -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
> --
> 2.50.1
>
>
  

Patch

diff --git a/libstdc++-v3/include/std/mdspan b/libstdc++-v3/include/std/mdspan
index 01d3b2cb6b1..9dd0c85f5b0 100644
--- a/libstdc++-v3/include/std/mdspan
+++ b/libstdc++-v3/include/std/mdspan
@@ -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