TimeZone: optimize offsetFromUtcString

Use view types more to avoid needless allocations

Change-Id: Ifdf5c8f6fecc54a0583444fbf3fe151c2c20002e
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Anton Kudryavtsev 2024-03-14 19:37:38 +03:00 committed by Anton Kudryavtsev
parent 2d6c4b5ee7
commit f76af5f78c
2 changed files with 11 additions and 8 deletions

View File

@ -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;

View File

@ -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;