6#ifndef QSTRINGCONVERTER_P_H
7#define QSTRINGCONVERTER_P_H
20#include <QtCore/qstring.h>
21#include <QtCore/qendian.h>
22#include <QtCore/qstringconverter.h>
23#include <QtCore/private/qglobal_p.h>
30using qchar8_t = char8_t;
36 static char16_t *
convertToUnicode(
char16_t *dst, QLatin1StringView in)
noexcept;
40 char16_t *dst =
reinterpret_cast<
char16_t *>(buffer);
41 dst = convertToUnicode(dst, in);
42 return reinterpret_cast<QChar *>(dst);
46 [[
maybe_unused]] QStringConverter::State *state)
noexcept
50 return convertToUnicode(dst, QLatin1StringView(in.data(), in.size()));
53 static char *
convertFromUnicode(
char *out, QStringView in, QStringConverter::State *state)
noexcept;
102 { *ptr++ =
char16_t(uc); }
106 appendUtf16(ptr, QChar::highSurrogate(uc));
107 appendUtf16(ptr, QChar::lowSurrogate(uc));
110 static char16_t peekUtf16(
const char16_t *ptr, qsizetype n = 0) {
return ptr[n]; }
113 {
return end - ptr; }
115 static void advanceUtf16(
const char16_t *&ptr, qsizetype n = 1) { ptr += n; }
118 { *ptr++ =
char32_t(uc); }
135 template <
typename Traits,
typename OutputPtr,
typename InputPtr>
inline
136 int toUtf8(
char16_t u, OutputPtr &dst, InputPtr &src, InputPtr end)
138 if (!Traits::skipAsciiHandling && u < 0x80) {
140 Traits::appendByte(dst, uchar(u));
142 }
else if (u < 0x0800) {
145 Traits::appendByte(dst, 0xc0 | uchar(u >> 6));
147 if (!QChar::isSurrogate(u)) {
149 if (!Traits::allowNonCharacters && QChar::isNonCharacter(u))
150 return Traits::Error;
153 Traits::appendByte(dst, 0xe0 | uchar(u >> 12));
157 if (Traits::availableUtf16(src, end) == 0)
158 return Traits::EndOfString;
160 char16_t low = Traits::peekUtf16(src);
161 if (!QChar::isHighSurrogate(u))
162 return Traits::Error;
163 if (!QChar::isLowSurrogate(low))
164 return Traits::Error;
166 Traits::advanceUtf16(src);
167 char32_t ucs4 = QChar::surrogateToUcs4(u, low);
169 if (!Traits::allowNonCharacters && QChar::isNonCharacter(ucs4))
170 return Traits::Error;
173 Traits::appendByte(dst, 0xf0 | (uchar(ucs4 >> 18) & 0xf));
176 Traits::appendByte(dst, 0x80 | (uchar(ucs4 >> 12) & 0x3f));
183 Traits::appendByte(dst, 0x80 | (uchar(u >> 6) & 0x3f));
187 Traits::appendByte(dst, 0x80 | (u & 0x3f));
193 return (b & 0xc0) == 0x80;
198 template <
typename Traits,
typename OutputPtr,
typename InputPtr>
inline
201 qsizetype charsNeeded;
205 if (!Traits::skipAsciiHandling && b < 0x80) {
207 Traits::appendUtf16(dst, b);
211 if (!Traits::isTrusted && Q_UNLIKELY(b <= 0xC1)) {
214 return Traits::Error;
215 }
else if (b < 0xe0) {
219 }
else if (b < 0xf0) {
223 }
else if (b < 0xf5) {
231 return Traits::Error;
234 qptrdiff bytesAvailable = Traits::availableBytes(src, end);
235 if (Q_UNLIKELY(bytesAvailable < charsNeeded - 1)) {
237 if (bytesAvailable > 0 && !isContinuationByte(Traits::peekByte(src, 0)))
238 return Traits::Error;
239 if (bytesAvailable > 1 && !isContinuationByte(Traits::peekByte(src, 1)))
240 return Traits::Error;
241 return Traits::EndOfString;
245 b = Traits::peekByte(src, 0);
246 if (!isContinuationByte(b))
247 return Traits::Error;
251 if (charsNeeded > 2) {
253 b = Traits::peekByte(src, 1);
254 if (!isContinuationByte(b))
255 return Traits::Error;
259 if (charsNeeded > 3) {
261 b = Traits::peekByte(src, 2);
262 if (!isContinuationByte(b))
263 return Traits::Error;
270 if (!Traits::isTrusted) {
272 return Traits::Error;
273 if (QChar::isSurrogate(uc) || uc > QChar::LastValidCodePoint)
274 return Traits::Error;
275 if (!Traits::allowNonCharacters && QChar::isNonCharacter(uc))
276 return Traits::Error;
280 if (!QChar::requiresSurrogates(uc)) {
283 Traits::appendUtf16(dst,
char16_t(uc));
286 Traits::appendUcs4(dst, uc);
289 Traits::advanceByte(src, charsNeeded - 1);
300 auto *output = buffer;
303 Q_ASSERT(output == buffer + 1);
319 char16_t *dst =
reinterpret_cast<
char16_t *>(buffer);
320 dst =
QUtf8::convertToUnicode(dst, in);
321 return reinterpret_cast<QChar *>(dst);
324 Q_CORE_EXPORT
static char16_t*
convertToUnicode(
char16_t *dst, QByteArrayView in)
noexcept;
330 char16_t *buffer =
reinterpret_cast<
char16_t *>(out);
331 buffer = convertToUnicode(buffer, in, state);
332 return reinterpret_cast<QChar *>(buffer);
335 static char16_t *
convertToUnicode(
char16_t *dst, QByteArrayView in, QStringConverter::State *state);
341 static char *
convertFromUnicode(
char *out, QStringView in, QStringConverter::State *state);
348 static int compareUtf8(QByteArrayView utf8, QStringView utf16,
350 static int compareUtf8(QByteArrayView utf8, QLatin1StringView s,
352 static int compareUtf8(QByteArrayView lhs, QByteArrayView rhs,
356 template <
typename OnErrorLambda>
static char *
357 convertFromUnicode(
char *out, QStringView in, OnErrorLambda &&onError)
noexcept;
358 template <
typename OnErrorLambda>
static char16_t *
359 convertToUnicode(
char16_t *dst, QByteArrayView in, OnErrorLambda &&onError)
noexcept;
380#if !defined(Q_OS_WIN) || defined(QT_BOOTSTRAPPED)
381 static QString convertToUnicode(QByteArrayView in, QStringConverter::State *state)
382 {
return QUtf8::convertToUnicode(in, state); }
383 static QByteArray convertFromUnicode(QStringView in, QStringConverter::State *state)
384 {
return QUtf8::convertFromUnicode(in, state); }
386 static int checkUtf8();
390 static QBasicAtomicInteger<qint8> result = { 0 };
391 int r = result.loadRelaxed();
394 result.storeRelaxed(r);
398 static QString convertToUnicode_sys(QByteArrayView, quint32, QStringConverter::State *);
399 static QString convertToUnicode_sys(QByteArrayView, QStringConverter::State *);
400 static QString convertToUnicode(QByteArrayView in, QStringConverter::State *state)
403 return QUtf8::convertToUnicode(in, state);
404 return convertToUnicode_sys(in, state);
406 static QByteArray convertFromUnicode_sys(QStringView, quint32, QStringConverter::State *);
407 static QByteArray convertFromUnicode_sys(QStringView, QStringConverter::State *);
408 static QByteArray convertFromUnicode(QStringView in, QStringConverter::State *state)
411 return QUtf8::convertFromUnicode(in, state);
412 return convertFromUnicode_sys(in, state);
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
~QScopedArrayPointer()=default
const T & operator[](qsizetype i) const
T & operator[](qsizetype i)
friend bool operator==(std::nullptr_t, const QScopedPointer< T, Cleanup > &rhs) noexcept
bool operator!() const noexcept
friend bool operator==(const QScopedPointer< T, Cleanup > &lhs, std::nullptr_t) noexcept
T * operator->() const noexcept
bool isNull() const noexcept
void reset(T *other=nullptr) noexcept(noexcept(Cleanup::cleanup(std::declval< T * >())))
friend bool operator!=(std::nullptr_t, const QScopedPointer< T, Cleanup > &rhs) noexcept
friend bool operator!=(const QScopedPointer< T, Cleanup > &lhs, std::nullptr_t) noexcept
T * data() const noexcept
friend bool operator!=(const QScopedPointer< T, Cleanup > &lhs, const QScopedPointer< T, Cleanup > &rhs) noexcept
friend bool operator==(const QScopedPointer< T, Cleanup > &lhs, const QScopedPointer< T, Cleanup > &rhs) noexcept
constexpr QSpanBase(It first, qsizetype count)
static constexpr qsizetype m_size
constexpr QSpanBase(It first, End last)
constexpr bool empty() const noexcept
constexpr pointer data() const noexcept
static constexpr std::size_t extent
constexpr reverse_iterator rbegin() const noexcept
constexpr reference front() const
constexpr QSpan< T > sliced(size_type pos, size_type n) const
constexpr QSpan< T > sliced(size_type pos) const
constexpr size_type size() const noexcept
const_pointer const_iterator
constexpr iterator end() const noexcept
constexpr const_iterator cbegin() const noexcept
constexpr QSpan< T > subspan(size_type pos, size_type n) const
constexpr const_iterator cend() const noexcept
constexpr bool isEmpty() const noexcept
constexpr reverse_iterator rend() const noexcept
constexpr QSpan< T, Count > last() const noexcept(subspan_always_succeeds_v< Count >)
constexpr QSpan< T > last(size_type n) const
constexpr const_reverse_iterator crend() const noexcept
friend QSpan< const std::byte, E==q20::dynamic_extent ? q20::dynamic_extent :E *sizeof(T)> as_bytes(QSpan s) noexcept
constexpr size_type size_bytes() const noexcept
std::reverse_iterator< const_iterator > const_reverse_iterator
constexpr const_reverse_iterator crbegin() const noexcept
constexpr reference operator[](size_type idx) const
constexpr QSpan< T > first(size_type n) const
constexpr reference back() const
constexpr QSpan< T > subspan(size_type pos) const
constexpr auto subspan() const noexcept(subspan_always_succeeds_v< Offset+Count >)
constexpr QSpan< T, Count > first() const noexcept(subspan_always_succeeds_v< Count >)
const T & const_reference
std::reverse_iterator< iterator > reverse_iterator
constexpr QSpan< T > chopped(size_type n) const
friend QSpan< std::byte, E==q20::dynamic_extent ? q20::dynamic_extent :E *sizeof(T)> as_writable_bytes(QSpan s) noexcept
constexpr iterator begin() const noexcept
constexpr auto subspan() const noexcept(subspan_always_succeeds_v< Offset >)
\macro QT_RESTRICTED_CAST_FROM_ASCII
qsizetype fallbackLocaleIndex() const
@ StringToAlternateQuotation
@ StandaloneMonthNameLong
@ StandaloneDayNameNarrow
@ StandaloneMonthNameNarrow
@ StringToStandardQuotation
@ StandaloneMonthNameShort
virtual QLocale fallbackLocale() const
virtual QVariant query(QueryType type, QVariant &&in=QVariant()) const
AdlTester::size_result< Range > adl_size(Range &&r)
std::conditional_t< std::is_const_v< From >, const To &, To & > const_propagated(To &in)
decltype(QSpanPrivate::adl_begin(std::declval< Range & >())) iterator_t
AdlTester::data_result< Range > adl_data(Range &&r)
AdlTester::begin_result< Range > adl_begin(Range &&r)
constexpr bool is_qualification_conversion_v
std::is_convertible< From(*)[], To(*)[]> is_qualification_conversion
Combined button and popup list for selecting options.
qsizetype fromUtf8(uchar b, OutputPtr &dst, InputPtr &src, InputPtr end)
char32_t nextUcs4FromUtf8(const qchar8_t *&src, const qchar8_t *end, char32_t errorChar=QChar::ReplacementCharacter)
wrapper around fromUtf8<Traits> to provide a simpler interface for a common case
int toUtf8(char16_t u, OutputPtr &dst, InputPtr &src, InputPtr end)
bool isContinuationByte(uchar b)
constexpr char ascii_space_chars[]
constexpr auto makeCharacterSetMatch() noexcept
constexpr auto dynamic_extent
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(const QByteArray &input, QByteArray *rvalue, uchar(*lookup)(uchar))
static qsizetype q_fromPercentEncoding(QByteArrayView src, char percent, QSpan< char > buffer)
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 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(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)
QScopedPointerObjectDeleteLater< QObject > QScopedPointerDeleteLater
constexpr size_t qHash(const QSize &s, size_t seed=0) noexcept
#define MAKE_ADL_TEST(what)
QSpan(const std::array< T, N > &) -> QSpan< const T, N >
#define QT_ONLY_IF_DYNAMIC_SPAN(DECL)
QSpan(T(&)[N]) -> QSpan< T, N >
QSpan(std::array< T, N > &) -> QSpan< T, N >
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
static char16_t * convertToUnicode(char16_t *dst, QLatin1StringView in) noexcept
static QChar * convertToUnicode(QChar *dst, QByteArrayView in, QStringConverter::State *state) noexcept
static char * convertFromUnicode(char *out, QStringView in, QStringConverter::State *state) noexcept
static QChar * convertToUnicode(QChar *buffer, QLatin1StringView in) noexcept
static Q_CORE_EXPORT char * convertFromUnicode(char *out, QStringView in) 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
Descriptor for a digit sequence within a text.
qsizetype size() const
Returns the number of ASCII characters describing the digit sequence.
DigitSequence sliced(qsizetype from, qsizetype count) const
This is an overloaded member function, provided for convenience. It differs from the above function o...
DigitSequence & operator=(const DigitSequence &)=default
QStringView used(const QStringView text) const
Returns the slice of text described by this digit sequence.
Q_DECLARE_FLAGS(Options, Option)
bool hasSign() const
Returns true precisely if the digit sequence parsed includes a leading sign.
bool isEmpty() const
Returns true precisely if this digit sequence represents nothing.
DigitSequence first(qsizetype count) const
Returns a DigitSequence describing a prefix of this.
void transcribeTo(CharBuff *buff) const
Transcribes the ASCII form of this digit sequence to buff.
DigitSequence(DigitSequence &&)=default
DigitSequence & operator=(DigitSequence &&)=default
DigitSequence sliced(qsizetype from) const
Returns a DigitSequence describing a tail of this.
QStringView used(const QStringView text, qsizetype from) const
DigitSequence last(qsizetype count) const
Returns a DigitSequence describing a tail of this.
qsizetype endIndex() const
DigitSequence(const DigitSequence &)=default
void setZero(QStringView zero)
bool fractionalIsGroup() const
qsizetype zeroWidth() 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
Returns a DigitSequence describing some portion of text starting at from.
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
DigitSequence digitSequence(QStringView text, DigitSequence::Options flags=DigitSequence::Option::Default, qsizetype from=0) 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
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
static void cleanup(T *pointer) noexcept
void operator()(T *pointer) const noexcept
void operator()(T *pointer) const
static void cleanup(T *pointer)
void operator()(void *pointer) const noexcept
static void cleanup(void *pointer) noexcept
CurrencyToStringArgument(const QVariant &v, const QString &s)
CurrencyToStringArgument()
static QChar * convertToUnicode(QChar *out, QByteArrayView, QStringConverter::State *state, DataEndianness endian)
static char * convertFromUnicode(char *out, QStringView in, QStringConverter::State *state, DataEndianness endian)
static char * convertFromUnicode(char *out, QStringView in, QStringConverter::State *state, DataEndianness endian)
static QChar * convertToUnicode(QChar *out, QByteArrayView, QStringConverter::State *state, DataEndianness endian)
static const bool skipAsciiHandling
static void appendByte(qchar8_t *&ptr, qchar8_t b)
static uchar peekByte(const uchar *ptr, qsizetype n=0)
static qptrdiff availableBytes(const qchar8_t *ptr, const qchar8_t *end)
static void appendByte(uchar *&ptr, uchar b)
static void advanceByte(const uchar *&ptr, qsizetype n=1)
static const bool isTrusted
static void appendUtf16(char32_t *&ptr, char16_t uc)
static const bool skipAsciiHandling
static char16_t peekUtf16(const char16_t *ptr, qsizetype n=0)
static void appendUcs4(char16_t *&ptr, char32_t uc)
static const int EndOfString
static void advanceUtf16(const char16_t *&ptr, qsizetype n=1)
static uchar peekByte(const char *ptr, qsizetype n=0)
static void advanceByte(const char *&ptr, qsizetype n=1)
static uchar peekByte(const qchar8_t *ptr, qsizetype n=0)
static void appendUtf16(char16_t *&ptr, char16_t uc)
static const bool allowNonCharacters
static qptrdiff availableUtf16(const char16_t *ptr, const char16_t *end)
static qptrdiff availableBytes(const char *ptr, const char *end)
static void appendUcs4(char32_t *&ptr, char32_t uc)
static qptrdiff availableBytes(const uchar *ptr, const uchar *end)
static void advanceByte(const qchar8_t *&ptr, qsizetype n=1)
static Q_CORE_EXPORT char16_t * convertToUnicode(char16_t *dst, QByteArrayView in) noexcept
static int compareUtf8(QByteArrayView utf8, QStringView utf16, Qt::CaseSensitivity cs=Qt::CaseSensitive) noexcept
static QChar * convertToUnicode(QChar *buffer, QByteArrayView in) noexcept
static ValidUtf8Result isValidUtf8(QByteArrayView in)
static QString convertToUnicode(QByteArrayView in)
static Q_CORE_EXPORT char * convertFromLatin1(char *out, QLatin1StringView in)
static char16_t * convertToUnicode(char16_t *dst, QByteArrayView in, QStringConverter::State *state)
static QChar * convertToUnicode(QChar *out, QByteArrayView in, QStringConverter::State *state)
static char * convertFromUnicode(char *out, QStringView in, QStringConverter::State *state)
static Q_CORE_EXPORT char * convertFromUnicode(char *dst, QStringView in) noexcept