From f76af5f78c8a6eeb8966f045a678cb1cc74e6052 Mon Sep 17 00:00:00 2001 From: Anton Kudryavtsev Date: Thu, 14 Mar 2024 19:37:38 +0300 Subject: TimeZone: optimize offsetFromUtcString Use view types more to avoid needless allocations Change-Id: Ifdf5c8f6fecc54a0583444fbf3fe151c2c20002e Reviewed-by: Thiago Macieira --- src/corelib/time/qtimezoneprivate.cpp | 17 ++++++++++------- src/corelib/time/qtimezoneprivate_p.h | 2 +- 2 files changed, 11 insertions(+), 8 deletions(-) (limited to 'src/corelib/time') diff --git a/src/corelib/time/qtimezoneprivate.cpp b/src/corelib/time/qtimezoneprivate.cpp index e92153d92a..78671543a6 100644 --- a/src/corelib/time/qtimezoneprivate.cpp +++ b/src/corelib/time/qtimezoneprivate.cpp @@ -9,6 +9,7 @@ #include #include +#include #include #include @@ -20,6 +21,7 @@ QT_BEGIN_NAMESPACE using namespace QtMiscUtils; using namespace QtTimeZoneCldr; +using namespace Qt::StringLiterals; // For use with std::is_sorted() in assertions: [[maybe_unused]] @@ -838,7 +840,7 @@ QUtcTimeZonePrivate::QUtcTimeZonePrivate(const QByteArray &id) } } -qint64 QUtcTimeZonePrivate::offsetFromUtcString(const QByteArray &id) +qint64 QUtcTimeZonePrivate::offsetFromUtcString(QByteArrayView id) { // Convert reasonable UTC[+-]\d+(:\d+){,2} to offset in seconds. // Assumption: id has already been tried as a CLDR UTC offset ID (notably @@ -850,21 +852,22 @@ qint64 QUtcTimeZonePrivate::offsetFromUtcString(const QByteArray &id) return invalidSeconds(); // No sign const int sign = signChar == '-' ? -1 : 1; - const auto offsets = id.mid(4).split(':'); - if (offsets.isEmpty() || offsets.size() > 3) - return invalidSeconds(); // No numbers, or too many. - qint32 seconds = 0; int prior = 0; // Number of fields parsed thus far - for (const auto &offset : offsets) { + for (auto offset : QLatin1StringView(id.mid(4)).tokenize(':'_L1)) { bool ok = false; unsigned short field = offset.toUShort(&ok); // Bound hour above at 24, minutes and seconds at 60: if (!ok || field >= (prior ? 60 : 24)) return invalidSeconds(); seconds = seconds * 60 + field; - ++prior; + if (++prior > 3) + return invalidSeconds(); // Too many numbers } + + if (!prior) + return invalidSeconds(); // No numbers + while (prior++ < 3) seconds *= 60; diff --git a/src/corelib/time/qtimezoneprivate_p.h b/src/corelib/time/qtimezoneprivate_p.h index 3bb12019b5..0f006a7896 100644 --- a/src/corelib/time/qtimezoneprivate_p.h +++ b/src/corelib/time/qtimezoneprivate_p.h @@ -161,7 +161,7 @@ public: virtual ~QUtcTimeZonePrivate(); // Fall-back for UTC[+-]\d+(:\d+){,2} IDs. - static qint64 offsetFromUtcString(const QByteArray &id); + static qint64 offsetFromUtcString(QByteArrayView id); QUtcTimeZonePrivate *clone() const override; -- cgit v1.2.3