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 <ivan.solovev@qt.io>
This commit is contained in:
Edward Welbourne 2024-02-06 16:45:49 +01:00
parent a736e613fc
commit b0f4bd7f23
3 changed files with 31 additions and 26 deletions

View File

@ -19,17 +19,18 @@
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
using namespace QtMiscUtils; using namespace QtMiscUtils;
using namespace QtTimeZoneCldr;
// For use with std::is_sorted() in assertions: // For use with std::is_sorted() in assertions:
[[maybe_unused]] [[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 return less.windowsIdKey < more.windowsIdKey
|| (less.windowsIdKey == more.windowsIdKey && less.territory < more.territory); || (less.windowsIdKey == more.windowsIdKey && less.territory < more.territory);
} }
[[maybe_unused]] [[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, // 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. // 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(): // 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; 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; 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; 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; 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 // Default fall-back mode, use the zoneTable to find Region of known Zones
const QLatin1StringView sought(m_id.data(), m_id.size()); const QLatin1StringView sought(m_id.data(), m_id.size());
for (const QZoneData &data : zoneDataTable) { for (const ZoneData &data : zoneDataTable) {
for (QLatin1StringView token : data.ids()) { for (QLatin1StringView token : data.ids()) {
if (token == sought) if (token == sought)
return QLocale::Territory(data.territory); return QLocale::Territory(data.territory);
@ -534,7 +535,7 @@ QList<QByteArray> QTimeZonePrivate::availableTimeZoneIds(QLocale::Territory terr
QList<QByteArray> regions; QList<QByteArray> regions;
// First get all Zones in the Zones table belonging to the Region // 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) { if (data.territory == territory) {
for (auto l1 : data.ids()) for (auto l1 : data.ids())
regions << QByteArray(l1.data(), l1.size()); regions << QByteArray(l1.data(), l1.size());
@ -558,7 +559,7 @@ QList<QByteArray> QTimeZonePrivate::availableTimeZoneIds(int offsetFromUtc) cons
// Default fall-back mode, use the zoneTable to find Offset of know Zones // Default fall-back mode, use the zoneTable to find Offset of know Zones
QList<QByteArray> offsets; QList<QByteArray> offsets;
// First get all Zones in the table using the Offset // First get all Zones in the table using the Offset
for (const QWindowsData &winData : windowsDataTable) { for (const WindowsData &winData : windowsDataTable) {
if (winData.offsetFromUtc == offsetFromUtc) { if (winData.offsetFromUtc == offsetFromUtc) {
for (auto data = zoneStartForWindowsId(winData.windowsIdKey); for (auto data = zoneStartForWindowsId(winData.windowsIdKey);
data != std::end(zoneDataTable) && data->windowsIdKey == 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... // so we have to allocate here...
const auto idUtf8 = QString::fromUtf8(id); const auto idUtf8 = QString::fromUtf8(id);
for (const QZoneData &data : zoneDataTable) { for (const ZoneData &data : zoneDataTable) {
for (auto l1 : data.ids()) { for (auto l1 : data.ids()) {
if (l1 == idUtf8) if (l1 == idUtf8)
return toWindowsIdLiteral(data.windowsIdKey); return toWindowsIdLiteral(data.windowsIdKey);
@ -829,7 +830,7 @@ QUtcTimeZonePrivate::QUtcTimeZonePrivate()
QUtcTimeZonePrivate::QUtcTimeZonePrivate(const QByteArray &id) QUtcTimeZonePrivate::QUtcTimeZonePrivate(const QByteArray &id)
{ {
// Look for the name in the UTC list, if found set the values // 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())) { if (isEntryInIanaList(id, data.id())) {
QString name = QString::fromUtf8(id); QString name = QString::fromUtf8(id);
init(id, data.offsetFromUtc, name, name, QLocale::AnyTerritory, name); init(id, data.offsetFromUtc, name, name, QLocale::AnyTerritory, name);
@ -993,7 +994,7 @@ QByteArray QUtcTimeZonePrivate::systemTimeZoneId() const
bool QUtcTimeZonePrivate::isTimeZoneIdAvailable(const QByteArray &ianaId) const bool QUtcTimeZonePrivate::isTimeZoneIdAvailable(const QByteArray &ianaId) const
{ {
// Only the zone IDs supplied by CLDR and recognized by constructor. // 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())) if (isEntryInIanaList(ianaId, data.id()))
return true; return true;
} }
@ -1008,7 +1009,7 @@ QList<QByteArray> QUtcTimeZonePrivate::availableTimeZoneIds() const
// Only the zone IDs supplied by CLDR and recognized by constructor. // Only the zone IDs supplied by CLDR and recognized by constructor.
QList<QByteArray> result; QList<QByteArray> result;
result.reserve(std::size(utcDataTable)); result.reserve(std::size(utcDataTable));
for (const QUtcData &data : utcDataTable) { for (const UtcData &data : utcDataTable) {
QByteArrayView id = data.id(); QByteArrayView id = data.id();
qsizetype cut; qsizetype cut;
while ((cut = id.indexOf(' ')) >= 0) { while ((cut = id.indexOf(' ')) >= 0) {

View File

@ -23,6 +23,7 @@
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
namespace QtTimeZoneCldr {
/* /*
Recognized UTC-offset zones and CLDR-derived data on Windows IDs. 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. 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): // Keys (table is sorted in Windows ID, then on territory enum value):
quint16 windowsIdKey; // Windows ID sequence number quint16 windowsIdKey; // Windows ID sequence number
@ -54,7 +55,7 @@ struct QZoneData
constexpr auto ids() const { return id().tokenize(u' '); } // Iterate IANA IDs 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. // Table is sorted on key and this puts the windowsId()s in ascending order.
quint16 windowsIdKey; // Windows ID sequence number quint16 windowsIdKey; // Windows ID sequence number
@ -66,7 +67,7 @@ struct QWindowsData
constexpr QByteArrayView ianaId() const; // Space-joined list of IANA IDs constexpr QByteArrayView ianaId() const; // Space-joined list of IANA IDs
}; };
struct QUtcData struct UtcData
{ {
quint16 ianaIdIndex; // Index in ianaIdData of space-joined IANA IDs quint16 ianaIdIndex; // Index in ianaIdData of space-joined IANA IDs
qint32 offsetFromUtc; // Offset form UTC in seconds qint32 offsetFromUtc; // Offset form UTC in seconds
@ -107,7 +108,7 @@ struct QUtcData
*/ */
// Windows ID Key, Territory Enum, IANA ID Index // Windows ID Key, Territory Enum, IANA ID Index
static constexpr QZoneData zoneDataTable[] = { static constexpr ZoneData zoneDataTable[] = {
{ 1, 1, 0 }, // Afghanistan Standard Time / Afghanistan { 1, 1, 0 }, // Afghanistan Standard Time / Afghanistan
{ 2, 248, 11 }, // Alaskan Standard Time / United States { 2, 248, 11 }, // Alaskan Standard Time / United States
{ 3, 248, 106 }, // Aleutian 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 // 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 { 1, 0, 0, 16200 }, // Afghanistan Standard Time
{ 2, 26, 7325,-32400 }, // Alaskan Standard Time { 2, 26, 7325,-32400 }, // Alaskan Standard Time
{ 3, 48, 106,-36000 }, // Aleutian Standard Time { 3, 48, 106,-36000 }, // Aleutian Standard Time
@ -621,7 +622,7 @@ static constexpr QWindowsData windowsDataTable[] = {
}; };
// IANA ID Index, UTC Offset // IANA ID Index, UTC Offset
static constexpr QUtcData utcDataTable[] = { static constexpr UtcData utcDataTable[] = {
{ 7788,-50400 }, // UTC-14:00 { 7788,-50400 }, // UTC-14:00
{ 7798,-46800 }, // UTC-13:00 { 7798,-46800 }, // UTC-13:00
{ 7808,-43200 }, // UTC-12:00 { 7808,-43200 }, // UTC-12:00
@ -1383,13 +1384,15 @@ static constexpr char ianaIdData[] = {
}; };
// GENERATED PART ENDS HERE // 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: // Each of the following returns a space-joined sequence of IANA IDs:
constexpr QByteArrayView QWindowsData::ianaId() const { return ianaIdData + ianaIdIndex; } constexpr QByteArrayView WindowsData::ianaId() const { return ianaIdData + ianaIdIndex; }
constexpr QByteArrayView QUtcData::id() const { return ianaIdData + ianaIdIndex; } constexpr QByteArrayView UtcData::id() const { return ianaIdData + ianaIdIndex; }
constexpr QLatin1StringView QZoneData::id() const constexpr QLatin1StringView ZoneData::id() const
{ return QLatin1StringView(ianaIdData + ianaIdIndex); } { return QLatin1StringView(ianaIdData + ianaIdIndex); }
} // namespace QtTimeZoneCldr
QT_END_NAMESPACE QT_END_NAMESPACE
#endif // QTIMEZONEPRIVATE_DATA_P_H #endif // QTIMEZONEPRIVATE_DATA_P_H

View File

@ -258,6 +258,7 @@ class ByteArrayData:
out('\n};\n') out('\n};\n')
class ZoneIdWriter (SourceFileEditor): class ZoneIdWriter (SourceFileEditor):
# All the output goes into namespace QtTimeZoneCldr.
def write(self, version, defaults, windowsIds): def write(self, version, defaults, windowsIds):
self.__writeWarning(version) self.__writeWarning(version)
windows, iana = self.__writeTables(self.writer.write, defaults, windowsIds) windows, iana = self.__writeTables(self.writer.write, defaults, windowsIds)
@ -284,7 +285,7 @@ class ZoneIdWriter (SourceFileEditor):
# Write Windows/IANA table # Write Windows/IANA table
out('// Windows ID Key, Territory Enum, IANA ID Index\n') 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) # Sorted by (Windows ID Key, territory enum)
for index, data in sorted(windowsIds.items()): for index, data in sorted(windowsIds.items()):
out(' {{ {:6d},{:6d},{:6d} }}, // {} / {}\n'.format( out(' {{ {:6d},{:6d},{:6d} }}, // {} / {}\n'.format(
@ -295,7 +296,7 @@ class ZoneIdWriter (SourceFileEditor):
# Write Windows ID key table # Write Windows ID key table
out('// Windows ID Key, Windows ID Index, IANA ID Index, UTC Offset\n') 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 # Sorted by Windows ID key; sorting case-insensitively by
# Windows ID must give the same order. # Windows ID must give the same order.
winIdNames = [x.lower() for x, y in windowsIdList] winIdNames = [x.lower() for x, y in windowsIdList]
@ -314,7 +315,7 @@ class ZoneIdWriter (SourceFileEditor):
offsetMap[pair[1]] = offsetMap.get(pair[1], ()) + (pair[0],) offsetMap[pair[1]] = offsetMap.get(pair[1], ()) + (pair[0],)
# Write UTC ID key table # Write UTC ID key table
out('// IANA ID Index, UTC Offset\n') 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. for offset in sorted(offsetMap.keys()): # Sort so C++ can binary-chop.
names = offsetMap[offset]; names = offsetMap[offset];
out(' {{ {:6d},{:6d} }}, // {}\n'.format( out(' {{ {:6d},{:6d} }}, // {}\n'.format(