From 8f70e6ce6a0f63f6b7f62ebc31d870a307edce1a Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Sat, 29 Jun 2024 23:04:06 +0300 Subject: [PATCH 1/5] Inline `_Memcmp_ranges` that is used only once It is used only once after #4654 --- stl/inc/xutility | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/stl/inc/xutility b/stl/inc/xutility index 988196930f3..7b437385dc0 100644 --- a/stl/inc/xutility +++ b/stl/inc/xutility @@ -5381,15 +5381,6 @@ template constexpr bool _Equal_memcmp_is_safe = _Equal_memcmp_is_safe_helper, remove_const_t<_Iter2>, remove_const_t<_Pr>>; -template -_NODISCARD int _Memcmp_ranges(_CtgIt1 _First1, _CtgIt1 _Last1, _CtgIt2 _First2) { - _STL_INTERNAL_STATIC_ASSERT(sizeof(_Iter_value_t<_CtgIt1>) == sizeof(_Iter_value_t<_CtgIt2>)); - const auto _First1_ch = reinterpret_cast(_STD _To_address(_First1)); - const auto _Last1_ch = reinterpret_cast(_STD _To_address(_Last1)); - const auto _First2_ch = reinterpret_cast(_STD _To_address(_First2)); - return _CSTD memcmp(_First1_ch, _First2_ch, static_cast(_Last1_ch - _First1_ch)); -} - template _NODISCARD int _Memcmp_count(_CtgIt1 _First1, _CtgIt2 _First2, const size_t _Count) { _STL_INTERNAL_STATIC_ASSERT(sizeof(_Iter_value_t<_CtgIt1>) == sizeof(_Iter_value_t<_CtgIt2>)); @@ -5410,7 +5401,11 @@ _NODISCARD _CONSTEXPR20 bool equal(const _InIt1 _First1, const _InIt1 _Last1, co if (!_STD is_constant_evaluated()) #endif // _HAS_CXX20 { - return _STD _Memcmp_ranges(_UFirst1, _ULast1, _UFirst2) == 0; + _STL_INTERNAL_STATIC_ASSERT( + sizeof(_Iter_value_t) == sizeof(_Iter_value_t)); + const auto _First1_ch = reinterpret_cast(_STD _To_address(_First1)); + const auto _Last1_ch = reinterpret_cast(_STD _To_address(_Last1)); + return _CSTD memcmp(_First1_ch, _STD _To_address(_First2), static_cast(_Last1_ch - _First1_ch)); } } From 46abaf49bb2539010687a1c3f520797431d67348 Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Sat, 29 Jun 2024 23:09:29 +0300 Subject: [PATCH 2/5] missed zero comparison --- stl/inc/xutility | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/stl/inc/xutility b/stl/inc/xutility index 7b437385dc0..3d25a8cff80 100644 --- a/stl/inc/xutility +++ b/stl/inc/xutility @@ -5405,7 +5405,8 @@ _NODISCARD _CONSTEXPR20 bool equal(const _InIt1 _First1, const _InIt1 _Last1, co sizeof(_Iter_value_t) == sizeof(_Iter_value_t)); const auto _First1_ch = reinterpret_cast(_STD _To_address(_First1)); const auto _Last1_ch = reinterpret_cast(_STD _To_address(_Last1)); - return _CSTD memcmp(_First1_ch, _STD _To_address(_First2), static_cast(_Last1_ch - _First1_ch)); + return _CSTD memcmp(_First1_ch, _STD _To_address(_First2), static_cast(_Last1_ch - _First1_ch)) + == 0; } } From 82d7cdd03ffcf34d40b579b4f605b2b4033940c6 Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Sat, 29 Jun 2024 23:14:00 +0300 Subject: [PATCH 3/5] extract _Size rather than _Last1_ch --- stl/inc/xutility | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/stl/inc/xutility b/stl/inc/xutility index 3d25a8cff80..097afbed6dc 100644 --- a/stl/inc/xutility +++ b/stl/inc/xutility @@ -5404,9 +5404,9 @@ _NODISCARD _CONSTEXPR20 bool equal(const _InIt1 _First1, const _InIt1 _Last1, co _STL_INTERNAL_STATIC_ASSERT( sizeof(_Iter_value_t) == sizeof(_Iter_value_t)); const auto _First1_ch = reinterpret_cast(_STD _To_address(_First1)); - const auto _Last1_ch = reinterpret_cast(_STD _To_address(_Last1)); - return _CSTD memcmp(_First1_ch, _STD _To_address(_First2), static_cast(_Last1_ch - _First1_ch)) - == 0; + const auto _Size = + static_cast(reinterpret_cast(_STD _To_address(_Last1)) - _First1_ch); + return _CSTD memcmp(_First1_ch, _STD _To_address(_First2), _Size) == 0; } } From e9415d0787fbb4dce78ede74ceed672dac6274e5 Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Sat, 29 Jun 2024 23:15:10 +0300 Subject: [PATCH 4/5] avoid wrapping --- stl/inc/xutility | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/stl/inc/xutility b/stl/inc/xutility index 097afbed6dc..9f959fd1189 100644 --- a/stl/inc/xutility +++ b/stl/inc/xutility @@ -5404,9 +5404,8 @@ _NODISCARD _CONSTEXPR20 bool equal(const _InIt1 _First1, const _InIt1 _Last1, co _STL_INTERNAL_STATIC_ASSERT( sizeof(_Iter_value_t) == sizeof(_Iter_value_t)); const auto _First1_ch = reinterpret_cast(_STD _To_address(_First1)); - const auto _Size = - static_cast(reinterpret_cast(_STD _To_address(_Last1)) - _First1_ch); - return _CSTD memcmp(_First1_ch, _STD _To_address(_First2), _Size) == 0; + const auto _Size = reinterpret_cast(_STD _To_address(_Last1)) - _First1_ch; + return _CSTD memcmp(_First1_ch, _STD _To_address(_First2), static_cast(_Size)) == 0; } } From 12a49ed5a431b86b9b157ef8b293584ddbc8dd83 Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Sat, 29 Jun 2024 23:16:27 +0300 Subject: [PATCH 5/5] unwrapped iterators --- stl/inc/xutility | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/stl/inc/xutility b/stl/inc/xutility index 9f959fd1189..a27f3bec069 100644 --- a/stl/inc/xutility +++ b/stl/inc/xutility @@ -5403,9 +5403,9 @@ _NODISCARD _CONSTEXPR20 bool equal(const _InIt1 _First1, const _InIt1 _Last1, co { _STL_INTERNAL_STATIC_ASSERT( sizeof(_Iter_value_t) == sizeof(_Iter_value_t)); - const auto _First1_ch = reinterpret_cast(_STD _To_address(_First1)); - const auto _Size = reinterpret_cast(_STD _To_address(_Last1)) - _First1_ch; - return _CSTD memcmp(_First1_ch, _STD _To_address(_First2), static_cast(_Size)) == 0; + const auto _First1_ch = reinterpret_cast(_STD _To_address(_UFirst1)); + const auto _Size = reinterpret_cast(_STD _To_address(_ULast1)) - _First1_ch; + return _CSTD memcmp(_First1_ch, _STD _To_address(_UFirst2), static_cast(_Size)) == 0; } }