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 (options.testFlag(Opt::CaseInsensitive))
24 qWarning(
"Case insensitive sorting unsupported in the posix collation implementation");
26 if (options.testFlag(Opt::NumericSort))
27 qWarning(
"Numeric mode unsupported in the posix collation implementation");
28 if (options.testFlag(Opt::IgnorePunctuation))
29 qWarning(
"Ignoring punctuation unsupported in the posix collation implementation");
30 if (options.testFlag(Opt::DiacriticInsensitive))
31 qWarning(
"Ignoring diacritic marks unsupported in the POSIX collation implementation.");
42 ret.resize(string.length());
43 qsizetype len = string.toWCharArray(ret.data());
48int QCollator::compare(QStringView s1, QStringView s2)
const
51 return s2.size() ? -1 : 0;
56 d =
new QCollatorPrivate(QLocale().collation());
59 return s1.compare(s2, caseSensitivity());
61 d->ensureInitialized();
63 QVarLengthArray<
wchar_t> array1, array2;
64 stringToWCharArray(array1, s1);
65 stringToWCharArray(array2, s2);
66 return std::wcscoll(array1.constData(), array2.constData());
69QCollatorSortKey QCollator::sortKey(
const QString &string)
const
72 d =
new QCollatorPrivate(QLocale().collation());
74 d->ensureInitialized();
76 QVarLengthArray<
wchar_t> original;
77 stringToWCharArray(original, string);
78 QList<
wchar_t> result(original.size());
80 std::copy(original.cbegin(), original.cend(), result.begin());
82 auto availableSizeIncludingNullTerminator = result.size();
83 size_t neededSizeExcludingNullTerminator = std::wcsxfrm(
84 result.data(), original.constData(), availableSizeIncludingNullTerminator);
85 if (neededSizeExcludingNullTerminator > size_t(availableSizeIncludingNullTerminator - 1)) {
86 result.resize(neededSizeExcludingNullTerminator + 1);
87 availableSizeIncludingNullTerminator = result.size();
88 neededSizeExcludingNullTerminator = std::wcsxfrm(result.data(), original.constData(),
89 availableSizeIncludingNullTerminator);
90 Q_ASSERT(neededSizeExcludingNullTerminator
91 == size_t(availableSizeIncludingNullTerminator - 1));
93 result.resize(neededSizeExcludingNullTerminator + 1);
94 result[neededSizeExcludingNullTerminator] = 0;
96 return QCollatorPrivate::sortKeyFromData(std::move(result));
99int QCollatorSortKey::compare(
const QCollatorSortKey &otherKey)
const noexcept
101 return std::wcscmp(d->m_key.constData(), otherKey.d->m_key.constData());
static void stringToWCharArray(QVarLengthArray< wchar_t > &ret, QStringView string)