diff options
-rw-r--r-- | src/corelib/tools/qtimezone.cpp | 4 | ||||
-rw-r--r-- | src/corelib/tools/qtimezoneprivate.cpp | 18 | ||||
-rw-r--r-- | src/corelib/tools/qtimezoneprivate_p.h | 3 | ||||
-rw-r--r-- | src/corelib/tools/qtimezoneprivate_tz.cpp | 5 | ||||
-rw-r--r-- | tests/benchmarks/corelib/tools/qtimezone/main.cpp | 52 | ||||
-rw-r--r-- | tests/benchmarks/corelib/tools/qtimezone/qtimezone.pro | 4 | ||||
-rw-r--r-- | tests/benchmarks/corelib/tools/tools.pro | 1 |
7 files changed, 85 insertions, 2 deletions
diff --git a/src/corelib/tools/qtimezone.cpp b/src/corelib/tools/qtimezone.cpp index 445ddeb31d..db6be581ec 100644 --- a/src/corelib/tools/qtimezone.cpp +++ b/src/corelib/tools/qtimezone.cpp @@ -820,8 +820,8 @@ bool QTimeZone::isTimeZoneIdAvailable(const QByteArray &ianaId) // IDs as availableTimeZoneIds() may be slow if (!QTimeZonePrivate::isValidId(ianaId)) return false; - const QList<QByteArray> tzIds = availableTimeZoneIds(); - return std::binary_search(tzIds.begin(), tzIds.end(), ianaId); + return QUtcTimeZonePrivate().isTimeZoneIdAvailable(ianaId) || + global_tz->backend->isTimeZoneIdAvailable(ianaId); } static QList<QByteArray> set_union(const QList<QByteArray> &l1, const QList<QByteArray> &l2) diff --git a/src/corelib/tools/qtimezoneprivate.cpp b/src/corelib/tools/qtimezoneprivate.cpp index 1a5135f103..2b6c2ea6a5 100644 --- a/src/corelib/tools/qtimezoneprivate.cpp +++ b/src/corelib/tools/qtimezoneprivate.cpp @@ -486,6 +486,13 @@ QByteArray QTimeZonePrivate::systemTimeZoneId() const return QByteArray(); } +bool QTimeZonePrivate::isTimeZoneIdAvailable(const QByteArray& ianaId) const +{ + // Fall-back implementation, can be made faster in subclasses + const QList<QByteArray> tzIds = availableTimeZoneIds(); + return std::binary_search(tzIds.begin(), tzIds.end(), ianaId); +} + QList<QByteArray> QTimeZonePrivate::availableTimeZoneIds() const { return QList<QByteArray>(); @@ -864,6 +871,17 @@ QByteArray QUtcTimeZonePrivate::systemTimeZoneId() const return utcQByteArray(); } +bool QUtcTimeZonePrivate::isTimeZoneIdAvailable(const QByteArray &ianaId) const +{ + for (int i = 0; i < utcDataTableSize; ++i) { + const QUtcData *data = utcData(i); + if (utcId(data) == ianaId) { + return true; + } + } + return false; +} + QList<QByteArray> QUtcTimeZonePrivate::availableTimeZoneIds() const { QList<QByteArray> result; diff --git a/src/corelib/tools/qtimezoneprivate_p.h b/src/corelib/tools/qtimezoneprivate_p.h index 4d357111f2..c9a5726216 100644 --- a/src/corelib/tools/qtimezoneprivate_p.h +++ b/src/corelib/tools/qtimezoneprivate_p.h @@ -128,6 +128,7 @@ public: virtual QByteArray systemTimeZoneId() const; + virtual bool isTimeZoneIdAvailable(const QByteArray &ianaId) const; virtual QList<QByteArray> availableTimeZoneIds() const; virtual QList<QByteArray> availableTimeZoneIds(QLocale::Country country) const; virtual QList<QByteArray> availableTimeZoneIds(int utcOffset) const; @@ -204,6 +205,7 @@ public: QByteArray systemTimeZoneId() const override; + bool isTimeZoneIdAvailable(const QByteArray &ianaId) const override; QList<QByteArray> availableTimeZoneIds() const override; QList<QByteArray> availableTimeZoneIds(QLocale::Country country) const override; QList<QByteArray> availableTimeZoneIds(int utcOffset) const override; @@ -323,6 +325,7 @@ public: QByteArray systemTimeZoneId() const override; + bool isTimeZoneIdAvailable(const QByteArray &ianaId) const override; QList<QByteArray> availableTimeZoneIds() const override; QList<QByteArray> availableTimeZoneIds(QLocale::Country country) const override; diff --git a/src/corelib/tools/qtimezoneprivate_tz.cpp b/src/corelib/tools/qtimezoneprivate_tz.cpp index 6a5df6272a..f1735a80e7 100644 --- a/src/corelib/tools/qtimezoneprivate_tz.cpp +++ b/src/corelib/tools/qtimezoneprivate_tz.cpp @@ -1098,6 +1098,11 @@ QByteArray QTzTimeZonePrivate::systemTimeZoneId() const return ianaId; } +bool QTzTimeZonePrivate::isTimeZoneIdAvailable(const QByteArray &ianaId) const +{ + return tzZones->contains(ianaId); +} + QList<QByteArray> QTzTimeZonePrivate::availableTimeZoneIds() const { QList<QByteArray> result = tzZones->keys(); diff --git a/tests/benchmarks/corelib/tools/qtimezone/main.cpp b/tests/benchmarks/corelib/tools/qtimezone/main.cpp new file mode 100644 index 0000000000..65455a7261 --- /dev/null +++ b/tests/benchmarks/corelib/tools/qtimezone/main.cpp @@ -0,0 +1,52 @@ +/**************************************************************************** +** +** Copyright (C) 2018 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author David Faure <david.faure@kdab.com> +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QTimeZone> +#include <QTest> +#include <qdebug.h> + +class tst_QTimeZone : public QObject +{ + Q_OBJECT + +private Q_SLOTS: + void isTimeZoneIdAvailable(); +}; + +void tst_QTimeZone::isTimeZoneIdAvailable() +{ + const QList<QByteArray> available = QTimeZone::availableTimeZoneIds(); + QBENCHMARK { + for (const QByteArray &id : available) + QVERIFY(QTimeZone::isTimeZoneIdAvailable(id)); + } +} + +QTEST_MAIN(tst_QTimeZone) + +#include "main.moc" diff --git a/tests/benchmarks/corelib/tools/qtimezone/qtimezone.pro b/tests/benchmarks/corelib/tools/qtimezone/qtimezone.pro new file mode 100644 index 0000000000..d0531b568b --- /dev/null +++ b/tests/benchmarks/corelib/tools/qtimezone/qtimezone.pro @@ -0,0 +1,4 @@ +TARGET = tst_bench_qtimezone +QT = core testlib + +SOURCES += main.cpp diff --git a/tests/benchmarks/corelib/tools/tools.pro b/tests/benchmarks/corelib/tools/tools.pro index af9b7d241d..ca9c0a6f89 100644 --- a/tests/benchmarks/corelib/tools/tools.pro +++ b/tests/benchmarks/corelib/tools/tools.pro @@ -15,6 +15,7 @@ SUBDIRS = \ qstring \ qstringbuilder \ qstringlist \ + qtimezone \ qvector \ qalgorithms |