From b0f4bd7f2352da9f2e40dbe9340b3581194a0275 Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Tue, 6 Feb 2024 16:45:49 +0100 Subject: [PATCH] Move QTimeZone's CLDR-derived data into a namespace Introduce namespace QtTimeZoneCldr instead of having a Q prefix on each class name used for the data. Change-Id: Icb22a91340b67f9cc93173b77374a70f69f81bbe Reviewed-by: Ivan Solovev --- src/corelib/time/qtimezoneprivate.cpp | 27 +++++++++++----------- src/corelib/time/qtimezoneprivate_data_p.h | 23 ++++++++++-------- util/locale_database/cldr2qtimezone.py | 7 +++--- 3 files changed, 31 insertions(+), 26 deletions(-) diff --git a/src/corelib/time/qtimezoneprivate.cpp b/src/corelib/time/qtimezoneprivate.cpp index c43e2157396..9f439513db5 100644 --- a/src/corelib/time/qtimezoneprivate.cpp +++ b/src/corelib/time/qtimezoneprivate.cpp @@ -19,17 +19,18 @@ QT_BEGIN_NAMESPACE using namespace QtMiscUtils; +using namespace QtTimeZoneCldr; // For use with std::is_sorted() in assertions: [[maybe_unused]] -constexpr bool earlierZoneData(const QZoneData &less, const QZoneData &more) noexcept +constexpr bool earlierZoneData(const ZoneData &less, const ZoneData &more) noexcept { return less.windowsIdKey < more.windowsIdKey || (less.windowsIdKey == more.windowsIdKey && less.territory < more.territory); } [[maybe_unused]] -static bool earlierWinData(const QWindowsData &less, const QWindowsData &more) noexcept +static bool earlierWinData(const WindowsData &less, const WindowsData &more) noexcept { // Actually only tested in the negative, to check more < less never happens, // so should be true if more < less in either part; hence || not && combines. @@ -38,22 +39,22 @@ static bool earlierWinData(const QWindowsData &less, const QWindowsData &more) n } // For use with std::lower_bound(): -constexpr bool atLowerUtcOffset(const QUtcData &entry, qint32 offsetSeconds) noexcept +constexpr bool atLowerUtcOffset(const UtcData &entry, qint32 offsetSeconds) noexcept { return entry.offsetFromUtc < offsetSeconds; } -constexpr bool atLowerWindowsKey(const QWindowsData &entry, qint16 winIdKey) noexcept +constexpr bool atLowerWindowsKey(const WindowsData &entry, qint16 winIdKey) noexcept { return entry.windowsIdKey < winIdKey; } -static bool earlierWindowsId(const QWindowsData &entry, QByteArrayView winId) noexcept +static bool earlierWindowsId(const WindowsData &entry, QByteArrayView winId) noexcept { return entry.windowsId().compare(winId, Qt::CaseInsensitive) < 0; } -constexpr bool zoneAtLowerWindowsKey(const QZoneData &entry, qint16 winIdKey) noexcept +constexpr bool zoneAtLowerWindowsKey(const ZoneData &entry, qint16 winIdKey) noexcept { return entry.windowsIdKey < winIdKey; } @@ -151,7 +152,7 @@ QLocale::Territory QTimeZonePrivate::territory() const { // Default fall-back mode, use the zoneTable to find Region of known Zones const QLatin1StringView sought(m_id.data(), m_id.size()); - for (const QZoneData &data : zoneDataTable) { + for (const ZoneData &data : zoneDataTable) { for (QLatin1StringView token : data.ids()) { if (token == sought) return QLocale::Territory(data.territory); @@ -534,7 +535,7 @@ QList QTimeZonePrivate::availableTimeZoneIds(QLocale::Territory terr QList regions; // First get all Zones in the Zones table belonging to the Region - for (const QZoneData &data : zoneDataTable) { + for (const ZoneData &data : zoneDataTable) { if (data.territory == territory) { for (auto l1 : data.ids()) regions << QByteArray(l1.data(), l1.size()); @@ -558,7 +559,7 @@ QList QTimeZonePrivate::availableTimeZoneIds(int offsetFromUtc) cons // Default fall-back mode, use the zoneTable to find Offset of know Zones QList offsets; // First get all Zones in the table using the Offset - for (const QWindowsData &winData : windowsDataTable) { + for (const WindowsData &winData : windowsDataTable) { if (winData.offsetFromUtc == offsetFromUtc) { for (auto data = zoneStartForWindowsId(winData.windowsIdKey); data != std::end(zoneDataTable) && data->windowsIdKey == winData.windowsIdKey; @@ -727,7 +728,7 @@ QByteArray QTimeZonePrivate::ianaIdToWindowsId(const QByteArray &id) // so we have to allocate here... const auto idUtf8 = QString::fromUtf8(id); - for (const QZoneData &data : zoneDataTable) { + for (const ZoneData &data : zoneDataTable) { for (auto l1 : data.ids()) { if (l1 == idUtf8) return toWindowsIdLiteral(data.windowsIdKey); @@ -829,7 +830,7 @@ QUtcTimeZonePrivate::QUtcTimeZonePrivate() QUtcTimeZonePrivate::QUtcTimeZonePrivate(const QByteArray &id) { // Look for the name in the UTC list, if found set the values - for (const QUtcData &data : utcDataTable) { + for (const UtcData &data : utcDataTable) { if (isEntryInIanaList(id, data.id())) { QString name = QString::fromUtf8(id); init(id, data.offsetFromUtc, name, name, QLocale::AnyTerritory, name); @@ -993,7 +994,7 @@ QByteArray QUtcTimeZonePrivate::systemTimeZoneId() const bool QUtcTimeZonePrivate::isTimeZoneIdAvailable(const QByteArray &ianaId) const { // Only the zone IDs supplied by CLDR and recognized by constructor. - for (const QUtcData &data : utcDataTable) { + for (const UtcData &data : utcDataTable) { if (isEntryInIanaList(ianaId, data.id())) return true; } @@ -1008,7 +1009,7 @@ QList QUtcTimeZonePrivate::availableTimeZoneIds() const // Only the zone IDs supplied by CLDR and recognized by constructor. QList result; result.reserve(std::size(utcDataTable)); - for (const QUtcData &data : utcDataTable) { + for (const UtcData &data : utcDataTable) { QByteArrayView id = data.id(); qsizetype cut; while ((cut = id.indexOf(' ')) >= 0) { diff --git a/src/corelib/time/qtimezoneprivate_data_p.h b/src/corelib/time/qtimezoneprivate_data_p.h index 60bfaed0116..ee6b4b496af 100644 --- a/src/corelib/time/qtimezoneprivate_data_p.h +++ b/src/corelib/time/qtimezoneprivate_data_p.h @@ -23,6 +23,7 @@ QT_BEGIN_NAMESPACE +namespace QtTimeZoneCldr { /* Recognized UTC-offset zones and CLDR-derived data on Windows IDs. @@ -43,7 +44,7 @@ QT_BEGIN_NAMESPACE of its last update and how to update it. */ -struct QZoneData +struct ZoneData { // Keys (table is sorted in Windows ID, then on territory enum value): quint16 windowsIdKey; // Windows ID sequence number @@ -54,7 +55,7 @@ struct QZoneData constexpr auto ids() const { return id().tokenize(u' '); } // Iterate IANA IDs }; -struct QWindowsData +struct WindowsData { // Table is sorted on key and this puts the windowsId()s in ascending order. quint16 windowsIdKey; // Windows ID sequence number @@ -66,7 +67,7 @@ struct QWindowsData constexpr QByteArrayView ianaId() const; // Space-joined list of IANA IDs }; -struct QUtcData +struct UtcData { quint16 ianaIdIndex; // Index in ianaIdData of space-joined IANA IDs qint32 offsetFromUtc; // Offset form UTC in seconds @@ -107,7 +108,7 @@ struct QUtcData */ // Windows ID Key, Territory Enum, IANA ID Index -static constexpr QZoneData zoneDataTable[] = { +static constexpr ZoneData zoneDataTable[] = { { 1, 1, 0 }, // Afghanistan Standard Time / Afghanistan { 2, 248, 11 }, // Alaskan Standard Time / United States { 3, 248, 106 }, // Aleutian Standard Time / United States @@ -478,7 +479,7 @@ static constexpr QZoneData zoneDataTable[] = { }; // Windows ID Key, Windows ID Index, IANA ID Index, UTC Offset -static constexpr QWindowsData windowsDataTable[] = { +static constexpr WindowsData windowsDataTable[] = { { 1, 0, 0, 16200 }, // Afghanistan Standard Time { 2, 26, 7325,-32400 }, // Alaskan Standard Time { 3, 48, 106,-36000 }, // Aleutian Standard Time @@ -621,7 +622,7 @@ static constexpr QWindowsData windowsDataTable[] = { }; // IANA ID Index, UTC Offset -static constexpr QUtcData utcDataTable[] = { +static constexpr UtcData utcDataTable[] = { { 7788,-50400 }, // UTC-14:00 { 7798,-46800 }, // UTC-13:00 { 7808,-43200 }, // UTC-12:00 @@ -1383,13 +1384,15 @@ static constexpr char ianaIdData[] = { }; // GENERATED PART ENDS HERE -constexpr QByteArrayView QWindowsData::windowsId() const { return windowsIdData + windowsIdIndex; } +constexpr QByteArrayView WindowsData::windowsId() const { return windowsIdData + windowsIdIndex; } // Each of the following returns a space-joined sequence of IANA IDs: -constexpr QByteArrayView QWindowsData::ianaId() const { return ianaIdData + ianaIdIndex; } -constexpr QByteArrayView QUtcData::id() const { return ianaIdData + ianaIdIndex; } -constexpr QLatin1StringView QZoneData::id() const +constexpr QByteArrayView WindowsData::ianaId() const { return ianaIdData + ianaIdIndex; } +constexpr QByteArrayView UtcData::id() const { return ianaIdData + ianaIdIndex; } +constexpr QLatin1StringView ZoneData::id() const { return QLatin1StringView(ianaIdData + ianaIdIndex); } +} // namespace QtTimeZoneCldr + QT_END_NAMESPACE #endif // QTIMEZONEPRIVATE_DATA_P_H diff --git a/util/locale_database/cldr2qtimezone.py b/util/locale_database/cldr2qtimezone.py index b23aa3829eb..27987d5a588 100755 --- a/util/locale_database/cldr2qtimezone.py +++ b/util/locale_database/cldr2qtimezone.py @@ -258,6 +258,7 @@ class ByteArrayData: out('\n};\n') class ZoneIdWriter (SourceFileEditor): + # All the output goes into namespace QtTimeZoneCldr. def write(self, version, defaults, windowsIds): self.__writeWarning(version) windows, iana = self.__writeTables(self.writer.write, defaults, windowsIds) @@ -284,7 +285,7 @@ class ZoneIdWriter (SourceFileEditor): # Write Windows/IANA table out('// Windows ID Key, Territory Enum, IANA ID Index\n') - out('static constexpr QZoneData zoneDataTable[] = {\n') + out('static constexpr ZoneData zoneDataTable[] = {\n') # Sorted by (Windows ID Key, territory enum) for index, data in sorted(windowsIds.items()): out(' {{ {:6d},{:6d},{:6d} }}, // {} / {}\n'.format( @@ -295,7 +296,7 @@ class ZoneIdWriter (SourceFileEditor): # Write Windows ID key table out('// Windows ID Key, Windows ID Index, IANA ID Index, UTC Offset\n') - out('static constexpr QWindowsData windowsDataTable[] = {\n') + out('static constexpr WindowsData windowsDataTable[] = {\n') # Sorted by Windows ID key; sorting case-insensitively by # Windows ID must give the same order. winIdNames = [x.lower() for x, y in windowsIdList] @@ -314,7 +315,7 @@ class ZoneIdWriter (SourceFileEditor): offsetMap[pair[1]] = offsetMap.get(pair[1], ()) + (pair[0],) # Write UTC ID key table out('// IANA ID Index, UTC Offset\n') - out('static constexpr QUtcData utcDataTable[] = {\n') + out('static constexpr UtcData utcDataTable[] = {\n') for offset in sorted(offsetMap.keys()): # Sort so C++ can binary-chop. names = offsetMap[offset]; out(' {{ {:6d},{:6d} }}, // {}\n'.format(