diff --git a/src/corelib/text/qanystringview.h b/src/corelib/text/qanystringview.h index 843fa7e5c9f..075d64679c1 100644 --- a/src/corelib/text/qanystringview.h +++ b/src/corelib/text/qanystringview.h @@ -137,7 +137,7 @@ private: static constexpr qsizetype lengthHelperPointer(const Char *str) noexcept { if (q20::is_constant_evaluated()) - return qsizetype(std::char_traits::length(str)); + return QtPrivate::lengthHelperPointer(str); if constexpr (sizeof(Char) == sizeof(char16_t)) return QtPrivate::qustrlen(reinterpret_cast(str)); else diff --git a/src/corelib/text/qbytearrayview.h b/src/corelib/text/qbytearrayview.h index 358c9e62ef1..dea0e6cbe8d 100644 --- a/src/corelib/text/qbytearrayview.h +++ b/src/corelib/text/qbytearrayview.h @@ -68,7 +68,15 @@ struct IsContainerCompatibleWithQByteArrayView static constexpr qsizetype lengthHelperPointer(const Char *data) noexcept { - return qsizetype(std::char_traits::length(data)); + // std::char_traits can only be used with one of the regular char types + // (char, char16_t, wchar_t, but not uchar or QChar), so we roll the loop + // out by ourselves. + qsizetype i = 0; + if (!data) + return i; + while (data[i] != Char(0)) + ++i; + return i; } } // namespace QtPrivate diff --git a/src/corelib/text/qstringview.h b/src/corelib/text/qstringview.h index ab97d834d38..2ad245caa38 100644 --- a/src/corelib/text/qstringview.h +++ b/src/corelib/text/qstringview.h @@ -108,7 +108,7 @@ private: static constexpr qsizetype lengthHelperPointer(const Char *str) noexcept { if (q20::is_constant_evaluated()) - return std::char_traits::length(str); + return QtPrivate::lengthHelperPointer(str); return QtPrivate::qustrlen(reinterpret_cast(str)); } static qsizetype lengthHelperPointer(const QChar *str) noexcept diff --git a/src/corelib/text/qutf8stringview.h b/src/corelib/text/qutf8stringview.h index cc9ce504554..7ae06c0ec40 100644 --- a/src/corelib/text/qutf8stringview.h +++ b/src/corelib/text/qutf8stringview.h @@ -134,14 +134,12 @@ private: return qsizetype(std::size(c)); } - // Note: Do not replace with std::size(const Char (&)[N]), cause the result + // Note: Do not replace with std::size(const Char (&)[N]), because the result // will be of by one. template static constexpr qsizetype lengthHelperContainer(const Char (&str)[N]) noexcept { - const auto it = std::char_traits::find(str, N, Char(0)); - const auto end = it ? it : std::next(str, N); - return qsizetype(std::distance(str, end)); + return QtPrivate::lengthHelperContainer(str); } template @@ -174,8 +172,7 @@ public: #else template = true> constexpr QBasicUtf8StringView(const Pointer &str) noexcept - : QBasicUtf8StringView(str, - str ? std::char_traits>>::length(str) : 0) {} + : QBasicUtf8StringView(str, QtPrivate::lengthHelperPointer(str)) {} #endif #ifdef Q_QDOC