From c32b15f1198f3f53dbe7770181257f0d9bd77dee Mon Sep 17 00:00:00 2001 From: Ivan Solovev Date: Wed, 17 Jan 2024 16:30:03 +0100 Subject: [PATCH] Make public QLocale's constant for the two-digit-year base The private QLocale::FirstTwoDigitYear constant, which is used as a default value for the parameters in some methods, causes troubles for Qt for Python Team, because they need to use the default values in the binding code. It also potentially create some inconveniences for the users who want to write functions wrapping these methods. The name is also confusing, because, when read out of context, it implies that there might be SecondTwoDigitYear, etc... Rename QLocale::FirstTwoDigitYear to QLocale::DefaultTwoDigitBaseYear and make it public. Now when the constant is public, we can use it in QDate, instead of introducing another constant, so do that. The qdatetime.h header already includes qlocale.h via qcalendar.h, but, rather than relying on this transitive include, add it explicitly. As pointed out by Thiago [1], the static constexpr members of exported classes need out-of-line definitions, so add such definition to qlocale.cpp. Amends 41f84f3ddb780ec751e3fc706dd242fc4a99de7a Found in 6.7 API review. [1]: https://lists.qt-project.org/pipermail/development/2024-January/044888.html Change-Id: Ib3c6f1d5b181968bf311fd0435173e025a369865 Reviewed-by: Volker Hilsheimer Reviewed-by: Friedemann Kleint Reviewed-by: Marc Mutz (cherry picked from commit cde7d5d3ff56fdf219771c65bf93f3f08757f154) Reviewed-by: Qt Cherry-pick Bot --- src/corelib/compat/removed_api.cpp | 16 +++++++-------- src/corelib/text/qlocale.cpp | 17 ++++++++++++++++ src/corelib/text/qlocale.h | 20 +++++++++---------- src/corelib/time/qdatetime.h | 29 +++++++++++++++------------- src/corelib/time/qdatetimeparser_p.h | 4 ++-- 5 files changed, 53 insertions(+), 33 deletions(-) diff --git a/src/corelib/compat/removed_api.cpp b/src/corelib/compat/removed_api.cpp index 2f62a3055d8..0c48b8251c4 100644 --- a/src/corelib/compat/removed_api.cpp +++ b/src/corelib/compat/removed_api.cpp @@ -794,42 +794,42 @@ QString QLocale::bcp47Name() const QDate QLocale::toDate(const QString &string, FormatType format) const { - return toDate(string, dateFormat(format), FirstTwoDigitYear); + return toDate(string, dateFormat(format), DefaultTwoDigitBaseYear); } QDate QLocale::toDate(const QString &string, FormatType format, QCalendar cal) const { - return toDate(string, dateFormat(format), cal, FirstTwoDigitYear); + return toDate(string, dateFormat(format), cal, DefaultTwoDigitBaseYear); } QDateTime QLocale::toDateTime(const QString &string, FormatType format) const { - return toDateTime(string, dateTimeFormat(format), FirstTwoDigitYear); + return toDateTime(string, dateTimeFormat(format), DefaultTwoDigitBaseYear); } QDateTime QLocale::toDateTime(const QString &string, FormatType format, QCalendar cal) const { - return toDateTime(string, dateTimeFormat(format), cal, FirstTwoDigitYear); + return toDateTime(string, dateTimeFormat(format), cal, DefaultTwoDigitBaseYear); } QDate QLocale::toDate(const QString &string, const QString &format) const { - return toDate(string, format, QCalendar(), FirstTwoDigitYear); + return toDate(string, format, QCalendar(), DefaultTwoDigitBaseYear); } QDate QLocale::toDate(const QString &string, const QString &format, QCalendar cal) const { - return toDate(string, format, cal, FirstTwoDigitYear); + return toDate(string, format, cal, DefaultTwoDigitBaseYear); } QDateTime QLocale::toDateTime(const QString &string, const QString &format) const { - return toDateTime(string, format, QCalendar(), FirstTwoDigitYear); + return toDateTime(string, format, QCalendar(), DefaultTwoDigitBaseYear); } QDateTime QLocale::toDateTime(const QString &string, const QString &format, QCalendar cal) const { - return toDateTime(string, format, cal, FirstTwoDigitYear); + return toDateTime(string, format, cal, DefaultTwoDigitBaseYear); } #include "qobject.h" diff --git a/src/corelib/text/qlocale.cpp b/src/corelib/text/qlocale.cpp index 65af3a012d9..7e08903055d 100644 --- a/src/corelib/text/qlocale.cpp +++ b/src/corelib/text/qlocale.cpp @@ -54,6 +54,8 @@ QT_WARNING_DISABLE_GCC("-Wfree-nonheap-object") // false positive tracking QT_BEGIN_NAMESPACE +constexpr int QLocale::DefaultTwoDigitBaseYear; + QT_IMPL_METATYPE_EXTERN_TAGGED(QList, QList_Qt__DayOfWeek) #ifndef QT_NO_SYSTEMLOCALE QT_IMPL_METATYPE_EXTERN_TAGGED(QSystemLocale::CurrencyToStringArgument, @@ -1001,6 +1003,21 @@ QLocale::QLocale(QLocalePrivate &dd) : d(&dd) {} +/*! + \variable QLocale::DefaultTwoDigitBaseYear + \since 6.7 + + \brief The default start year of the century within which a format taking + a two-digit year will select. The value of the constant is \c {1900}. + + Some locales use, particularly for ShortFormat, only the last two digits of + the year. Proir to 6.7 the year 1900 was always used as a base year for + such cases. Now various QLocale and QDate functions have the overloads that + allow callers to specify the base year, and this constant is used as its + default value. + + \sa toDate(), toDateTime(), QDate::fromString(), QDateTime::fromString() +*/ /*! \since 6.3 diff --git a/src/corelib/text/qlocale.h b/src/corelib/text/qlocale.h index bc04ae5cdc0..30270673636 100644 --- a/src/corelib/text/qlocale.h +++ b/src/corelib/text/qlocale.h @@ -35,9 +35,9 @@ class Q_CORE_EXPORT QLocale friend class QTextStream; friend class QTextStreamPrivate; - static constexpr int FirstTwoDigitYear = 1900; // sync with QDate - public: + static constexpr int DefaultTwoDigitBaseYear = 1900; + // see qlocale_data_p.h for more info on generated data // GENERATED PART STARTS HERE enum Language : ushort { @@ -1030,22 +1030,22 @@ public: QDateTime toDateTime(const QString &string, const QString &format, QCalendar cal) const; # endif QDate toDate(const QString &string, FormatType = LongFormat, - int baseYear = FirstTwoDigitYear) const; + int baseYear = DefaultTwoDigitBaseYear) const; QDate toDate(const QString &string, const QString &format, - int baseYear = FirstTwoDigitYear) const; + int baseYear = DefaultTwoDigitBaseYear) const; QDateTime toDateTime(const QString &string, FormatType format = LongFormat, - int baseYear = FirstTwoDigitYear) const; + int baseYear = DefaultTwoDigitBaseYear) const; QDateTime toDateTime(const QString &string, const QString &format, - int baseYear = FirstTwoDigitYear) const; + int baseYear = DefaultTwoDigitBaseYear) const; // Calendar-aware API QDate toDate(const QString &string, FormatType format, QCalendar cal, - int baseYear = FirstTwoDigitYear) const; + int baseYear = DefaultTwoDigitBaseYear) const; QDate toDate(const QString &string, const QString &format, QCalendar cal, - int baseYear = FirstTwoDigitYear) const; + int baseYear = DefaultTwoDigitBaseYear) const; QDateTime toDateTime(const QString &string, FormatType format, QCalendar cal, - int baseYear = FirstTwoDigitYear) const; + int baseYear = DefaultTwoDigitBaseYear) const; QDateTime toDateTime(const QString &string, const QString &format, QCalendar cal, - int baseYear = FirstTwoDigitYear) const; + int baseYear = DefaultTwoDigitBaseYear) const; #endif QString decimalPoint() const; diff --git a/src/corelib/time/qdatetime.h b/src/corelib/time/qdatetime.h index ce585204757..518705fca72 100644 --- a/src/corelib/time/qdatetime.h +++ b/src/corelib/time/qdatetime.h @@ -7,6 +7,7 @@ #include #include +#include #include #include #include @@ -27,7 +28,6 @@ class QDateTime; class Q_CORE_EXPORT QDate { explicit constexpr QDate(qint64 julianDay) : jd(julianDay) {} - static constexpr int FirstTwoDigitYear = 1900; // sync with QLocale public: constexpr QDate() : jd(nullJd()) {} QDate(int y, int m, int d); @@ -135,21 +135,24 @@ public: // Accept calendar without over-ride of base year: static QDate fromString(QStringView string, QStringView format, QCalendar cal) - { return fromString(string.toString(), format, FirstTwoDigitYear, cal); } + { return fromString(string.toString(), format, QLocale::DefaultTwoDigitBaseYear, cal); } QT_CORE_INLINE_SINCE(6, 7) static QDate fromString(const QString &string, QStringView format, QCalendar cal); static QDate fromString(const QString &string, const QString &format, QCalendar cal) - { return fromString(string, qToStringViewIgnoringNull(format), FirstTwoDigitYear, cal); } + { return fromString(string, qToStringViewIgnoringNull(format), QLocale::DefaultTwoDigitBaseYear, cal); } // Overriding base year is likely more common than overriding calendar (and // likely to get more so, as the legacy base drops ever further behind us). static QDate fromString(QStringView string, QStringView format, - int baseYear = FirstTwoDigitYear, QCalendar cal = QCalendar()) + int baseYear = QLocale::DefaultTwoDigitBaseYear, + QCalendar cal = QCalendar()) { return fromString(string.toString(), format, baseYear, cal); } static QDate fromString(const QString &string, QStringView format, - int baseYear = FirstTwoDigitYear, QCalendar cal = QCalendar()); + int baseYear = QLocale::DefaultTwoDigitBaseYear, + QCalendar cal = QCalendar()); static QDate fromString(const QString &string, const QString &format, - int baseYear = FirstTwoDigitYear, QCalendar cal = QCalendar()) + int baseYear = QLocale::DefaultTwoDigitBaseYear, + QCalendar cal = QCalendar()) { return fromString(string, qToStringViewIgnoringNull(format), baseYear, cal); } #endif static bool isValid(int y, int m, int d); @@ -439,23 +442,23 @@ public: // Accept calendar without over-ride of base year: static QDateTime fromString(QStringView string, QStringView format, QCalendar cal) - { return fromString(string.toString(), format, QDate::FirstTwoDigitYear, cal); } + { return fromString(string.toString(), format, QLocale::DefaultTwoDigitBaseYear, cal); } QT_CORE_INLINE_SINCE(6, 7) static QDateTime fromString(const QString &string, QStringView format, QCalendar cal); static QDateTime fromString(const QString &string, const QString &format, QCalendar cal) - { return fromString(string, qToStringViewIgnoringNull(format), QDate::FirstTwoDigitYear, cal); } + { return fromString(string, qToStringViewIgnoringNull(format), QLocale::DefaultTwoDigitBaseYear, cal); } // Overriding base year is likely more common than overriding calendar (and // likely to get more so, as the legacy base drops ever further behind us). static QDateTime fromString(QStringView string, QStringView format, - int baseYear = QDate::FirstTwoDigitYear, + int baseYear = QLocale::DefaultTwoDigitBaseYear, QCalendar cal = QCalendar()) { return fromString(string.toString(), format, baseYear, cal); } static QDateTime fromString(const QString &string, QStringView format, - int baseYear = QDate::FirstTwoDigitYear, + int baseYear = QLocale::DefaultTwoDigitBaseYear, QCalendar cal = QCalendar()); static QDateTime fromString(const QString &string, const QString &format, - int baseYear = QDate::FirstTwoDigitYear, + int baseYear = QLocale::DefaultTwoDigitBaseYear, QCalendar cal = QCalendar()) { return fromString(string, qToStringViewIgnoringNull(format), baseYear, cal); } #endif @@ -626,12 +629,12 @@ Q_CORE_EXPORT size_t qHash(QTime key, size_t seed = 0) noexcept; #if QT_CORE_INLINE_IMPL_SINCE(6, 7) QDate QDate::fromString(const QString &string, QStringView format, QCalendar cal) { - return fromString(string, format, FirstTwoDigitYear, cal); + return fromString(string, format, QLocale::DefaultTwoDigitBaseYear, cal); } QDateTime QDateTime::fromString(const QString &string, QStringView format, QCalendar cal) { - return fromString(string, format, QDate::FirstTwoDigitYear, cal); + return fromString(string, format, QLocale::DefaultTwoDigitBaseYear, cal); } #endif diff --git a/src/corelib/time/qdatetimeparser_p.h b/src/corelib/time/qdatetimeparser_p.h index 53d48c1009b..6fc4121e089 100644 --- a/src/corelib/time/qdatetimeparser_p.h +++ b/src/corelib/time/qdatetimeparser_p.h @@ -137,7 +137,7 @@ public: StateNode parse(const QString &input, int position, const QDateTime &defaultValue, bool fixup) const; bool fromString(const QString &text, QDate *date, QTime *time, - int baseYear = QDate::FirstTwoDigitYear) const; + int baseYear = QLocale::DefaultTwoDigitBaseYear) const; bool fromString(const QString &text, QDateTime *datetime, int baseYear) const; bool parseFormat(QStringView format); @@ -236,7 +236,7 @@ protected: // for the benefit of QDateTimeEditPrivate virtual QLocale locale() const { return defaultLocale; } mutable int currentSectionIndex = int(NoSectionIndex); - mutable int defaultCenturyStart = QDate::FirstTwoDigitYear; + mutable int defaultCenturyStart = QLocale::DefaultTwoDigitBaseYear; Sections display; /* This stores the most recently selected day.