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.

Signed-off-by: Luc Grosheintz <[email protected]>
---
 libstdc++-v3/include/std/mdspan               | 25 +++++++++++++------
 .../testsuite/23_containers/mdspan/int_like.h | 12 ++++-----
 2 files changed, 23 insertions(+), 14 deletions(-)

diff --git a/libstdc++-v3/include/std/mdspan b/libstdc++-v3/include/std/mdspan
index d0a60b2d183..8efd168bcf0 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
          {
@@ -510,7 +516,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       __fwd_prod(const _Extents& __exts, size_t __begin, size_t __end) noexcept
       {
        size_t __sta_prod = [__begin, __end] {
-         span<const size_t> __sta_exts = __static_extents<_Extents>(__begin, 
__end);
+         span<const size_t> __sta_exts = __static_extents<_Extents>(__begin,
+                                                                    __end);
          size_t __ret = 1;
          for(auto __ext : __sta_exts)
            if (__ext != dynamic_extent)
@@ -726,7 +733,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
     template<typename _Layout, typename _Mapping>
       concept __mapping_of =
-       is_same_v<typename _Layout::template mapping<typename 
_Mapping::extents_type>,
+       is_same_v<typename _Layout::template mapping<
+                   typename _Mapping::extents_type>,
                  _Mapping>;
 
     template<template<size_t> typename _Layout, typename _Mapping>
@@ -981,7 +989,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>)
@@ -994,7 +1002,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
          if constexpr (__rank > 1)
            {
-             if constexpr (extents_type::static_extent(__rank - 1) != 
dynamic_extent
+             if constexpr (extents_type::static_extent(__rank - 1)
+                           != dynamic_extent
                  && __ostride_sta != dynamic_extent)
                static_assert(extents_type::static_extent(__rank - 1)
                    == __ostride_sta);
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.50.1

Reply via email to