[PATCH v2] libstdc++: Improve and cleanup mdspan related code.

Tomasz Kamiński tkaminsk@redhat.com
Fri Oct 3 10:48:55 GMT 2025


From: Luc Grosheintz <luc.grosheintz@gmail.com>

The improvement is that in __index_type_cast, we don't need to check at
runtime if we know that _IndexType is smaller than _OIndexType.

The cleanup is whitespace (overlength lines) in <mdspan> and
de-uglifying a variable in test code.

libstdc++-v3/ChangeLog:

	* include/std/mdspan (__mdspan::__index_type_cast): Optimize by
	skipping a __glibcxx_assert if it's know at compile-time.
	* testsuite/23_containers/mdspan/int_like.h: Rename _M_i to
	value.

Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
Signed-off-by: Luc Grosheintz <luc.grosheintz@gmail.com>
---
v2 revers few whitespace changes.

 libstdc++-v3/include/std/mdspan                  | 16 +++++++++++-----
 .../testsuite/23_containers/mdspan/int_like.h    | 12 ++++++------
 2 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/libstdc++-v3/include/std/mdspan b/libstdc++-v3/include/std/mdspan
index ce7e4178f67..469d4c3cb6c 100644
--- a/libstdc++-v3/include/std/mdspan
+++ b/libstdc++-v3/include/std/mdspan
@@ -77,11 +77,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       {
 	if constexpr (std::is_integral_v<_OIndexType>)
 	  {
-	    __glibcxx_assert(cmp_less_equal(__other,
-		__gnu_cxx::__int_traits<_IndexType>::__max));
+	    constexpr _IndexType __index_type_max
+	      = __gnu_cxx::__int_traits<_IndexType>::__max;
+	    constexpr _OIndexType __oindex_type_max
+	      = __gnu_cxx::__int_traits<_OIndexType>::__max;
+
+	    if constexpr (__index_type_max < __oindex_type_max)
+	      __glibcxx_assert(cmp_less_equal(__other, __index_type_max));
+
 	    if constexpr (std::is_signed_v<_OIndexType>)
-	      __glibcxx_assert(__other >= 0);
-	    return std::move(__other);
+	      __glibcxx_assert(__other >=  0);
+	    return static_cast<_IndexType>(std::move(__other));
 	  }
 	else
 	  {
@@ -981,7 +987,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       template<class _RightPaddedMapping>
 	requires __mdspan::__is_right_padded_mapping<_RightPaddedMapping>
 		 && is_constructible_v<extents_type,
-				       typename _RightPaddedMapping::extents_type>
+		      typename _RightPaddedMapping::extents_type>
 	constexpr
 	explicit(!is_convertible_v<typename _RightPaddedMapping::extents_type,
 				   extents_type>)
diff --git a/libstdc++-v3/testsuite/23_containers/mdspan/int_like.h b/libstdc++-v3/testsuite/23_containers/mdspan/int_like.h
index 310dd8ddf20..e9172c13455 100644
--- a/libstdc++-v3/testsuite/23_containers/mdspan/int_like.h
+++ b/libstdc++-v3/testsuite/23_containers/mdspan/int_like.h
@@ -15,7 +15,7 @@ template<CustomIndexKind Kind>
   public:
     explicit
     CustomIndexType(int i)
-    : _M_i(i)
+    : value(i)
     { }
 
     CustomIndexType() = delete;
@@ -31,25 +31,25 @@ template<CustomIndexKind Kind>
     constexpr
     operator int() const noexcept
     requires (Kind == CustomIndexKind::Const)
-    { return _M_i; }
+    { return value; }
 
     constexpr
     operator int() const
     requires (Kind == CustomIndexKind::Throwing)
-    { return _M_i; }
+    { return value; }
 
     constexpr
     operator int() noexcept
     requires (Kind == CustomIndexKind::Mutating)
-    { return _M_i; }
+    { return value; }
 
     constexpr
     operator int() && noexcept
     requires (Kind == CustomIndexKind::RValue)
-    { return _M_i; }
+    { return value; }
 
   private:
-    int _M_i;
+    int value;
   };
 
 using IntLike = CustomIndexType<CustomIndexKind::Const>;
-- 
2.51.0



More information about the Libstdc++ mailing list