19 if (locale != QLocale::system().collation()) {
20 qCWarning(lcQCollator,
21 "Only the C and system collation locales are supported with the POSIX"
22 " collation implementation");
24 if (options.testFlag(Opt::CaseInsensitive)) {
25 qCWarning(lcQCollator,
26 "Case insensitive sorting unsupported in the POSIX collation implementation");
29 if (options.testFlag(Opt::NumericSort)) {
30 qCWarning(lcQCollator,
31 "Numeric mode unsupported in the POSIX collation implementation");
33 if (options.testFlag(Opt::IgnorePunctuation)) {
34 qCWarning(lcQCollator,
35 "Ignoring punctuation unsupported in the POSIX collation implementation");
37 if (options.testFlag(Opt::DiacriticInsensitive)) {
38 qCWarning(lcQCollator,
39 "Ignoring diacritic marks unsupported in the POSIX collation implementation.");
41 if (options.testFlag(Opt::WidthInsensitive)) {
42 qCWarning(lcQCollator,
43 "Width insensitive option unsupported in the POSIX collation implementation");
55 ret.resize(string.length());
56 qsizetype len = string.toWCharArray(ret.data());
61int QCollator::compare(QStringView s1, QStringView s2)
const
64 return s2.size() ? -1 : 0;
69 d =
new QCollatorPrivate(QLocale().collation());
72 return s1.compare(s2, caseSensitivity());
74 d->ensureInitialized();
76 QVarLengthArray<
wchar_t> array1, array2;
77 stringToWCharArray(array1, s1);
78 stringToWCharArray(array2, s2);
79 return std::wcscoll(array1.constData(), array2.constData());
82QCollatorSortKey QCollator::sortKey(
const QString &string)
const
85 d =
new QCollatorPrivate(QLocale().collation());
87 d->ensureInitialized();
89 QVarLengthArray<
wchar_t> original;
90 stringToWCharArray(original, string);
91 QList<
wchar_t> result(original.size());
93 std::copy(original.cbegin(), original.cend(), result.begin());
95 auto availableSizeIncludingNullTerminator = result.size();
96 size_t neededSizeExcludingNullTerminator = std::wcsxfrm(
97 result.data(), original.constData(), availableSizeIncludingNullTerminator);
98 if (neededSizeExcludingNullTerminator > size_t(availableSizeIncludingNullTerminator - 1)) {
99 result.resize(neededSizeExcludingNullTerminator + 1);
100 availableSizeIncludingNullTerminator = result.size();
101 neededSizeExcludingNullTerminator = std::wcsxfrm(result.data(), original.constData(),
102 availableSizeIncludingNullTerminator);
103 Q_ASSERT(neededSizeExcludingNullTerminator
104 == size_t(availableSizeIncludingNullTerminator - 1));
106 result.resize(neededSizeExcludingNullTerminator + 1);
107 result[neededSizeExcludingNullTerminator] = 0;
109 return QCollatorPrivate::sortKeyFromData(std::move(result));
112int QCollatorSortKey::compare(
const QCollatorSortKey &otherKey)
const noexcept
114 return std::wcscmp(d->m_key.constData(), otherKey.d->m_key.constData());
static void stringToWCharArray(QVarLengthArray< wchar_t > &ret, QStringView string)