10#include <QtCore/private/qcore_mac_p.h>
12#include <CoreFoundation/CoreFoundation.h>
13#include <CoreFoundation/CFLocale.h>
24
25
26
27
28
34 LocaleRefFromLocaleString(
QLocalePrivate::get(locale)->bcp47Name().constData(), &localeRef);
36 qCWarning(lcQCollator,
"Couldn't initialize the locale (%d)",
int(status));
38 UInt32 collationOptions = 0;
40 collationOptions |= kUCCollateComposeInsensitiveMask;
42 if (options.testFlag(Opt::CaseInsensitive))
43 collationOptions |= kUCCollateCaseInsensitiveMask;
44 if (options.testFlag(Opt::NumericSort))
45 collationOptions |= kUCCollateDigitsAsNumberMask | kUCCollateDigitsOverrideMask;
46 if (!options.testFlag(Opt::IgnorePunctuation))
47 collationOptions |= kUCCollatePunctuationSignificantMask;
48 if (options.testFlag(Opt::DiacriticInsensitive))
49 collationOptions |= kUCCollateDiacritInsensitiveMask;
50 if (options.testFlag(Opt::WidthInsensitive))
51 collationOptions |= kUCCollateWidthInsensitiveMask;
53 status = UCCreateCollator(localeRef, 0, collationOptions, &
collator);
55 qCWarning(lcQCollator,
"Couldn't initialize the collator (%d)",
int(status));
67int QCollator::compare(QStringView s1, QStringView s2)
const
70 return s2.size() ? -1 : 0;
75 d =
new QCollatorPrivate(QLocale().collation());
77 d->ensureInitialized();
80 return s1.compare(s2, caseSensitivity());
84 UCCompareText(d->collator,
85 reinterpret_cast<
const UniChar *>(s1.data()), s1.size(),
86 reinterpret_cast<
const UniChar *>(s2.data()), s2.size(),
91 return result < 0 ? -1 : 1;
94QCollatorSortKey QCollator::sortKey(
const QString &string)
const
97 d =
new QCollatorPrivate(QLocale().collation());
99 d->ensureInitialized();
101 QList<UCCollationValue> ret;
104 qCWarning(lcQCollator,
"QCollator doesn't support sort keys for the C locale on Darwin");
105 return QCollatorPrivate::sortKeyFromData(std::move(ret));
108 auto text =
reinterpret_cast<
const UniChar *>(string.constData());
110 ret.resizeForOverwrite(string.size() * 5);
111 ItemCount actualSize;
112 int status = UCGetCollationKey(d->collator, text, string.size(),
113 ret.size(), &actualSize, ret.data());
115 ret.resize(actualSize + 1);
116 if (status == kUCOutputBufferTooSmall) {
117 status = UCGetCollationKey(d->collator, text, string.size(),
118 ret.size(), &actualSize, ret.data());
119 Q_ASSERT(status != kUCOutputBufferTooSmall);
120 Q_ASSERT(ret.size() == qsizetype(actualSize + 1));
123 return QCollatorPrivate::sortKeyFromData(std::move(ret));
126int QCollatorSortKey::compare(
const QCollatorSortKey &key)
const noexcept
129 UCCompareCollationKeys(d->m_key.data(), d->m_key.size(),
130 key.d->m_key.data(), key.d->m_key.size(),
static const QLocalePrivate * get(const QLocale &l)