9#include <QtCore/private/qcore_mac_p.h>
11#include <CoreFoundation/CoreFoundation.h>
12#include <CoreFoundation/CFLocale.h>
23
24
25
26
27
33 LocaleRefFromLocaleString(QLocalePrivate::get(locale)->bcp47Name().constData(), &localeRef);
35 qWarning(
"Couldn't initialize the locale (%d)",
int(status));
38 if (caseSensitivity == Qt::CaseInsensitive)
39 options |= kUCCollateCaseInsensitiveMask;
41 options |= kUCCollateDigitsAsNumberMask | kUCCollateDigitsOverrideMask;
42 if (!ignorePunctuation)
43 options |= kUCCollatePunctuationSignificantMask;
45 status = UCCreateCollator(localeRef, 0, options, &
collator);
47 qWarning(
"Couldn't initialize the collator (%d)",
int(status));
59int QCollator::compare(QStringView s1, QStringView s2)
const
62 return s2.size() ? -1 : 0;
66 d->ensureInitialized();
69 return s1.compare(s2, caseSensitivity());
73 UCCompareText(d->collator,
74 reinterpret_cast<
const UniChar *>(s1.data()), s1.size(),
75 reinterpret_cast<
const UniChar *>(s2.data()), s2.size(),
80 return result < 0 ? -1 : 1;
83QCollatorSortKey QCollator::sortKey(
const QString &string)
const
85 d->ensureInitialized();
89 qWarning(
"QCollator doesn't support sort keys for the C locale on Darwin");
90 return QCollatorSortKey(
nullptr);
93 auto text =
reinterpret_cast<
const UniChar *>(string.constData());
95 QList<UCCollationValue> ret(string.size() * 5);
97 int status = UCGetCollationKey(d->collator, text, string.size(),
98 ret.size(), &actualSize, ret.data());
100 ret.resize(actualSize + 1);
101 if (status == kUCOutputBufferTooSmall) {
102 status = UCGetCollationKey(d->collator, text, string.size(),
103 ret.size(), &actualSize, ret.data());
104 Q_ASSERT(status != kUCOutputBufferTooSmall);
105 Q_ASSERT(ret.size() == qsizetype(actualSize + 1));
108 return QCollatorSortKey(
new QCollatorSortKeyPrivate(std::move(ret)));
111int QCollatorSortKey::compare(
const QCollatorSortKey &key)
const
117 UCCompareCollationKeys(d->m_key.data(), d->m_key.size(),
118 key.d->m_key.data(), key.d->m_key.size(),