19 if (locale != QLocale::system().collation()) {
20 qWarning(
"Only the C and system collation locales are supported "
21 "with the POSIX collation implementation");
23 if (caseSensitivity != Qt::CaseSensitive)
24 qWarning(
"Case insensitive sorting unsupported in the posix collation implementation");
27 qWarning(
"Numeric mode unsupported in the posix collation implementation");
29 qWarning(
"Ignoring punctuation unsupported in the posix collation implementation");
39 ret.resize(string.length());
40 qsizetype len = string.toWCharArray(ret.data());
45int QCollator::compare(QStringView s1, QStringView s2)
const
48 return s2.size() ? -1 : 0;
53 d =
new QCollatorPrivate(QLocale().collation());
56 return s1.compare(s2, caseSensitivity());
58 d->ensureInitialized();
60 QVarLengthArray<
wchar_t> array1, array2;
61 stringToWCharArray(array1, s1);
62 stringToWCharArray(array2, s2);
63 return std::wcscoll(array1.constData(), array2.constData());
66QCollatorSortKey QCollator::sortKey(
const QString &string)
const
69 d =
new QCollatorPrivate(QLocale().collation());
71 d->ensureInitialized();
73 QVarLengthArray<
wchar_t> original;
74 stringToWCharArray(original, string);
75 QList<
wchar_t> result(original.size());
77 std::copy(original.cbegin(), original.cend(), result.begin());
79 auto availableSizeIncludingNullTerminator = result.size();
80 size_t neededSizeExcludingNullTerminator = std::wcsxfrm(
81 result.data(), original.constData(), availableSizeIncludingNullTerminator);
82 if (neededSizeExcludingNullTerminator > size_t(availableSizeIncludingNullTerminator - 1)) {
83 result.resize(neededSizeExcludingNullTerminator + 1);
84 availableSizeIncludingNullTerminator = result.size();
85 neededSizeExcludingNullTerminator = std::wcsxfrm(result.data(), original.constData(),
86 availableSizeIncludingNullTerminator);
87 Q_ASSERT(neededSizeExcludingNullTerminator
88 == size_t(availableSizeIncludingNullTerminator - 1));
90 result.resize(neededSizeExcludingNullTerminator + 1);
91 result[neededSizeExcludingNullTerminator] = 0;
93 return QCollatorSortKey(
new QCollatorSortKeyPrivate(std::move(result)));
96int QCollatorSortKey::compare(
const QCollatorSortKey &otherKey)
const
98 return std::wcscmp(d->m_key.constData(), otherKey.d->m_key.constData());
static void stringToWCharArray(QVarLengthArray< wchar_t > &ret, QStringView string)