summaryrefslogtreecommitdiffstats
path: root/src/corelib/tools/qcollator_posix.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/tools/qcollator_posix.cpp')
-rw-r--r--src/corelib/tools/qcollator_posix.cpp41
1 files changed, 23 insertions, 18 deletions
diff --git a/src/corelib/tools/qcollator_posix.cpp b/src/corelib/tools/qcollator_posix.cpp
index 42413a4a82..81f97a02e1 100644
--- a/src/corelib/tools/qcollator_posix.cpp
+++ b/src/corelib/tools/qcollator_posix.cpp
@@ -48,10 +48,12 @@ 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 (!isC()) {
+ if (locale != QLocale())
+ qWarning("Only C and 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)
@@ -73,14 +75,16 @@ static void stringToWCharArray(QVarLengthArray<wchar_t> &ret, const QString &str
int QCollator::compare(const QChar *s1, int len1, const QChar *s2, int len2) const
{
- QVarLengthArray<wchar_t> array1, array2;
- stringToWCharArray(array1, QString(s1, len1));
- stringToWCharArray(array2, QString(s2, len2));
- return std::wcscoll(array1.constData(), array2.constData());
+ return compare(QString::fromRawData(s1, len1), QString::fromRawData(s2, len2));
}
int QCollator::compare(const QString &s1, const QString &s2) const
{
+ if (d->isC())
+ return s1.compare(s2, caseSensitivity());
+ if (d->dirty)
+ d->init();
+
QVarLengthArray<wchar_t> array1, array2;
stringToWCharArray(array1, s1);
stringToWCharArray(array2, s2);
@@ -89,10 +93,7 @@ int QCollator::compare(const QString &s1, const QString &s2) const
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());
+ return compare(s1.toString(), s2.toString());
}
QCollatorSortKey QCollator::sortKey(const QString &string) const
@@ -102,14 +103,18 @@ QCollatorSortKey QCollator::sortKey(const QString &string) const
QVarLengthArray<wchar_t> original;
stringToWCharArray(original, string);
- QVector<wchar_t> result(string.size());
- size_t size = std::wcsxfrm(result.data(), original.constData(), string.size());
- if (size > uint(result.size())) {
+ QVector<wchar_t> result(original.size());
+ if (d->isC()) {
+ std::copy(original.cbegin(), original.cend(), result.begin());
+ } else {
+ size_t size = std::wcsxfrm(result.data(), original.constData(), string.size());
+ if (size > uint(result.size())) {
+ result.resize(size+1);
+ size = std::wcsxfrm(result.data(), original.constData(), string.size());
+ }
result.resize(size+1);
- size = std::wcsxfrm(result.data(), original.constData(), string.size());
+ result[size] = 0;
}
- result.resize(size+1);
- result[size] = 0;
return QCollatorSortKey(new QCollatorSortKeyPrivate(std::move(result)));
}