diff options
author | Mårten Nordheim <marten.nordheim@qt.io> | 2021-06-02 10:14:18 +0200 |
---|---|---|
committer | Mårten Nordheim <marten.nordheim@qt.io> | 2021-06-14 17:55:41 +0200 |
commit | d325f63d994a13b68022fba3337bab6e493cd709 (patch) | |
tree | 882edfa74ea069e6d265d06d3e4f83f207e3aacb /src/corelib/time | |
parent | b5da494b3f3d5dd7d4a82eab761bdbbc4808c222 (diff) |
QTimeZonePrivate: Reduce copying by not using QByteArray
QByteArray creates copies of data, but we usually don't need the copy
and a view, for comparison or fetching substrings, is enough. So instead
we use QBAView and QLatin1String (when we need to go through
QStringTokenizer).
Change-Id: I12e0bd8777fc63f676b9371abfd345fab1046c44
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Diffstat (limited to 'src/corelib/time')
-rw-r--r-- | src/corelib/time/qtimezoneprivate.cpp | 58 |
1 files changed, 32 insertions, 26 deletions
diff --git a/src/corelib/time/qtimezoneprivate.cpp b/src/corelib/time/qtimezoneprivate.cpp index f71e489224..2884807b96 100644 --- a/src/corelib/time/qtimezoneprivate.cpp +++ b/src/corelib/time/qtimezoneprivate.cpp @@ -91,17 +91,12 @@ static QByteArray ianaId(const QWindowsData *windowsData) } // Return the IANA ID literal for a given QZoneData -static QByteArray ianaId(const QZoneData *zoneData) +static QByteArrayView ianaId(const QZoneData *zoneData) { return (ianaIdData + zoneData->ianaIdIndex); } -static QByteArrayView ianaIdView(const QZoneData *zoneData) -{ - return (ianaIdData + zoneData->ianaIdIndex); -} - -static QByteArray utcId(const QUtcData *utcData) +static QByteArrayView utcId(const QUtcData *utcData) { return (ianaIdData + utcData->ianaIdIndex); } @@ -176,8 +171,7 @@ QLocale::Territory QTimeZonePrivate::territory() const // Default fall-back mode, use the zoneTable to find Region of known Zones for (int i = 0; i < zoneDataTableSize; ++i) { const QZoneData *data = zoneData(i); - QByteArrayView idView = ianaIdView(data); - QLatin1String view(idView.data(), idView.size()); + QLatin1String view(ianaId(data)); for (QLatin1String token : view.tokenize(QLatin1String(" "))) { if (token == QLatin1String(m_id.data(), m_id.size())) return QLocale::Territory(data->territory); @@ -533,8 +527,11 @@ QList<QByteArray> QTimeZonePrivate::availableTimeZoneIds(QLocale::Territory terr // First get all Zones in the Zones table belonging to the Region for (int i = 0; i < zoneDataTableSize; ++i) { - if (zoneData(i)->territory == territory) - regions += ianaId(zoneData(i)).split(' '); + if (zoneData(i)->territory == territory) { + QLatin1String l1Id(ianaId(zoneData(i))); + for (auto l1 : l1Id.tokenize(QLatin1String(" "))) + regions << QByteArray(l1.data(), l1.size()); + } } std::sort(regions.begin(), regions.end()); @@ -559,8 +556,11 @@ QList<QByteArray> QTimeZonePrivate::availableTimeZoneIds(int offsetFromUtc) cons if (winData->offsetFromUtc == offsetFromUtc) { for (int j = 0; j < zoneDataTableSize; ++j) { const QZoneData *data = zoneData(j); - if (data->windowsIdKey == winData->windowsIdKey) - offsets += ianaId(data).split(' '); + if (data->windowsIdKey == winData->windowsIdKey) { + QLatin1String l1Id(ianaId(data)); + for (auto l1 : l1Id.tokenize(QLatin1String(" "))) + offsets << QByteArray(l1.data(), l1.size()); + } } } } @@ -717,13 +717,10 @@ QByteArray QTimeZonePrivate::ianaIdToWindowsId(const QByteArray &id) { for (int i = 0; i < zoneDataTableSize; ++i) { const QZoneData *data = zoneData(i); - QByteArrayView idView = ianaIdView(data); - while (!idView.isEmpty()) { - qsizetype index = idView.indexOf(' '); - QByteArrayView next = index == -1 ? idView : idView.first(index); - if (next == id) + QLatin1String l1Id(ianaId(data)); + for (auto l1 : l1Id.tokenize(QLatin1String(" "))) { + if (l1 == QByteArrayView(id)) return toWindowsIdLiteral(data->windowsIdKey); - idView = index == -1 ? QByteArrayView() : idView.sliced(index + 1); } } return QByteArray(); @@ -757,8 +754,11 @@ QList<QByteArray> QTimeZonePrivate::windowsIdToIanaIds(const QByteArray &windows for (int i = 0; i < zoneDataTableSize; ++i) { const QZoneData *data = zoneData(i); - if (data->windowsIdKey == windowsIdKey) - list << ianaId(data).split(' '); + if (data->windowsIdKey == windowsIdKey) { + QLatin1String l1Id(ianaId(data)); + for (auto l1 : l1Id.tokenize(QLatin1String(" "))) + list << QByteArray(l1.data(), l1.size()); + } } // Return the full list in alpha order @@ -773,8 +773,14 @@ QList<QByteArray> QTimeZonePrivate::windowsIdToIanaIds(const QByteArray &windows for (int i = 0; i < zoneDataTableSize; ++i) { const QZoneData *data = zoneData(i); // Return the region matches in preference order - if (data->windowsIdKey == windowsIdKey && data->territory == static_cast<quint16>(territory)) - return ianaId(data).split(' '); + if (data->windowsIdKey == windowsIdKey + && data->territory == static_cast<quint16>(territory)) { + QLatin1String l1Id(ianaId(data)); + QList<QByteArray> list; + for (auto l1 : l1Id.tokenize(QLatin1String(" "))) + list << QByteArray(l1.data(), l1.size()); + return list; + } } return QList<QByteArray>(); @@ -804,7 +810,7 @@ QUtcTimeZonePrivate::QUtcTimeZonePrivate(const QByteArray &id) // Look for the name in the UTC list, if found set the values for (int i = 0; i < utcDataTableSize; ++i) { const QUtcData *data = utcData(i); - const QByteArray uid = utcId(data); + const QByteArrayView uid = utcId(data); if (uid == id) { QString name = QString::fromUtf8(id); init(id, data->offsetFromUtc, name, name, QLocale::AnyTerritory, name); @@ -969,7 +975,7 @@ QList<QByteArray> QUtcTimeZonePrivate::availableTimeZoneIds() const QList<QByteArray> result; result.reserve(utcDataTableSize); for (int i = 0; i < utcDataTableSize; ++i) - result << utcId(utcData(i)); + result << utcId(utcData(i)).toByteArray(); // Not guaranteed to be sorted, so sort: std::sort(result.begin(), result.end()); // ### assuming no duplicates @@ -992,7 +998,7 @@ QList<QByteArray> QUtcTimeZonePrivate::availableTimeZoneIds(qint32 offsetSeconds for (int i = 0; i < utcDataTableSize; ++i) { const QUtcData *data = utcData(i); if (data->offsetFromUtc == offsetSeconds) - result << utcId(data); + result << utcId(data).toByteArray(); } // Not guaranteed to be sorted, so sort: std::sort(result.begin(), result.end()); |