Skip to content

Commit

Permalink
Call CRT wmemcmp/wmemchr when possible in char_traits for bette…
Browse files Browse the repository at this point in the history
…r performance (#4873)

Co-authored-by: Stephan T. Lavavej <stl@nuwen.net>
  • Loading branch information
mcfi and StephanTLavavej committed Aug 8, 2024
1 parent d47747c commit b5285d1
Showing 1 changed file with 24 additions and 18 deletions.
42 changes: 24 additions & 18 deletions stl/inc/__msvc_string_view.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -220,42 +220,48 @@ struct _WChar_traits : private _Char_traits<_Elem, unsigned short> {
_In_reads_(_Count) const _Elem* const _First2, const size_t _Count) noexcept /* strengthened */ {
// compare [_First1, _First1 + _Count) with [_First2, ...)
#if _HAS_CXX17
if constexpr (is_same_v<_Elem, wchar_t>) {
return __builtin_wmemcmp(_First1, _First2, _Count);
} else {
return _Primary_char_traits::compare(_First1, _First2, _Count);
if (_STD _Is_constant_evaluated()) {
if constexpr (is_same_v<_Elem, wchar_t>) {
return __builtin_wmemcmp(_First1, _First2, _Count);
} else {
return _Primary_char_traits::compare(_First1, _First2, _Count);
}
}
#else // ^^^ _HAS_CXX17 / !_HAS_CXX17 vvv
#endif // _HAS_CXX17

return _CSTD wmemcmp(
reinterpret_cast<const wchar_t*>(_First1), reinterpret_cast<const wchar_t*>(_First2), _Count);
#endif // ^^^ !_HAS_CXX17 ^^^
}

_NODISCARD static _CONSTEXPR17 size_t length(_In_z_ const _Elem* _First) noexcept /* strengthened */ {
// find length of null-terminated sequence
#if _HAS_CXX17
if constexpr (is_same_v<_Elem, wchar_t>) {
return __builtin_wcslen(_First);
} else {
return _Primary_char_traits::length(_First);
if (_STD _Is_constant_evaluated()) {
if constexpr (is_same_v<_Elem, wchar_t>) {
return __builtin_wcslen(_First);
} else {
return _Primary_char_traits::length(_First);
}
}
#else // ^^^ _HAS_CXX17 / !_HAS_CXX17 vvv
#endif // _HAS_CXX17

return _CSTD wcslen(reinterpret_cast<const wchar_t*>(_First));
#endif // ^^^ !_HAS_CXX17 ^^^
}

_NODISCARD static _CONSTEXPR17 const _Elem* find(
_In_reads_(_Count) const _Elem* _First, const size_t _Count, const _Elem& _Ch) noexcept /* strengthened */ {
// look for _Ch in [_First, _First + _Count)
#if _HAS_CXX17
if constexpr (is_same_v<_Elem, wchar_t>) {
return __builtin_wmemchr(_First, _Ch, _Count);
} else {
return _Primary_char_traits::find(_First, _Count, _Ch);
if (_STD _Is_constant_evaluated()) {
if constexpr (is_same_v<_Elem, wchar_t>) {
return __builtin_wmemchr(_First, _Ch, _Count);
} else {
return _Primary_char_traits::find(_First, _Count, _Ch);
}
}
#else // ^^^ _HAS_CXX17 / !_HAS_CXX17 vvv
#endif // _HAS_CXX17

return reinterpret_cast<const _Elem*>(_CSTD wmemchr(reinterpret_cast<const wchar_t*>(_First), _Ch, _Count));
#endif // ^^^ !_HAS_CXX17 ^^^
}

static _CONSTEXPR20 _Elem* assign(
Expand Down

0 comments on commit b5285d1

Please sign in to comment.