summaryrefslogtreecommitdiffstats
path: root/src/corelib/text/qstring.cpp
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2024-12-06 08:19:20 -0800
committerEdward Welbourne <edward.welbourne@qt.io>2024-12-12 19:38:02 +0000
commitb98cf4fc4afaf55145c34ba06d61fec38fadc25d (patch)
tree1844ef4e2c785cd7b9467bec10c56013abab6e74 /src/corelib/text/qstring.cpp
parent973d0c4c5160200c188f81da5df064510315f22d (diff)
QString::fromUcs4: use std::char_traits or wcslen() to find the size
... when the user passes size = -1. std::char_traits<char32_t>::length() doesn't appear to be an any better implementation than our simple loop, but maybe some compiler will optimize it. wcslen() is usually optimized in the C libraries, even for Unix platforms that hardly ever use it (it's used as a fallback in qustrlen() for non-x86 Windows systems). Pick-to: 6.8 6.9 Change-Id: Ia143270869a3a7cf5754fffdc17e500fc454397b Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Diffstat (limited to 'src/corelib/text/qstring.cpp')
-rw-r--r--src/corelib/text/qstring.cpp7
1 files changed, 4 insertions, 3 deletions
diff --git a/src/corelib/text/qstring.cpp b/src/corelib/text/qstring.cpp
index 63519c99753..6c522b81bbc 100644
--- a/src/corelib/text/qstring.cpp
+++ b/src/corelib/text/qstring.cpp
@@ -6115,9 +6115,10 @@ QString QString::fromUcs4(const char32_t *unicode, qsizetype size)
if (!unicode)
return QString();
if (size < 0) {
- size = 0;
- while (unicode[size] != 0)
- ++size;
+ if constexpr (sizeof(char32_t) == sizeof(wchar_t))
+ size = wcslen(reinterpret_cast<const wchar_t *>(unicode));
+ else
+ size = std::char_traits<char32_t>::length(unicode);
}
QStringDecoder toUtf16(QStringDecoder::Utf32, QStringDecoder::Flag::Stateless);
return toUtf16(QByteArrayView(reinterpret_cast<const char *>(unicode), size * 4));