From d68c162c1b90e9e5a3d9dd4b035663ba57d3391b Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Tue, 31 Jan 2017 01:04:45 +0100 Subject: QLocale: add toString(Q(Date|QTime)+, QStringView format) overloads While at it, change the interface of qt_repeatCount() to just take a single QStringView, since QStringView::mid() is so cheap. Add some \internal docs. [ChangeLog][QtCore][QLocale] Added toString(QDate/QTime/QDateTime) overloads taking the format string as a QStringView. Change-Id: Ic078796677a6db06227c8a3e276dbdb1039ceead Reviewed-by: Anton Kudryavtsev Reviewed-by: Edward Welbourne --- src/corelib/tools/qdatetime.cpp | 4 +- src/corelib/tools/qlocale.cpp | 80 +++++++++++++++++++++--- src/corelib/tools/qlocale.h | 10 ++- src/corelib/tools/qlocale_mac.mm | 4 +- src/corelib/tools/qlocale_p.h | 6 +- src/corelib/tools/qlocale_win.cpp | 6 +- tests/auto/corelib/tools/qlocale/tst_qlocale.cpp | 6 ++ 7 files changed, 94 insertions(+), 22 deletions(-) diff --git a/src/corelib/tools/qdatetime.cpp b/src/corelib/tools/qdatetime.cpp index a4a7aabacb..ab1e3672d6 100644 --- a/src/corelib/tools/qdatetime.cpp +++ b/src/corelib/tools/qdatetime.cpp @@ -866,7 +866,7 @@ QString QDate::toString(Qt::DateFormat format) const case Qt::DefaultLocaleLongDate: return QLocale().toString(*this, QLocale::LongFormat); case Qt::RFC2822Date: - return QLocale::c().toString(*this, QStringLiteral("dd MMM yyyy")); + return QLocale::c().toString(*this, QStringViewLiteral("dd MMM yyyy")); default: #ifndef QT_NO_TEXTDATE case Qt::TextDate: @@ -3795,7 +3795,7 @@ QString QDateTime::toString(Qt::DateFormat format) const case Qt::DefaultLocaleLongDate: return QLocale().toString(*this, QLocale::LongFormat); case Qt::RFC2822Date: { - buf = QLocale::c().toString(*this, QStringLiteral("dd MMM yyyy hh:mm:ss ")); + buf = QLocale::c().toString(*this, QStringViewLiteral("dd MMM yyyy hh:mm:ss ")); buf += toOffsetString(Qt::TextDate, offsetFromUtc()); return buf; } diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp index a3995449f1..bad1481575 100644 --- a/src/corelib/tools/qlocale.cpp +++ b/src/corelib/tools/qlocale.cpp @@ -518,7 +518,7 @@ static const QLocaleData *findLocaleData(const QString &name) return QLocaleData::findLocaleData(lang, script, cntry); } -QString qt_readEscapedFormatString(const QString &format, int *idx) +QString qt_readEscapedFormatString(QStringView format, int *idx) { int &i = *idx; @@ -552,13 +552,31 @@ QString qt_readEscapedFormatString(const QString &format, int *idx) return result; } -int qt_repeatCount(const QString &s, int i) +/*! + \internal + + Counts the number of identical leading characters in \a s. + + If \a s is empty, returns 0. + + Otherwise, returns the number of consecutive \c{s.front()} + characters at the start of \a s. + + \code + qt_repeatCount(u"a"); // == 1 + qt_repeatCount(u"ab"); // == 1 + qt_repeatCount(u"aab"); // == 2 + \endcode +*/ +int qt_repeatCount(QStringView s) { - QChar c = s.at(i); - int j = i + 1; + if (s.isEmpty()) + return 0; + const QChar c = s.front(); + qssize_t j = 1; while (j < s.size() && s.at(j) == c) ++j; - return j - i; + return int(j); } static const QLocaleData *default_data = 0; @@ -1725,6 +1743,7 @@ QString QLocale::toString(qulonglong i) const return d->m_data->unsLongLongToString(i, -1, 10, -1, flags); } +#if QT_STRINGVIEW_LEVEL < 2 /*! Returns a localized string representation of the given \a date in the specified \a format. @@ -1735,6 +1754,19 @@ QString QLocale::toString(const QDate &date, const QString &format) const { return d->dateTimeToString(format, QDateTime(), date, QTime(), this); } +#endif + +/*! + \since 5.10 + + Returns a localized string representation of the given \a date in the + specified \a format. + If \a format is an empty string, an empty string is returned. +*/ +QString QLocale::toString(const QDate &date, QStringView format) const +{ + return d->dateTimeToString(format, QDateTime(), date, QTime(), this); +} /*! Returns a localized string representation of the given \a date according @@ -1760,7 +1792,7 @@ QString QLocale::toString(const QDate &date, FormatType format) const return toString(date, format_str); } -static bool timeFormatContainsAP(const QString &format) +static bool timeFormatContainsAP(QStringView format) { int i = 0; while (i < format.size()) { @@ -1777,6 +1809,7 @@ static bool timeFormatContainsAP(const QString &format) return false; } +#if QT_STRINGVIEW_LEVEL < 2 /*! Returns a localized string representation of the given \a time according to the specified \a format. @@ -1786,7 +1819,21 @@ QString QLocale::toString(const QTime &time, const QString &format) const { return d->dateTimeToString(format, QDateTime(), QDate(), time, this); } +#endif +/*! + \since 5.10 + + Returns a localized string representation of the given \a time according + to the specified \a format. + If \a format is an empty string, an empty string is returned. +*/ +QString QLocale::toString(const QTime &time, QStringView format) const +{ + return d->dateTimeToString(format, QDateTime(), QDate(), time, this); +} + +#if QT_STRINGVIEW_LEVEL < 2 /*! \since 4.4 @@ -1799,6 +1846,19 @@ QString QLocale::toString(const QDateTime &dateTime, const QString &format) cons { return d->dateTimeToString(format, dateTime, QDate(), QTime(), this); } +#endif + +/*! + \since 5.10 + + Returns a localized string representation of the given \a dateTime according + to the specified \a format. + If \a format is an empty string, an empty string is returned. +*/ +QString QLocale::toString(const QDateTime &dateTime, QStringView format) const +{ + return d->dateTimeToString(format, dateTime, QDate(), QTime(), this); +} /*! \since 4.4 @@ -2710,7 +2770,7 @@ QString QLocale::pmText() const } -QString QLocalePrivate::dateTimeToString(const QString &format, const QDateTime &datetime, +QString QLocalePrivate::dateTimeToString(QStringView format, const QDateTime &datetime, const QDate &dateOnly, const QTime &timeOnly, const QLocale *q) const { @@ -2743,7 +2803,7 @@ QString QLocalePrivate::dateTimeToString(const QString &format, const QDateTime } const QChar c = format.at(i); - int repeat = qt_repeatCount(format, i); + int repeat = qt_repeatCount(format.mid(i)); bool used = false; if (formatDate) { switch (c.unicode()) { @@ -2878,7 +2938,7 @@ QString QLocalePrivate::dateTimeToString(const QString &format, const QDateTime case 'a': used = true; - if (i + 1 < format.length() && format.at(i + 1).unicode() == 'p') { + if (i + 1 < format.size() && format.at(i + 1).unicode() == 'p') { repeat = 2; } else { repeat = 1; @@ -2888,7 +2948,7 @@ QString QLocalePrivate::dateTimeToString(const QString &format, const QDateTime case 'A': used = true; - if (i + 1 < format.length() && format.at(i + 1).unicode() == 'P') { + if (i + 1 < format.size() && format.at(i + 1).unicode() == 'P') { repeat = 2; } else { repeat = 1; diff --git a/src/corelib/tools/qlocale.h b/src/corelib/tools/qlocale.h index 1f20bcd241..f9482a7e3a 100644 --- a/src/corelib/tools/qlocale.h +++ b/src/corelib/tools/qlocale.h @@ -972,12 +972,18 @@ public: inline QString toString(uint i) const; QString toString(double i, char f = 'g', int prec = 6) const; inline QString toString(float i, char f = 'g', int prec = 6) const; + +#if QT_STRINGVIEW_LEVEL < 2 QString toString(const QDate &date, const QString &formatStr) const; - QString toString(const QDate &date, FormatType format = LongFormat) const; QString toString(const QTime &time, const QString &formatStr) const; + QString toString(const QDateTime &dateTime, const QString &format) const; +#endif + QString toString(const QDate &date, QStringView formatStr) const; + QString toString(const QTime &time, QStringView formatStr) const; + QString toString(const QDateTime &dateTime, QStringView format) const; + QString toString(const QDate &date, FormatType format = LongFormat) const; QString toString(const QTime &time, FormatType format = LongFormat) const; QString toString(const QDateTime &dateTime, FormatType format = LongFormat) const; - QString toString(const QDateTime &dateTime, const QString &format) const; QString dateFormat(FormatType format = LongFormat) const; QString timeFormat(FormatType format = LongFormat) const; diff --git a/src/corelib/tools/qlocale_mac.mm b/src/corelib/tools/qlocale_mac.mm index c5519bfabf..edbaaf5d18 100644 --- a/src/corelib/tools/qlocale_mac.mm +++ b/src/corelib/tools/qlocale_mac.mm @@ -150,7 +150,7 @@ static QString macTimeToString(const QTime &time, bool short_format) // See also qtbase/util/local_database/dateconverter.py // Makes the assumption that input formats are always well formed and consecutive letters // never exceed the maximum for the format code. -static QString macToQtFormat(const QString &sys_fmt) +static QString macToQtFormat(QStringView sys_fmt) { QString result; int i = 0; @@ -166,7 +166,7 @@ static QString macToQtFormat(const QString &sys_fmt) } QChar c = sys_fmt.at(i); - int repeat = qt_repeatCount(sys_fmt, i); + int repeat = qt_repeatCount(sys_fmt.mid(i)); switch (c.unicode()) { // Qt does not support the following options diff --git a/src/corelib/tools/qlocale_p.h b/src/corelib/tools/qlocale_p.h index 589eae3cfb..12d5c60324 100644 --- a/src/corelib/tools/qlocale_p.h +++ b/src/corelib/tools/qlocale_p.h @@ -362,7 +362,7 @@ public: static void updateSystemPrivate(); - QString dateTimeToString(const QString &format, const QDateTime &datetime, + QString dateTimeToString(QStringView format, const QDateTime &datetime, const QDate &dateOnly, const QTime &timeOnly, const QLocale *q) const; @@ -412,9 +412,9 @@ inline char QLocaleData::digitToCLocale(QChar in) const return 0; } -QString qt_readEscapedFormatString(const QString &format, int *idx); +QString qt_readEscapedFormatString(QStringView format, int *idx); bool qt_splitLocaleName(const QString &name, QString &lang, QString &script, QString &cntry); -int qt_repeatCount(const QString &s, int i); +int qt_repeatCount(QStringView s); enum { AsciiSpaceMask = (1 << (' ' - 1)) | (1 << ('\t' - 1)) | // 9: HT - horizontal tab diff --git a/src/corelib/tools/qlocale_win.cpp b/src/corelib/tools/qlocale_win.cpp index 2475859abd..1d80320d8e 100644 --- a/src/corelib/tools/qlocale_win.cpp +++ b/src/corelib/tools/qlocale_win.cpp @@ -160,7 +160,7 @@ private: SubstitutionType substitution(); QString &substituteDigits(QString &string); - static QString winToQtFormat(const QString &sys_fmt); + static QString winToQtFormat(QStringView sys_fmt); }; Q_GLOBAL_STATIC(QSystemLocalePrivate, systemLocalePrivate) @@ -680,7 +680,7 @@ void QSystemLocalePrivate::update() zero = QChar(); } -QString QSystemLocalePrivate::winToQtFormat(const QString &sys_fmt) +QString QSystemLocalePrivate::winToQtFormat(QStringView sys_fmt) { QString result; int i = 0; @@ -696,7 +696,7 @@ QString QSystemLocalePrivate::winToQtFormat(const QString &sys_fmt) } QChar c = sys_fmt.at(i); - int repeat = qt_repeatCount(sys_fmt, i); + int repeat = qt_repeatCount(sys_fmt.mid(i)); switch (c.unicode()) { // Date diff --git a/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp b/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp index 9248970c96..2c342dcfe6 100644 --- a/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp +++ b/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp @@ -1163,6 +1163,9 @@ void tst_QLocale::dayOfWeek() QCOMPARE(QLocale::c().toString(date, "ddd"), shortName); QCOMPARE(QLocale::c().toString(date, "dddd"), longName); + + QCOMPARE(QLocale::c().toString(date, QStringViewLiteral("ddd")), shortName); + QCOMPARE(QLocale::c().toString(date, QStringViewLiteral("dddd")), longName); } void tst_QLocale::formatDate_data() @@ -1205,6 +1208,7 @@ void tst_QLocale::formatDate() QLocale l(QLocale::C); QCOMPARE(l.toString(date, format), result); + QCOMPARE(l.toString(date, QStringView(format)), result); } @@ -1260,6 +1264,7 @@ void tst_QLocale::formatTime() QLocale l(QLocale::C); QCOMPARE(l.toString(time, format), result); + QCOMPARE(l.toString(time, QStringView(format)), result); } @@ -1421,6 +1426,7 @@ void tst_QLocale::formatDateTime() QLocale l(localeName); QCOMPARE(l.toString(dateTime, format), result); + QCOMPARE(l.toString(dateTime, QStringView(format)), result); } void tst_QLocale::formatTimeZone() -- cgit v1.2.3