diff options
author | Lars Knoll <lars.knoll@digia.com> | 2014-08-27 12:57:14 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@digia.com> | 2014-09-10 21:11:11 +0200 |
commit | c17563eca879845deef542173f5fb479c9aa2d0e (patch) | |
tree | b967050c3502458043998288292d6da952252649 /src/corelib/tools/qcollator_posix.cpp | |
parent | 6316a681f3f3dde46d5ab5c915f31a2098b463bb (diff) |
Fix several issues in QCollator
Refactor the code and move more things into the cross platform
code path.
Make sure the flags survive changing the locale of QCollator.
Use the correct locale on Windows, WinRT and OS X. We now
pass all QCollator autotests on these platforms.
Task-number: QTBUG-40778
Change-Id: Ic2d3334b5018c323a35a3ea8fc1d7ab5f99b4e62
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/tools/qcollator_posix.cpp')
-rw-r--r-- | src/corelib/tools/qcollator_posix.cpp | 56 |
1 files changed, 18 insertions, 38 deletions
diff --git a/src/corelib/tools/qcollator_posix.cpp b/src/corelib/tools/qcollator_posix.cpp index b47b546d01..1cb897a975 100644 --- a/src/corelib/tools/qcollator_posix.cpp +++ b/src/corelib/tools/qcollator_posix.cpp @@ -50,47 +50,21 @@ QT_BEGIN_NAMESPACE void QCollatorPrivate::init() { + if (locale != QLocale()) + qWarning("Only default locale supported with the posix collation implementation"); + if (caseSensitivity != Qt::CaseSensitive) + qWarning("Case insensitive sorting unsupported in the posix collation implementation"); + if (numericMode) + qWarning("Numeric mode unsupported in the posix collation implementation"); + if (ignorePunctuation) + qWarning("Ignoring punctuation unsupported in the posix collation implementation"); + dirty = false; } void QCollatorPrivate::cleanup() { } -void QCollator::setCaseSensitivity(Qt::CaseSensitivity cs) -{ - Q_UNUSED(cs); - qWarning("unsupported in the posix collation implementation"); -} - -Qt::CaseSensitivity QCollator::caseSensitivity() const -{ - qWarning("unsupported in the posix collation implementation"); - return Qt::CaseSensitive; -} - -void QCollator::setNumericMode(bool on) -{ - Q_UNUSED(on); - qWarning("unsupported in the posix collation implementation"); -} - -bool QCollator::numericMode() const -{ - return true; -} - -void QCollator::setIgnorePunctuation(bool on) -{ - Q_UNUSED(on); - qWarning("unsupported in the posix collation implementation"); -} - -bool QCollator::ignorePunctuation() const -{ - qWarning("unsupported in the posix collation implementation"); - return false; -} - static void stringToWCharArray(QVarLengthArray<wchar_t> &ret, const QString &string) { ret.resize(string.length()); @@ -112,16 +86,23 @@ int QCollator::compare(const QString &s1, const QString &s2) const QVarLengthArray<wchar_t> array1, array2; stringToWCharArray(array1, s1); stringToWCharArray(array2, s2); - return std::wcscoll(array1.constData(), array2.constData()); + int result = std::wcscoll(array1.constData(), array2.constData()); + return result > 0 ? 1 : (result == 0 ? 0 : -1); } int QCollator::compare(const QStringRef &s1, const QStringRef &s2) const { + if (d->dirty) + d->init(); + return compare(s1.constData(), s1.size(), s2.constData(), s2.size()); } QCollatorSortKey QCollator::sortKey(const QString &string) const { + if (d->dirty) + d->init(); + QVarLengthArray<wchar_t> original; stringToWCharArray(original, string); QVector<wchar_t> result(string.size()); @@ -137,8 +118,7 @@ QCollatorSortKey QCollator::sortKey(const QString &string) const int QCollatorSortKey::compare(const QCollatorSortKey &otherKey) const { - return std::wcscmp(d->m_key.constData(), - otherKey.d->m_key.constData()); + return std::wcscmp(d->m_key.constData(), otherKey.d->m_key.constData()); } QT_END_NAMESPACE |