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 <antkudr@mail.ru>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
bb10
Marc Mutz 2017-01-31 01:04:45 +01:00
parent 9c243d2637
commit d68c162c1b
7 changed files with 94 additions and 22 deletions

View File

@ -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;
}

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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()