summaryrefslogtreecommitdiffstats
path: root/src/corelib/time
diff options
context:
space:
mode:
authorAnton Kudryavtsev <anton.kudryavtsev@vk.team>2024-03-14 19:37:38 +0300
committerAnton Kudryavtsev <antkudr@mail.ru>2024-03-15 11:08:13 +0000
commitf76af5f78c8a6eeb8966f045a678cb1cc74e6052 (patch)
treec9514bf84edd73fe7eb8b375c8b6bef5d54cdcad /src/corelib/time
parent2d6c4b5ee790a3dff93840501be872bb8d1d8203 (diff)
TimeZone: optimize offsetFromUtcString
Use view types more to avoid needless allocations Change-Id: Ifdf5c8f6fecc54a0583444fbf3fe151c2c20002e Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/time')
-rw-r--r--src/corelib/time/qtimezoneprivate.cpp17
-rw-r--r--src/corelib/time/qtimezoneprivate_p.h2
2 files changed, 11 insertions, 8 deletions
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 <qdatastream.h>
#include <qdebug.h>
+#include <qstring.h>
#include <private/qcalendarmath_p.h>
#include <private/qnumeric_p.h>
@@ -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;