summaryrefslogtreecommitdiffstats
path: root/src/corelib/tools
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2017-01-26 00:37:14 +0000
committerThe Qt Project <gerrit-noreply@qt-project.org>2017-01-26 00:37:14 +0000
commit398a7e736cb42ac42f0887989585b1121b7e6e62 (patch)
tree916854b706b9b057fa1483f76dd48998a8aa28a0 /src/corelib/tools
parent4d3a35f63788fa5ff7a11a5bb7bd6176bd2ac70e (diff)
parent318b58562ae89453fb98e8145cd0440e14ba60b0 (diff)
Merge "Merge remote-tracking branch 'origin/5.8' into dev" into refs/staging/dev
Diffstat (limited to 'src/corelib/tools')
-rw-r--r--src/corelib/tools/qdatetimeparser.cpp21
-rw-r--r--src/corelib/tools/qlocale.cpp87
-rw-r--r--src/corelib/tools/qvector.h2
3 files changed, 82 insertions, 28 deletions
diff --git a/src/corelib/tools/qdatetimeparser.cpp b/src/corelib/tools/qdatetimeparser.cpp
index 621c877174..65016933a0 100644
--- a/src/corelib/tools/qdatetimeparser.cpp
+++ b/src/corelib/tools/qdatetimeparser.cpp
@@ -1139,6 +1139,7 @@ end:
}
break; }
}
+ Q_FALLTHROUGH();
case MonthSection:
if (sn.count >= 3) {
const int currentMonth = newCurrentValue.date().month();
@@ -1216,15 +1217,15 @@ end:
} else {
if (context == FromString) {
// optimization
- Q_ASSERT(getMaximum().date().toJulianDay() == 4642999);
+ Q_ASSERT(maximum.date().toJulianDay() == 4642999);
if (newCurrentValue.date().toJulianDay() > 4642999)
state = Invalid;
} else {
- if (newCurrentValue > getMaximum())
+ if (newCurrentValue > maximum)
state = Invalid;
}
- QDTPDEBUG << "not checking intermediate because newCurrentValue is" << newCurrentValue << getMinimum() << getMaximum();
+ QDTPDEBUG << "not checking intermediate because newCurrentValue is" << newCurrentValue << minimum << maximum;
}
}
StateNode node;
@@ -1607,13 +1608,13 @@ bool QDateTimeParser::potentialValue(const QStringRef &str, int min, int max, in
bool QDateTimeParser::skipToNextSection(int index, const QDateTime &current, const QStringRef &text) const
{
- Q_ASSERT(current >= getMinimum() && current <= getMaximum());
-
const SectionNode &node = sectionNode(index);
Q_ASSERT(text.size() < sectionMaxSize(index));
const QDateTime maximum = getMaximum();
const QDateTime minimum = getMinimum();
+ Q_ASSERT(current >= minimum && current <= maximum);
+
QDateTime tmp = current;
int min = absoluteMin(index);
setDigit(tmp, index, min);
@@ -1713,11 +1714,21 @@ bool QDateTimeParser::fromString(const QString &t, QDate *date, QTime *time) con
QDateTime QDateTimeParser::getMinimum() const
{
+ // Cache the most common case
+ if (spec == Qt::LocalTime) {
+ static const QDateTime localTimeMin(QDATETIMEEDIT_DATE_MIN, QDATETIMEEDIT_TIME_MIN, Qt::LocalTime);
+ return localTimeMin;
+ }
return QDateTime(QDATETIMEEDIT_DATE_MIN, QDATETIMEEDIT_TIME_MIN, spec);
}
QDateTime QDateTimeParser::getMaximum() const
{
+ // Cache the most common case
+ if (spec == Qt::LocalTime) {
+ static const QDateTime localTimeMax(QDATETIMEEDIT_DATE_MAX, QDATETIMEEDIT_TIME_MAX, Qt::LocalTime);
+ return localTimeMax;
+ }
return QDateTime(QDATETIMEEDIT_DATE_MAX, QDATETIMEEDIT_TIME_MAX, spec);
}
diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index 77f7ba963b..cdda5292e7 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -334,33 +334,17 @@ QByteArray QLocalePrivate::bcp47Name(char separator) const
return localeId.withLikelySubtagsRemoved().name(separator);
}
-const QLocaleData *QLocaleData::findLocaleData(QLocale::Language language, QLocale::Script script, QLocale::Country country)
+static const QLocaleData *findLocaleDataById(const QLocaleId &localeId)
{
- QLocaleId localeId = QLocaleId::fromIds(language, script, country);
- localeId = localeId.withLikelySubtagsAdded();
-
- uint idx = locale_index[localeId.language_id];
+ const uint idx = locale_index[localeId.language_id];
const QLocaleData *data = locale_data + idx;
- if (idx == 0) // default language has no associated country
+ if (idx == 0) // default language has no associated script or country
return data;
Q_ASSERT(data->m_language_id == localeId.language_id);
- if (localeId.script_id != QLocale::AnyScript && localeId.country_id != QLocale::AnyCountry) {
- // both script and country are explicitly specified
- do {
- if (data->m_script_id == localeId.script_id && data->m_country_id == localeId.country_id)
- return data;
- ++data;
- } while (data->m_language_id == localeId.language_id);
-
- // no match; try again with default script
- localeId.script_id = QLocale::AnyScript;
- data = locale_data + idx;
- }
-
if (localeId.script_id == QLocale::AnyScript && localeId.country_id == QLocale::AnyCountry)
return data;
@@ -369,15 +353,72 @@ const QLocaleData *QLocaleData::findLocaleData(QLocale::Language language, QLoca
if (data->m_country_id == localeId.country_id)
return data;
++data;
- } while (data->m_language_id == localeId.language_id);
+ } while (data->m_language_id && data->m_language_id == localeId.language_id);
} else if (localeId.country_id == QLocale::AnyCountry) {
do {
if (data->m_script_id == localeId.script_id)
return data;
++data;
- } while (data->m_language_id == localeId.language_id);
+ } while (data->m_language_id && data->m_language_id == localeId.language_id);
+ } else {
+ do {
+ if (data->m_script_id == localeId.script_id && data->m_country_id == localeId.country_id)
+ return data;
+ ++data;
+ } while (data->m_language_id && data->m_language_id == localeId.language_id);
+ }
+
+ return 0;
+}
+
+const QLocaleData *QLocaleData::findLocaleData(QLocale::Language language, QLocale::Script script, QLocale::Country country)
+{
+ QLocaleId localeId = QLocaleId::fromIds(language, script, country);
+ localeId = localeId.withLikelySubtagsAdded();
+
+ const uint idx = locale_index[localeId.language_id];
+
+ // Try a straight match
+ if (const QLocaleData *const data = findLocaleDataById(localeId))
+ return data;
+ QList<QLocaleId> tried;
+ tried.push_back(localeId);
+
+ // No match; try again with likely country
+ localeId = QLocaleId::fromIds(language, script, QLocale::AnyCountry);
+ localeId = localeId.withLikelySubtagsAdded();
+ if (!tried.contains(localeId)) {
+ if (const QLocaleData *const data = findLocaleDataById(localeId))
+ return data;
+ tried.push_back(localeId);
}
+ // No match; try again with any country
+ localeId = QLocaleId::fromIds(language, script, QLocale::AnyCountry);
+ if (!tried.contains(localeId)) {
+ if (const QLocaleData *const data = findLocaleDataById(localeId))
+ return data;
+ tried.push_back(localeId);
+ }
+
+ // No match; try again with likely script
+ localeId = QLocaleId::fromIds(language, QLocale::AnyScript, country);
+ localeId = localeId.withLikelySubtagsAdded();
+ if (!tried.contains(localeId)) {
+ if (const QLocaleData *const data = findLocaleDataById(localeId))
+ return data;
+ tried.push_back(localeId);
+ }
+
+ // No match; try again with any script
+ localeId = QLocaleId::fromIds(language, QLocale::AnyScript, country);
+ if (!tried.contains(localeId)) {
+ if (const QLocaleData *const data = findLocaleDataById(localeId))
+ return data;
+ tried.push_back(localeId);
+ }
+
+ // No match; return data at original index
return locale_data + idx;
}
@@ -1305,8 +1346,8 @@ float QLocale::toFloat(const QString &s, bool *ok) const
If \a ok is not 0, reports failure by setting
*ok to false and success by setting *ok to true.
- Unlike QString::toDouble(), this function does not fall back to
- the "C" locale if the string cannot be interpreted in this
+ Unlike QString::toDouble(), this function does not use
+ the 'C' locale if the string cannot be interpreted in this
locale.
\snippet code/src_corelib_tools_qlocale.cpp 3
diff --git a/src/corelib/tools/qvector.h b/src/corelib/tools/qvector.h
index 4dbf95c315..5225b68d40 100644
--- a/src/corelib/tools/qvector.h
+++ b/src/corelib/tools/qvector.h
@@ -982,11 +982,13 @@ QT_BEGIN_INCLUDE_NAMESPACE
#include <QtCore/qpoint.h>
QT_END_INCLUDE_NAMESPACE
+#ifndef Q_TEMPLATE_EXTERN
#if defined(QT_BUILD_CORE_LIB)
#define Q_TEMPLATE_EXTERN
#else
#define Q_TEMPLATE_EXTERN extern
#endif
+#endif
Q_TEMPLATE_EXTERN template class Q_CORE_EXPORT QVector<QPointF>;
Q_TEMPLATE_EXTERN template class Q_CORE_EXPORT QVector<QPoint>;
#endif