Simplify QDateTimeParser's shiny new findTextEntry()
Decouple from the callers' offset into a larger list; just search for an entry in a list, let the caller deal with the offset. Also, defer a .tolower() to save the need to allocate a copy of each list entry. Change-Id: I748d5214c2cc6dc592fe2bd41e3f8150f71c335b Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
65bafcc29d
commit
326f1fdb7d
@ -1244,19 +1244,28 @@ end:
|
||||
|
||||
#ifndef QT_NO_TEXTDATE
|
||||
|
||||
static int findTextEntry(const QString &text, int start, const QVector<QString> &entries, QString *usedText, int *used)
|
||||
/*
|
||||
\internal
|
||||
\brief Returns the index in \a entries with the best prefix match to \a text
|
||||
|
||||
Scans \a entries looking for an entry overlapping \a text as much as possible.
|
||||
Records the length of overlap in *used (if \a used is non-NULL) and the first
|
||||
entry that overlapped this much in *usedText (if \a usedText is non-NULL).
|
||||
*/
|
||||
static int findTextEntry(const QString &text, const QVector<QString> &entries, QString *usedText, int *used)
|
||||
{
|
||||
if (text.isEmpty())
|
||||
return -1;
|
||||
|
||||
int bestMatch = -1;
|
||||
int bestCount = 0;
|
||||
for (int n = start; n <= entries.size(); ++n) {
|
||||
const QString name = entries.at(n - 1).toLower();
|
||||
for (int n = 0; n < entries.size(); ++n)
|
||||
{
|
||||
const QString &name = entries.at(n);
|
||||
|
||||
const int limit = qMin(text.size(), name.size());
|
||||
int i = 0;
|
||||
while (i < limit && text.at(i) == name.at(i))
|
||||
while (i < limit && text.at(i) == name.at(i).toLower())
|
||||
++i;
|
||||
if (i > bestCount) {
|
||||
bestCount = i;
|
||||
@ -1264,7 +1273,7 @@ static int findTextEntry(const QString &text, int start, const QVector<QString>
|
||||
}
|
||||
}
|
||||
if (usedText && bestMatch != -1)
|
||||
*usedText = entries.at(bestMatch - 1);
|
||||
*usedText = entries.at(bestMatch);
|
||||
if (used)
|
||||
*used = bestCount;
|
||||
|
||||
@ -1289,11 +1298,12 @@ int QDateTimeParser::findMonth(const QString &str1, int startMonth, int sectionI
|
||||
QLocale::FormatType type = sn.count == 3 ? QLocale::ShortFormat : QLocale::LongFormat;
|
||||
QLocale l = locale();
|
||||
QVector<QString> monthNames;
|
||||
monthNames.reserve(12);
|
||||
for (int month = 1; month <= 12; ++month)
|
||||
monthNames.append(month >= startMonth ? l.monthName(month, type) : QString());
|
||||
monthNames.reserve(13 - startMonth);
|
||||
for (int month = startMonth; month <= 12; ++month)
|
||||
monthNames.append(l.monthName(month, type));
|
||||
|
||||
return findTextEntry(str1, startMonth, monthNames, usedMonth, used);
|
||||
const int index = findTextEntry(str1, monthNames, usedMonth, used);
|
||||
return index < 0 ? index : index + startMonth;
|
||||
}
|
||||
|
||||
int QDateTimeParser::findDay(const QString &str1, int startDay, int sectionIndex, QString *usedDay, int *used) const
|
||||
@ -1307,10 +1317,12 @@ int QDateTimeParser::findDay(const QString &str1, int startDay, int sectionIndex
|
||||
QLocale::FormatType type = sn.count == 4 ? QLocale::LongFormat : QLocale::ShortFormat;
|
||||
QLocale l = locale();
|
||||
QVector<QString> daysOfWeek;
|
||||
daysOfWeek.reserve(7);
|
||||
for (int day = 1; day <= 7; ++day)
|
||||
daysOfWeek.append(day >= startDay ? l.dayName(day, type) : QString());
|
||||
return findTextEntry(str1, startDay, daysOfWeek, usedDay, used);
|
||||
daysOfWeek.reserve(8 - startDay);
|
||||
for (int day = startDay; day <= 7; ++day)
|
||||
daysOfWeek.append(l.dayName(day, type));
|
||||
|
||||
const int index = findTextEntry(str1, daysOfWeek, usedDay, used);
|
||||
return index < 0 ? index : index + startDay;
|
||||
}
|
||||
#endif // QT_NO_TEXTDATE
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user