From c17563eca879845deef542173f5fb479c9aa2d0e Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Wed, 27 Aug 2014 12:57:14 +0200 Subject: 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 --- src/corelib/tools/qcollator_posix.cpp | 56 +++++++++++------------------------ 1 file changed, 18 insertions(+), 38 deletions(-) (limited to 'src/corelib/tools/qcollator_posix.cpp') 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 &ret, const QString &string) { ret.resize(string.length()); @@ -112,16 +86,23 @@ int QCollator::compare(const QString &s1, const QString &s2) const QVarLengthArray 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 original; stringToWCharArray(original, string); QVector 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 -- cgit v1.2.3