Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qlocale_p.h
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// Copyright (C) 2016 Intel Corporation.
3// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
4// Qt-Security score:critical reason:data-parser
5
6#ifndef QLOCALE_P_H
7#define QLOCALE_P_H
8
9//
10// W A R N I N G
11// -------------
12//
13// This file is not part of the Qt API. It exists for the convenience
14// of internal files. This header file may change from version to version
15// without notice, or even be removed.
16//
17// We mean it.
18//
19
20#include "qlocale.h"
21
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>
29#ifdef Q_OS_WASM
30#include <private/qstdweb_p.h>
31#endif
32
33#include <limits>
34#include <cmath>
35#include <string_view>
36
37QT_BEGIN_NAMESPACE
38
39template <typename T> struct QSimpleParsedNumber
40{
41 T result;
42 // When used < 0, -used is how much was used, but it was an error.
43 qsizetype used;
44 bool ok() const { return used > 0; }
45};
46
47template <int Extent, uchar Lowest> struct QCharacterSetMatch
48{
50 static constexpr int WordBits = std::numeric_limits<Word>::digits;
51 static constexpr int MaxRange = WordBits * Extent;
53
54 constexpr QCharacterSetMatch(std::string_view set) noexcept
55 : mask{}
56 {
57 for (char c : set) {
58 auto [offset, shift] = maskLocation(c);
59 mask[offset] |= Word(1) << shift;
60 }
61 }
62
63 constexpr bool matches(uchar c) const noexcept
64 {
65 auto [offset, shift] = maskLocation(c);
66 if (offset < 0)
67 return false;
68 Word m = 0;
69 if constexpr (Extent == 2) {
70 // special case for faster code (with GCC, at least)
71 m = (c - Lowest < WordBits) ? mask[0] : mask[1];
72 } else {
73 m = mask[offset];
74 }
75 return (m >> shift) & 1;
76 }
77
78 constexpr auto maskLocation(uchar c) const noexcept
79 {
80 struct { int offset; int shift; } r = { -1, -1 };
81 unsigned idx = c - Lowest;
82 if (idx < MaxRange) {
83 r.offset = idx / WordBits;
84 r.shift = idx % WordBits;
85 }
86 return r;
87 }
88};
89
90namespace QtPrivate {
91inline constexpr char ascii_space_chars[] =
92 "\t" // 9: HT - horizontal tab
93 "\n" // 10: LF - line feed
94 "\v" // 11: VT - vertical tab
95 "\f" // 12: FF - form feed
96 "\r" // 13: CR - carriage return
97 " "; // 32: space
98
99template <const char *Set, int ForcedLowest = -1>
100inline constexpr auto makeCharacterSetMatch() noexcept
101{
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;
109
110 if constexpr (ForcedLowest >= 0) {
111 // use the force
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) {
116 // if we can use a Lowest of zero, we can remove a subtraction
117 // from the matches() code at runtime
118 return QCharacterSetMatch<Extent, 0>(view);
119 } else {
120 return QCharacterSetMatch<Extent, MinElement>(view);
121 }
122}
123} // QtPrivate
124
125// Subclassed by Android platform plugin:
126class Q_CORE_EXPORT QSystemLocale
127{
128 Q_DISABLE_COPY_MOVE(QSystemLocale)
129 QSystemLocale *next = nullptr; // Maintains a stack.
130
131public:
132 QSystemLocale();
133 virtual ~QSystemLocale();
134
136 {
138 CurrencyToStringArgument(const QVariant &v, const QString &s)
139 : value(v), symbol(s) { }
140 QVariant value;
141 QString symbol;
142 };
143
145 LanguageId, // uint
146 TerritoryId, // uint
147 DecimalPoint, // QString
148 Grouping, // QLocaleData::GroupSizes
149 GroupSeparator, // QString (empty QString means: don't group digits)
150 ZeroDigit, // QString
151 NegativeSign, // QString
152 DateFormatLong, // QString
153 DateFormatShort, // QString
154 TimeFormatLong, // QString
155 TimeFormatShort, // QString
156 DayNameLong, // QString, in: int
157 DayNameShort, // QString, in: int
158 DayNameNarrow, // QString, in: int
159 MonthNameLong, // QString, in: int
160 MonthNameShort, // QString, in: int
161 MonthNameNarrow, // QString, in: int
162 DateToStringLong, // QString, in: QDate
163 DateToStringShort, // QString in: QDate
164 TimeToStringLong, // QString in: QTime
165 TimeToStringShort, // QString in: QTime
168 DateTimeToStringLong, // QString in: QDateTime
169 DateTimeToStringShort, // QString in: QDateTime
171 PositiveSign, // QString
172 AMText, // QString
173 PMText, // QString
174 FirstDayOfWeek, // Qt::DayOfWeek
175 Weekdays, // QList<Qt::DayOfWeek>
176 CurrencySymbol, // QString in: CurrencyToStringArgument
177 CurrencyToString, // QString in: qlonglong, qulonglong or double
178 Collation, // QString
179 UILanguages, // QStringList
180 StringToStandardQuotation, // QString in: QStringView to quote
181 StringToAlternateQuotation, // QString in: QStringView to quote
182 ScriptId, // uint
184 LocaleChanged, // system locale changed
187 StandaloneMonthNameLong, // QString, in: int
188 StandaloneMonthNameShort, // QString, in: int
189 StandaloneMonthNameNarrow, // QString, in: int
190 StandaloneDayNameLong, // QString, in: int
191 StandaloneDayNameShort, // QString, in: int
192 StandaloneDayNameNarrow // QString, in: int
193 };
194 virtual QVariant query(QueryType type, QVariant &&in = QVariant()) const;
195
196 virtual QLocale fallbackLocale() const;
197 inline qsizetype fallbackLocaleIndex() const;
198
199protected:
200 inline const QSharedDataPointer<QLocalePrivate> localeData(const QLocale &locale) const
201 {
202 return locale.d;
203 }
204};
205Q_DECLARE_TYPEINFO(QSystemLocale::QueryType, Q_PRIMITIVE_TYPE);
206Q_DECLARE_TYPEINFO(QSystemLocale::CurrencyToStringArgument, Q_RELOCATABLE_TYPE);
207
209{
210 [[nodiscard]] Q_AUTOTEST_EXPORT static QLocaleId fromName(QStringView name) noexcept;
211 [[nodiscard]] inline bool operator==(QLocaleId other) const noexcept
212 { return language_id == other.language_id && script_id == other.script_id && territory_id == other.territory_id; }
213 [[nodiscard]] inline bool operator!=(QLocaleId other) const noexcept
214 { return !operator==(other); }
215 [[nodiscard]] inline bool isValid() const noexcept
216 {
217 return language_id <= QLocale::LastLanguage && script_id <= QLocale::LastScript
218 && territory_id <= QLocale::LastTerritory;
219 }
220 [[nodiscard]] inline bool matchesAll() const noexcept
221 {
222 return !language_id && !script_id && !territory_id;
223 }
224 // Use as: filter.accept...(candidate)
225 [[nodiscard]] inline bool acceptLanguage(quint16 lang) const noexcept
226 {
227 // Always reject AnyLanguage (only used for last entry in locale_data array).
228 // So, when searching for AnyLanguage, accept everything *but* AnyLanguage.
229 return language_id ? lang == language_id : lang;
230 }
231 [[nodiscard]] inline bool acceptScriptTerritory(QLocaleId other) const noexcept
232 {
233 return (!territory_id || other.territory_id == territory_id)
234 && (!script_id || other.script_id == script_id);
235 }
236
237 [[nodiscard]] QLocaleId withLikelySubtagsAdded() const noexcept;
238 [[nodiscard]] QLocaleId withLikelySubtagsRemoved() const noexcept;
239
240 [[nodiscard]] Q_AUTOTEST_EXPORT QByteArray name(char separator = '-') const;
241
242 ushort language_id = 0, script_id = 0, territory_id = 0;
243};
245
247{
248public:
249 // Having an index for each locale enables us to have diverse sources of
250 // data, e.g. calendar locales, as well as the main CLDR-derived data.
251 [[nodiscard]] Q_AUTOTEST_EXPORT static qsizetype findLocaleIndex(QLocaleId localeId) noexcept;
252 [[nodiscard]] Q_AUTOTEST_EXPORT static const QLocaleData *c() noexcept;
254 static bool allLocaleDataRows(bool (*check)(qsizetype, const QLocaleData &));
255 [[nodiscard]] Q_AUTOTEST_EXPORT
256 static const QLocaleData *dataForLocaleIndex(qsizetype index);
257
264
280
282
283 struct GroupSizes // Numbers of digits in various groups:
284 {
285 int first = 0; // Min needed before the separator, when there's only one.
286 int higher = 0; // Each group between separators.
287 int least = 0; // Least significant, when any separators appear.
288 bool isValid() const { return least > 0 && higher > first && first > 0; }
289 };
290
291 using CharBuff = QVarLengthArray<char, 256>;
292
294 {
295 enum State { // A duplicate of QValidator::State
299 };
300
303 };
304
305private:
306 enum PrecisionMode {
307 PMDecimalDigits = 0x01,
308 PMSignificantDigits = 0x02,
309 PMChopTrailingZeros = 0x03
310 };
311
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;
321
322public:
323 [[nodiscard]] QString doubleToString(double d,
324 int precision = -1,
326 int width = -1,
327 unsigned flags = NoFlags) const;
328 [[nodiscard]] QString longLongToString(qint64 l, int precision = -1,
329 int base = 10,
330 int width = -1,
331 unsigned flags = NoFlags) const;
332 [[nodiscard]] QString unsLongLongToString(quint64 l, int precision = -1,
333 int base = 10,
334 int width = -1,
335 unsigned flags = NoFlags) const;
336
337 // this function is meant to be called with the result of stringToDouble or bytearrayToDouble
338 // so *ok must have been properly set (if not null)
339 [[nodiscard]] static float convertDoubleToFloat(double d, bool *ok)
340 {
341 float result;
342 bool b = convertDoubleTo<float>(d, &result);
343 if (ok && *ok)
344 *ok = b;
345 return result;
346 }
347
348 [[nodiscard]] double stringToDouble(QStringView str, bool *ok,
349 QLocale::NumberOptions options) const;
351 stringToLongLong(QStringView str, int base, QLocale::NumberOptions options) const;
353 stringToUnsLongLong(QStringView str, int base, QLocale::NumberOptions options) const;
354
355 // this function is used in QIntValidator (QtGui)
359 bytearrayToUnsLongLong(QByteArrayView num, int base);
360
361 [[nodiscard]] bool numberToCLocale(QStringView s, QLocale::NumberOptions number_options,
362 NumberMode mode, CharBuff *result) const;
363
365 {
366#ifndef QT_NO_SYSTEMLOCALE
367 // Only used for the system locale, to store data for the view to look at:
369#endif
372 char32_t zeroUcs = 0;
374 bool exponentCyrillic = false; // True only for floating-point parsing of Cyrillic.
375 const bool isC; // C locale sets this and nothing else.
376
377 void setZero(QStringView zero)
378 {
379 Q_PRE(!isC);
380 // No known locale has digits that are more than one Unicode
381 // code-point, so we can safely deal with digits as plain char32_t.
382 switch (zero.size()) {
383 case 1:
384 Q_ASSERT(!zero.at(0).isSurrogate());
385 zeroUcs = zero.at(0).unicode();
386 Q_ASSERT(!QChar::requiresSurrogates(zeroUcs + 9));
387 zeroLen = 1;
388 break;
389 case 2:
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));
394 zeroLen = 2;
395 break;
396 default:
397 Q_ASSERT(zero.size() == 0); // i.e. we got no value to use
398 break;
399 }
400 }
403 [[nodiscard]] const GroupSizes &groupSizes() const { return grouping; }
404
405 [[nodiscard]] bool isValid(NumberMode mode) const // Asserted as a sanity check.
406 {
407 if (isC)
408 return true;
409 if (exponentCyrillic && exponent != u"E" && exponent != u"\u0415")
410 return false;
411 return (zeroLen == 1 || zeroLen == 2) && zeroUcs > 0
412 && (mode == IntegerMode || !decimal.isEmpty())
413 // group may be empty (user config in system locale)
414 && !minus.isEmpty() && !plus.isEmpty()
415 && (mode != DoubleScientificMode || !exponent.isEmpty());
416 }
417
418 [[nodiscard]] qint8 digitValue(char32_t digit) const
419 {
420 // Compute locale-appropriate digit value (or -1)
421 if (!isC && zeroUcs != U'0') {
422 // Must match qlocale_tools_p.h's unicodeForDigit().
423 if (digit == zeroUcs || zeroUcs != U'\u3007') {
424 if (qint32 ans = digit - zeroUcs; 0 <= ans && ans <= 9)
425 return qint8(ans);
426 } else if (digit > U'\u3020') {
427 if (qint32 ans = digit - U'\u3020'; 0 <= ans && ans <= 9)
428 return qint8(ans);
429 }
430 // Accepting ASCII with zeroLen != 1 would mess up code that
431 // assumes consistent digit width.
432 if (zeroLen != 1)
433 return -1;
434 }
435 qint32 ans = digit - U'0';
436 return qint8(0 <= ans && ans <= 9 ? ans : -1);
437 }
438
440 {
441 // True precisely if fractional part separator and digit-grouping
442 // separator are the same. This can happen due to user
443 // mis-configuration. (Our CLDR-digestion scripts check against CLDR
444 // having such clashes.)
445 // For C locale we don't store separators, we just know them.
446 return Q_UNLIKELY(!isC && group == decimal);
447 }
448 };
449
450 // this function is used in QIntValidator (QtGui)
454
455 // Access to assorted data members:
457 { return QLocaleId { m_language_id, m_script_id, m_territory_id }; }
458
459 [[nodiscard]] QString decimalPoint() const;
460 [[nodiscard]] QString groupSeparator() const;
461 [[nodiscard]] QString listSeparator() const;
462 [[nodiscard]] QString percentSign() const;
463 [[nodiscard]] QString zeroDigit() const;
464 [[nodiscard]] Q_AUTOTEST_EXPORT char32_t zeroUcs() const;
465 [[nodiscard]] QString positiveSign() const;
466 [[nodiscard]] QString negativeSign() const;
467 [[nodiscard]] QString exponentSeparator() const;
469
471 {
472 using Index = quint32;
473 Index offset; // Some zone data tables are big.
474 Index size; // (for consistency and to avoid struct-padding)
475 [[nodiscard]] QString getData(const char16_t *table) const
476 {
477 return size > 0
478 ? QString::fromRawData(stringStart(table), stringSize())
479 : QString();
480 }
481 [[nodiscard]] QStringView viewData(const char16_t *table) const
482 {
483 return { stringStart(table), stringSize() };
484 }
485 [[nodiscard]] QString getListEntry(const char16_t *table, qsizetype index) const
486 {
487 return listEntry(table, index).getData(table);
488 }
489 [[nodiscard]] QStringView viewListEntry(const char16_t *table, qsizetype index) const
490 {
491 return listEntry(table, index).viewData(table);
492 }
493 [[nodiscard]] char32_t ucsFirst(const char16_t *table) const
494 {
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]);
499 return 0;
500 }
501 private:
502 [[nodiscard]] const QChar *stringStart(const char16_t *table) const
503 {
504 return reinterpret_cast<const QChar *>(table + offset);
505 }
506 [[nodiscard]] qsizetype stringSize() const
507 {
508 // On 32-bit platforms, this is a narrowing cast, but the size has
509 // always come from an 8-bit or 16-bit table value so can't actually
510 // have a problem with that.
511 qsizetype result = static_cast<qsizetype>(size);
512 Q_ASSERT(result >= 0);
513 return result;
514 }
515 [[nodiscard]] DataRange listEntry(const char16_t *table, qsizetype index) const
516 {
517 const char16_t separator = ';';
518 Index i = 0;
519 while (index > 0 && i < size) {
520 if (table[offset + i] == separator)
521 index--;
522 i++;
523 }
524 Index end = i;
525 while (end < size && table[offset + end] != separator)
526 end++;
527 return { offset + i, end - i };
528 }
529 };
530
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)
544
545#define rangeGetter(name)
546 [[nodiscard]] DataRange name() const { return { m_ ## name ## _idx, m_ ## name ## _size }; }
548#undef rangeGetter
549
550public:
551 quint16 m_language_id, m_script_id, m_territory_id;
552
553 // Offsets, then sizes, for each range:
554#define rangeIndex(name) quint16 m_ ## name ## _idx;
556#undef rangeIndex
557#define Size(name) quint8 m_ ## name ## _size;
559#undef Size
560
561#undef ForEachQLocaleRange
562
563 // Strays:
564 char m_currency_iso_code[3];
566 quint8 m_currency_rounding : 3; // (not yet used !)
570 quint8 m_grouping_first : 2; // Don't group until more significant group has this many digits.
571 quint8 m_grouping_higher : 3; // Number of digits between grouping separators
572 quint8 m_grouping_least : 3; // Number of digits after last grouping separator (before decimal).
573};
574
576
578{
579public:
580 constexpr QLocalePrivate(const QLocaleData *data, qsizetype index,
581 QLocale::NumberOptions numberOptions = QLocale::DefaultNumberOptions,
582 int refs = 0)
585
586 [[nodiscard]] quint16 languageId() const { return m_data->m_language_id; }
587 [[nodiscard]] quint16 territoryId() const { return m_data->m_territory_id; }
588
589 [[nodiscard]] QByteArray bcp47Name(char separator = '-') const;
590
591 [[nodiscard]] inline std::array<char, 4>
592 languageCode(QLocale::LanguageCodeTypes codeTypes = QLocale::AnyLanguageCode) const
593 {
594 return languageToCode(QLocale::Language(m_data->m_language_id), codeTypes);
595 }
597 { return scriptToCode(QLocale::Script(m_data->m_script_id)); }
599 { return territoryToCode(QLocale::Territory(m_data->m_territory_id)); }
600
601 [[nodiscard]] static const QLocalePrivate *get(const QLocale &l) { return l.d; }
602 [[nodiscard]] static std::array<char, 4>
603 languageToCode(QLocale::Language language,
604 QLocale::LanguageCodeTypes codeTypes = QLocale::AnyLanguageCode);
605 [[nodiscard]] static QLatin1StringView scriptToCode(QLocale::Script script);
606 [[nodiscard]] static QLatin1StringView territoryToCode(QLocale::Territory territory);
607 [[nodiscard]] static QLocale::Language
608 codeToLanguage(QStringView code,
609 QLocale::LanguageCodeTypes codeTypes = QLocale::AnyLanguageCode) noexcept;
610 [[nodiscard]] static QLocale::Script codeToScript(QStringView code) noexcept;
611 [[nodiscard]] static QLocale::Territory codeToTerritory(QStringView code) noexcept;
612
614
615 [[nodiscard]] QString toUpper(const QString &str, bool *ok) const;
616 [[nodiscard]] QString toLower(const QString &str, bool *ok) const;
617
618 // System locale has an m_data all its own; all others have m_data = locale_data + m_index
619 const QLocaleData *const m_data;
621 qsizetype m_index; // System locale needs this updated when m_data->id() changes.
623
625};
626
627#ifndef QT_NO_SYSTEMLOCALE
628qsizetype QSystemLocale::fallbackLocaleIndex() const { return fallbackLocale().d->m_index; }
629#endif
630
631template <>
632inline QLocalePrivate *QSharedDataPointer<QLocalePrivate>::clone()
633{
634 // cannot use QLocalePrivate's copy constructor
635 // since it is deleted in C++11
636 return new QLocalePrivate(d->m_data, d->m_index, d->m_numberOptions);
637}
638
639// Also used to merely skip over an escape in a format string, advancint idx to
640// point after it (so not [[nodiscard]]):
641QString qt_readEscapedFormatString(QStringView format, qsizetype *idx);
642[[nodiscard]] bool qt_splitLocaleName(QStringView name, QStringView *lang = nullptr,
643 QStringView *script = nullptr,
644 QStringView *cntry = nullptr) noexcept;
645[[nodiscard]] qsizetype qt_repeatCount(QStringView s) noexcept;
646
647[[nodiscard]] constexpr inline bool ascii_isspace(uchar c) noexcept
648{
649 constexpr auto matcher = QtPrivate::makeCharacterSetMatch<QtPrivate::ascii_space_chars>();
650 return matcher.matches(c);
651}
652
653QT_END_NAMESPACE
654
655// ### move to qnamespace.h
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)
660#endif
661
662#endif // QLOCALE_P_H
\inmodule QtCore
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)
Definition qlist.h:80
static QLatin1StringView scriptToCode(QLocale::Script script)
Definition qlocale.cpp:259
QString toUpper(const QString &str, bool *ok) const
static const QLocalePrivate * get(const QLocale &l)
Definition qlocale_p.h:601
QString toLower(const QString &str, bool *ok) const
quint16 languageId() const
Definition qlocale_p.h:586
static QLocale::Language codeToLanguage(QStringView code, QLocale::LanguageCodeTypes codeTypes=QLocale::AnyLanguageCode) noexcept
Definition qlocale.cpp:109
const QLocaleData *const m_data
Definition qlocale_p.h:619
QLatin1StringView scriptCode() const
Definition qlocale_p.h:596
QLocale::MeasurementSystem measurementSystem() const
Definition qlocale.cpp:3549
quint16 territoryId() const
Definition qlocale_p.h:587
static QLatin1StringView territoryToCode(QLocale::Territory territory)
Definition qlocale.cpp:267
qsizetype m_index
Definition qlocale_p.h:621
static QLocale::Territory codeToTerritory(QStringView code) noexcept
Definition qlocale.cpp:215
static std::array< char, 4 > languageToCode(QLocale::Language language, QLocale::LanguageCodeTypes codeTypes=QLocale::AnyLanguageCode)
Definition qlocale.cpp:234
static QLocale::Script codeToScript(QStringView code) noexcept
Definition qlocale.cpp:209
QLocale::NumberOptions m_numberOptions
Definition qlocale_p.h:622
QLatin1StringView territoryCode() const
Definition qlocale_p.h:598
constexpr QLocalePrivate(const QLocaleData *data, qsizetype index, QLocale::NumberOptions numberOptions=QLocale::DefaultNumberOptions, int refs=0)
Definition qlocale_p.h:580
std::array< char, 4 > languageCode(QLocale::LanguageCodeTypes codeTypes=QLocale::AnyLanguageCode) const
Definition qlocale_p.h:592
static QBasicAtomicInt s_generation
Definition qlocale_p.h:624
QByteArray bcp47Name(char separator='-') const
Definition qlocale.cpp:494
QBasicAtomicInt ref
Definition qlocale_p.h:620
qsizetype fallbackLocaleIndex() const
Definition qlocale_p.h:628
@ StringToAlternateQuotation
Definition qlocale_p.h:181
@ DateTimeToStringShort
Definition qlocale_p.h:169
@ StandaloneMonthNameLong
Definition qlocale_p.h:187
@ ListToSeparatedString
Definition qlocale_p.h:183
@ StandaloneDayNameNarrow
Definition qlocale_p.h:192
@ StandaloneMonthNameNarrow
Definition qlocale_p.h:189
@ StringToStandardQuotation
Definition qlocale_p.h:180
@ StandaloneDayNameShort
Definition qlocale_p.h:191
@ StandaloneDayNameLong
Definition qlocale_p.h:190
@ StandaloneMonthNameShort
Definition qlocale_p.h:188
virtual QLocale fallbackLocale() const
virtual QVariant query(QueryType type, QVariant &&in=QVariant()) const
constexpr char ascii_space_chars[]
Definition qlocale_p.h:91
constexpr auto makeCharacterSetMatch() noexcept
Definition qlocale_p.h:100
static constexpr bool isLowerCaseAscii(char c)
static const quint16 crc_tbl[16]
QByteArray qCompress(const uchar *data, qsizetype nbytes, int compressionLevel)
ZLibOp
@ Decompression
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)
#define __has_feature(x)
bool qt_splitLocaleName(QStringView name, QStringView *lang=nullptr, QStringView *script=nullptr, QStringView *cntry=nullptr) noexcept
Definition qlocale.cpp:662
Q_DECLARE_TYPEINFO(QLocaleData::GroupSizes, Q_PRIMITIVE_TYPE)
Q_DECLARE_TYPEINFO(QLocaleId, Q_PRIMITIVE_TYPE)
qsizetype qt_repeatCount(QStringView s) noexcept
Definition qlocale.cpp:775
constexpr bool ascii_isspace(uchar c) noexcept
Definition qlocale_p.h:647
#define ForEachQLocaleRange(X)
Definition qlocale_p.h:531
QString qt_readEscapedFormatString(QStringView format, qsizetype *idx)
Definition qlocale.cpp:725
QByteArray qdtoAscii(double d, QLocaleData::DoubleForm form, int precision, bool uppercase)
constexpr size_t qHash(const QSize &s, size_t seed=0) noexcept
Definition qsize.h:191
qregisteruint mask[Extent]
Definition qlocale_p.h:52
static constexpr int WordBits
Definition qlocale_p.h:50
static constexpr int MaxRange
Definition qlocale_p.h:51
constexpr auto maskLocation(uchar c) const noexcept
Definition qlocale_p.h:78
constexpr QCharacterSetMatch(std::string_view set) noexcept
Definition qlocale_p.h:54
constexpr bool matches(uchar c) const noexcept
Definition qlocale_p.h:63
QStringView viewListEntry(const char16_t *table, qsizetype index) const
Definition qlocale_p.h:489
char32_t ucsFirst(const char16_t *table) const
Definition qlocale_p.h:493
QString getData(const char16_t *table) const
Definition qlocale_p.h:475
QString getListEntry(const char16_t *table, qsizetype index) const
Definition qlocale_p.h:485
QStringView viewData(const char16_t *table) const
Definition qlocale_p.h:481
void setZero(QStringView zero)
Definition qlocale_p.h:377
bool fractionalIsGroup() const
Definition qlocale_p.h:439
const GroupSizes & groupSizes() const
Definition qlocale_p.h:403
bool isValid(NumberMode mode) const
Definition qlocale_p.h:405
const GroupSizes grouping
Definition qlocale_p.h:371
qint8 digitValue(char32_t digit) const
Definition qlocale_p.h:418
QString positiveSign() const
Definition qlocale.cpp:1120
static float convertDoubleToFloat(double d, bool *ok)
Definition qlocale_p.h:339
QString groupSeparator() const
Definition qlocale.cpp:1079
QSimpleParsedNumber< qint64 > stringToLongLong(QStringView str, int base, QLocale::NumberOptions options) const
Definition qlocale.cpp:4904
Q_AUTOTEST_EXPORT char32_t zeroUcs() const
Definition qlocale.cpp:1099
quint8 m_grouping_least
Definition qlocale_p.h:572
QString zeroDigit() const
Definition qlocale.cpp:1094
bool numberToCLocale(QStringView s, QLocale::NumberOptions number_options, NumberMode mode, CharBuff *result) const
Definition qlocale.cpp:4630
quint8 m_grouping_higher
Definition qlocale_p.h:571
QString decimalPoint() const
Definition qlocale.cpp:1074
QString doubleToString(double d, int precision=-1, DoubleForm form=DFSignificantDigits, int width=-1, unsigned flags=NoFlags) const
Definition qlocale.cpp:4058
static Q_AUTOTEST_EXPORT bool allLocaleDataRows(bool(*check)(qsizetype, const QLocaleData &))
Definition qlocale.cpp:524
quint8 m_weekend_start
Definition qlocale_p.h:568
quint8 m_currency_digits
Definition qlocale_p.h:565
QLocaleId id() const
Definition qlocale_p.h:456
QString listSeparator() const
Definition qlocale.cpp:1089
static QSimpleParsedNumber< quint64 > bytearrayToUnsLongLong(QByteArrayView num, int base)
Definition qlocale.cpp:4951
QString percentSign() const
Definition qlocale.cpp:1084
@ BlankBeforePositive
Definition qlocale_p.h:270
@ AddTrailingZeroes
Definition qlocale_p.h:267
double stringToDouble(QStringView str, bool *ok, QLocale::NumberOptions options) const
Definition qlocale.cpp:4888
QString longLongToString(qint64 l, int precision=-1, int base=10, int width=-1, unsigned flags=NoFlags) const
Definition qlocale.cpp:4301
@ DoubleScientificMode
Definition qlocale_p.h:281
@ DoubleStandardMode
Definition qlocale_p.h:281
@ DFSignificantDigits
Definition qlocale_p.h:261
quint8 m_first_day_of_week
Definition qlocale_p.h:567
quint8 m_weekend_end
Definition qlocale_p.h:569
quint8 m_currency_rounding
Definition qlocale_p.h:566
QString exponentSeparator() const
Definition qlocale.cpp:1125
QString negativeSign() const
Definition qlocale.cpp:1115
QSimpleParsedNumber< quint64 > stringToUnsLongLong(QStringView str, int base, QLocale::NumberOptions options) const
Definition qlocale.cpp:4915
QString unsLongLongToString(quint64 l, int precision=-1, int base=10, int width=-1, unsigned flags=NoFlags) const
Definition qlocale.cpp:4316
quint8 m_grouping_first
Definition qlocale_p.h:570
QLocaleId withLikelySubtagsAdded() const noexcept
Fill in blank fields of a locale ID.
Definition qlocale.cpp:326
QLocaleId withLikelySubtagsRemoved() const noexcept
Definition qlocale.cpp:415
ushort script_id
Definition qlocale_p.h:242
bool operator==(QLocaleId other) const noexcept
Definition qlocale_p.h:211
bool matchesAll() const noexcept
Definition qlocale_p.h:220
bool isValid() const noexcept
Definition qlocale_p.h:215
bool operator!=(QLocaleId other) const noexcept
Definition qlocale_p.h:213
bool acceptScriptTerritory(QLocaleId other) const noexcept
Definition qlocale_p.h:231
ushort territory_id
Definition qlocale_p.h:242
bool acceptLanguage(quint16 lang) const noexcept
Definition qlocale_p.h:225
ushort language_id
Definition qlocale_p.h:242
CurrencyToStringArgument(const QVariant &v, const QString &s)
Definition qlocale_p.h:138