22#include <QtCore/qcalendar.h>
23#include <QtCore/qlist.h>
24#include <QtCore/qnumeric.h>
25#include <QtCore/private/qnumeric_p.h>
26#include <QtCore/qstring.h>
27#include <QtCore/qvariant.h>
28#include <QtCore/qvarlengtharray.h>
30#include <private/qstdweb_p.h>
39template <
typename T>
struct QSimpleParsedNumber
44 bool ok()
const {
return used > 0; }
58 auto [offset, shift] = maskLocation(c);
59 mask[offset] |= Word(1) << shift;
63 constexpr bool matches(uchar c)
const noexcept
65 auto [offset, shift] = maskLocation(c);
69 if constexpr (Extent == 2) {
71 m = (c - Lowest < WordBits) ? mask[0] : mask[1];
75 return (m >> shift) & 1;
80 struct {
int offset;
int shift; } r = { -1, -1 };
81 unsigned idx = c - Lowest;
99template <
const char *Set,
int ForcedLowest = -1>
102 constexpr int BitsPerWord = std::numeric_limits<qregisteruint>::digits;
103 constexpr auto view = std::string_view(Set);
104 constexpr uchar MinElement = *std::min_element(view.begin(), view.end());
105 constexpr uchar MaxElement = *std::max_element(view.begin(), view.end());
106 constexpr int Range = MaxElement - MinElement;
107 constexpr int Extent = (Range + BitsPerWord - 1) / BitsPerWord;
108 constexpr int TotalBits = BitsPerWord * Extent;
110 if constexpr (ForcedLowest >= 0) {
112 static_assert(ForcedLowest <=
int(MinElement),
"The force is not with you");
113 static_assert(ForcedLowest + TotalBits >= MaxElement,
"The force is not with you");
114 return QCharacterSetMatch<Extent, ForcedLowest>(view);
115 }
else if constexpr (MaxElement < TotalBits) {
118 return QCharacterSetMatch<Extent, 0>(view);
120 return QCharacterSetMatch<Extent, MinElement>(view);
128 Q_DISABLE_COPY_MOVE(QSystemLocale)
129 QSystemLocale *next =
nullptr;
133 virtual ~QSystemLocale();
194 virtual QVariant
query(
QueryType type, QVariant &&in = QVariant())
const;
200 inline const QSharedDataPointer<QLocalePrivate> localeData(
const QLocale &locale)
const
205Q_DECLARE_TYPEINFO(QSystemLocale::QueryType, Q_PRIMITIVE_TYPE);
206Q_DECLARE_TYPEINFO(QSystemLocale::CurrencyToStringArgument, Q_RELOCATABLE_TYPE);
217 return language_id <= QLocale::LastLanguage && script_id <= QLocale::LastScript
218 && territory_id <= QLocale::LastTerritory;
252 [[
nodiscard]] Q_AUTOTEST_EXPORT
static const QLocaleData *
c()
noexcept;
307 PMDecimalDigits = 0x01,
308 PMSignificantDigits = 0x02,
309 PMChopTrailingZeros = 0x03
312 [[
nodiscard]] QString decimalForm(QString &&digits,
int decpt,
int precision,
313 PrecisionMode pm,
bool mustMarkDecimal,
314 bool groupDigits)
const;
315 [[
nodiscard]] QString exponentForm(QString &&digits,
int decpt,
int precision,
316 PrecisionMode pm,
bool mustMarkDecimal,
317 int minExponentDigits)
const;
318 [[
nodiscard]] QString signPrefix(
bool negative,
unsigned flags)
const;
319 [[
nodiscard]] QString applyIntegerFormatting(QString &&numStr,
bool negative,
int precision,
320 int base,
int width,
unsigned flags)
const;
327 unsigned flags =
NoFlags)
const;
331 unsigned flags =
NoFlags)
const;
335 unsigned flags =
NoFlags)
const;
342 bool b = convertDoubleTo<
float>(d, &result);
349 QLocale::NumberOptions options)
const;
351 stringToLongLong(QStringView str,
int base, QLocale::NumberOptions options)
const;
366#ifndef QT_NO_SYSTEMLOCALE
382 switch (zero.size()) {
384 Q_ASSERT(!zero.at(0).isSurrogate());
385 zeroUcs = zero.at(0).unicode();
386 Q_ASSERT(!QChar::requiresSurrogates(zeroUcs + 9));
390 Q_ASSERT(zero.at(0).isHighSurrogate());
391 Q_ASSERT(zero.at(1).isLowSurrogate());
392 zeroUcs = QChar::surrogateToUcs4(zero.at(0), zero.at(1));
393 Q_ASSERT(QChar::requiresSurrogates(zeroUcs));
397 Q_ASSERT(zero.size() == 0);
409 if (exponentCyrillic && exponent != u"E" && exponent != u"\u0415")
411 return (zeroLen == 1 || zeroLen == 2) && zeroUcs > 0
412 && (mode == IntegerMode || !decimal.isEmpty())
414 && !minus.isEmpty() && !plus.isEmpty()
415 && (mode != DoubleScientificMode || !exponent.isEmpty());
424 if (qint32 ans = digit -
zeroUcs; 0 <= ans && ans <= 9)
426 }
else if (digit > U'\u3020') {
427 if (qint32 ans = digit - U'\u3020'; 0 <= ans && ans <= 9)
435 qint32 ans = digit - U'0';
436 return qint8(0 <= ans && ans <= 9 ? ans : -1);
446 return Q_UNLIKELY(!isC && group == decimal);
457 {
return QLocaleId { m_language_id, m_script_id, m_territory_id }; }
478 ? QString::fromRawData(stringStart(table), stringSize())
483 return { stringStart(table), stringSize() };
487 return listEntry(table, index).getData(table);
491 return listEntry(table, index).viewData(table);
495 if (size && !QChar::isSurrogate(table[offset]))
496 return table[offset];
497 if (size > 1 && QChar::isHighSurrogate(table[offset]))
498 return QChar::surrogateToUcs4(table[offset], table[offset + 1]);
502 [[
nodiscard]]
const QChar *stringStart(
const char16_t *table)
const
504 return reinterpret_cast<
const QChar *>(table + offset);
506 [[
nodiscard]] qsizetype stringSize()
const
511 qsizetype result =
static_cast<qsizetype>(size);
512 Q_ASSERT(result >= 0);
517 const char16_t separator =
';';
519 while (index > 0 && i < size) {
520 if (table[offset + i] == separator)
525 while (end < size && table[offset + end] != separator)
527 return { offset + i, end - i };
531#define ForEachQLocaleRange(X)
532 X(startListPattern) X(midListPattern) X(endListPattern) X(pairListPattern) X(listDelimit)
533 X(decimalSeparator) X(groupDelim) X(percent) X(zero) X(minus) X(plus) X(exponential)
534 X(quoteStart) X(quoteEnd) X(quoteStartAlternate) X(quoteEndAlternate)
535 X(longDateFormat) X(shortDateFormat) X(longTimeFormat) X(shortTimeFormat)
536 X(longDayNamesStandalone) X(longDayNames)
537 X(shortDayNamesStandalone) X(shortDayNames)
538 X(narrowDayNamesStandalone) X(narrowDayNames)
539 X(anteMeridiem) X(postMeridiem)
540 X(byteCount) X(byteAmountSI) X(byteAmountIEC)
541 X(currencySymbol) X(currencyDisplayName)
542 X(currencyFormat) X(currencyFormatNegative)
543 X(endonymLanguage) X(endonymTerritory)
545#define rangeGetter(name)
546 [[nodiscard]] DataRange name() const { return { m_ ## name ## _idx, m_ ## name ## _size }; }
551 quint16 m_language_id, m_script_id, m_territory_id;
554#define rangeIndex(name) quint16 m_ ## name ## _idx;
557#define Size(name) quint8 m_ ## name ## _size;
561#undef ForEachQLocaleRange
564 char m_currency_iso_code[3];
594 return languageToCode(QLocale::Language(m_data->m_language_id), codeTypes);
597 {
return scriptToCode(QLocale::Script(m_data->m_script_id)); }
599 {
return territoryToCode(QLocale::Territory(m_data->m_territory_id)); }
627#ifndef QT_NO_SYSTEMLOCALE
628qsizetype QSystemLocale::fallbackLocaleIndex()
const {
return fallbackLocale().d->m_index; }
632inline QLocalePrivate *QSharedDataPointer<QLocalePrivate>::clone()
636 return new QLocalePrivate(d->m_data, d->m_index, d->m_numberOptions);
643 QStringView *script =
nullptr,
644 QStringView *cntry =
nullptr)
noexcept;
650 return matcher.matches(c);
656QT_DECL_METATYPE_EXTERN_TAGGED(QList<Qt::DayOfWeek>, QList_Qt__DayOfWeek, Q_CORE_EXPORT)
657#ifndef QT_NO_SYSTEMLOCALE
658QT_DECL_METATYPE_EXTERN_TAGGED(QSystemLocale::CurrencyToStringArgument,
659 QSystemLocale__CurrencyToStringArgument, Q_CORE_EXPORT)
QDataStream & operator>>(QDataStream &in, QByteArray &ba)
Reads a byte array into ba from the stream in and returns a reference to the stream.
quint16 qChecksum(QByteArrayView data, Qt::ChecksumType standard)
static QLatin1StringView scriptToCode(QLocale::Script script)
QString toUpper(const QString &str, bool *ok) const
static const QLocalePrivate * get(const QLocale &l)
QString toLower(const QString &str, bool *ok) const
quint16 languageId() const
static QLocale::Language codeToLanguage(QStringView code, QLocale::LanguageCodeTypes codeTypes=QLocale::AnyLanguageCode) noexcept
const QLocaleData *const m_data
QLatin1StringView scriptCode() const
QLocale::MeasurementSystem measurementSystem() const
quint16 territoryId() const
static QLatin1StringView territoryToCode(QLocale::Territory territory)
static QLocale::Territory codeToTerritory(QStringView code) noexcept
static std::array< char, 4 > languageToCode(QLocale::Language language, QLocale::LanguageCodeTypes codeTypes=QLocale::AnyLanguageCode)
static QLocale::Script codeToScript(QStringView code) noexcept
QLocale::NumberOptions m_numberOptions
QLatin1StringView territoryCode() const
constexpr QLocalePrivate(const QLocaleData *data, qsizetype index, QLocale::NumberOptions numberOptions=QLocale::DefaultNumberOptions, int refs=0)
std::array< char, 4 > languageCode(QLocale::LanguageCodeTypes codeTypes=QLocale::AnyLanguageCode) const
static QBasicAtomicInt s_generation
QByteArray bcp47Name(char separator='-') const
qsizetype fallbackLocaleIndex() const
@ StringToAlternateQuotation
@ StandaloneMonthNameLong
@ StandaloneDayNameNarrow
@ StandaloneMonthNameNarrow
@ StringToStandardQuotation
@ StandaloneMonthNameShort
virtual QLocale fallbackLocale() const
virtual QVariant query(QueryType type, QVariant &&in=QVariant()) const
constexpr char ascii_space_chars[]
constexpr auto makeCharacterSetMatch() noexcept
static constexpr bool isLowerCaseAscii(char c)
static const quint16 crc_tbl[16]
QByteArray qCompress(const uchar *data, qsizetype nbytes, int compressionLevel)
static Q_DECL_COLD_FUNCTION const char * zlibOpAsString(ZLibOp op)
static QByteArray toCase_template(T &input, uchar(*lookup)(uchar))
static void q_fromPercentEncoding(QByteArray *ba, char percent)
int qstrnicmp(const char *str1, qsizetype len1, const char *str2, qsizetype len2)
static qsizetype lastIndexOfHelper(const char *haystack, qsizetype l, const char *needle, qsizetype ol, qsizetype from)
static constexpr bool isUpperCaseAscii(char c)
static QByteArray xxflate(ZLibOp op, QArrayDataPointer< char > out, QByteArrayView input, qxp::function_ref< int(z_stream *) const > init, qxp::function_ref< int(z_stream *, size_t) const > processChunk, qxp::function_ref< void(z_stream *) const > deinit)
static constexpr uchar asciiLower(uchar c)
static qsizetype countCharHelper(QByteArrayView haystack, char needle) noexcept
static constexpr uchar asciiUpper(uchar c)
Q_CORE_EXPORT char * qstrncpy(char *dst, const char *src, size_t len)
Q_CORE_EXPORT int qstrnicmp(const char *, const char *, size_t len)
Q_CORE_EXPORT int qstricmp(const char *, const char *)
Q_CORE_EXPORT char * qstrdup(const char *)
Q_CORE_EXPORT char * qstrcpy(char *dst, const char *src)
Q_DECL_PURE_FUNCTION Q_CORE_EXPORT const void * qmemrchr(const void *s, int needle, size_t n) noexcept
Q_CORE_EXPORT int qstrcmp(const char *str1, const char *str2)
bool qt_splitLocaleName(QStringView name, QStringView *lang=nullptr, QStringView *script=nullptr, QStringView *cntry=nullptr) noexcept
Q_DECLARE_TYPEINFO(QLocaleData::GroupSizes, Q_PRIMITIVE_TYPE)
Q_DECLARE_TYPEINFO(QLocaleId, Q_PRIMITIVE_TYPE)
qsizetype qt_repeatCount(QStringView s) noexcept
constexpr bool ascii_isspace(uchar c) noexcept
#define ForEachQLocaleRange(X)
QString qt_readEscapedFormatString(QStringView format, qsizetype *idx)
constexpr size_t qHash(const QSize &s, size_t seed=0) noexcept
qregisteruint mask[Extent]
static constexpr int WordBits
static constexpr int MaxRange
constexpr auto maskLocation(uchar c) const noexcept
constexpr QCharacterSetMatch(std::string_view set) noexcept
constexpr bool matches(uchar c) const noexcept
QStringView viewListEntry(const char16_t *table, qsizetype index) const
char32_t ucsFirst(const char16_t *table) const
QString getData(const char16_t *table) const
QString getListEntry(const char16_t *table, qsizetype index) const
QStringView viewData(const char16_t *table) const
void setZero(QStringView zero)
bool fractionalIsGroup() const
const GroupSizes & groupSizes() const
bool isValid(NumberMode mode) const
const GroupSizes grouping
qint8 digitValue(char32_t digit) const
QString positiveSign() const
static float convertDoubleToFloat(double d, bool *ok)
QString groupSeparator() const
QSimpleParsedNumber< qint64 > stringToLongLong(QStringView str, int base, QLocale::NumberOptions options) const
Q_AUTOTEST_EXPORT char32_t zeroUcs() const
QString zeroDigit() const
bool numberToCLocale(QStringView s, QLocale::NumberOptions number_options, NumberMode mode, CharBuff *result) const
QString decimalPoint() const
QString doubleToString(double d, int precision=-1, DoubleForm form=DFSignificantDigits, int width=-1, unsigned flags=NoFlags) const
static Q_AUTOTEST_EXPORT bool allLocaleDataRows(bool(*check)(qsizetype, const QLocaleData &))
QString listSeparator() const
static QSimpleParsedNumber< quint64 > bytearrayToUnsLongLong(QByteArrayView num, int base)
QString percentSign() const
double stringToDouble(QStringView str, bool *ok, QLocale::NumberOptions options) const
QString longLongToString(qint64 l, int precision=-1, int base=10, int width=-1, unsigned flags=NoFlags) const
quint8 m_first_day_of_week
quint8 m_currency_rounding
QString exponentSeparator() const
QString negativeSign() const
QSimpleParsedNumber< quint64 > stringToUnsLongLong(QStringView str, int base, QLocale::NumberOptions options) const
QString unsLongLongToString(quint64 l, int precision=-1, int base=10, int width=-1, unsigned flags=NoFlags) const
QLocaleId withLikelySubtagsAdded() const noexcept
Fill in blank fields of a locale ID.
QLocaleId withLikelySubtagsRemoved() const noexcept
bool operator==(QLocaleId other) const noexcept
bool matchesAll() const noexcept
bool isValid() const noexcept
bool operator!=(QLocaleId other) const noexcept
bool acceptScriptTerritory(QLocaleId other) const noexcept
bool acceptLanguage(quint16 lang) const noexcept
CurrencyToStringArgument(const QVariant &v, const QString &s)
CurrencyToStringArgument()