[v2,4/5] libstdc++: Refactor __mdspan::__static_quotient.
Commit Message
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
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
>
>
@@ -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