diff options
Diffstat (limited to 'src/corelib')
-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 |
4 files changed, 28 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(); |