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:
parent
a736e613fc
commit
b0f4bd7f23
@ -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) {
|
||||||
|
@ -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
|
||||||
|
@ -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(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user