Port qt_from_latin1() from ushort to char16_t

Change-Id: I054e2f604be7253d3322751d55d03b5bac09aefc
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
This commit is contained in:
Marc Mutz 2020-05-08 21:44:15 +02:00
parent c3d2e0e60a
commit 8ed88d8d14
4 changed files with 28 additions and 24 deletions

View File

@ -1075,7 +1075,7 @@ QString QTextDecoder::toUnicode(const char *chars, int len)
} }
// in qstring.cpp: // in qstring.cpp:
void qt_from_latin1(ushort *dst, const char *str, size_t size) noexcept; void qt_from_latin1(char16_t *dst, const char *str, size_t size) noexcept;
/*! \overload /*! \overload
@ -1090,7 +1090,7 @@ void QTextDecoder::toUnicode(QString *target, const char *chars, int len)
break; break;
case 4: // latin1 case 4: // latin1
target->resize(len); target->resize(len);
qt_from_latin1((ushort*)target->data(), chars, len); qt_from_latin1((char16_t*)target->data(), chars, len);
break; break;
default: default:
*target = c->toUnicode(chars, len, &state); *target = c->toUnicode(chars, len, &state);

View File

@ -423,7 +423,7 @@
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
// in qstring.cpp: // in qstring.cpp:
void qt_from_latin1(ushort *dst, const char *str, size_t size) noexcept; void qt_from_latin1(char16_t *dst, const char *str, size_t size) noexcept;
inline static bool isHex(char c) inline static bool isHex(char c)
{ {
@ -3512,7 +3512,7 @@ QString QUrl::fromEncodedComponent_helper(const QByteArray &ba)
*/ */
QString QUrl::fromAce(const QByteArray &domain) QString QUrl::fromAce(const QByteArray &domain)
{ {
QVarLengthArray<ushort> buffer; QVarLengthArray<char16_t> buffer;
buffer.resize(domain.size()); buffer.resize(domain.size());
qt_from_latin1(buffer.data(), domain.data(), domain.size()); qt_from_latin1(buffer.data(), domain.data(), domain.size());
return qt_ACE_do(QStringView{buffer.data(), buffer.size()}, return qt_ACE_do(QStringView{buffer.data(), buffer.size()},

View File

@ -65,7 +65,6 @@ QT_BEGIN_NAMESPACE
// in qstring.cpp // in qstring.cpp
void qt_to_latin1_unchecked(uchar *dst, const ushort *uc, qsizetype len); void qt_to_latin1_unchecked(uchar *dst, const ushort *uc, qsizetype len);
void qt_from_latin1(ushort *dst, const char *str, size_t size) noexcept;
/* /*
This defines a binary data structure for Json data. The data structure is optimised for fast reading This defines a binary data structure for Json data. The data structure is optimised for fast reading

View File

@ -104,6 +104,11 @@
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
namespace {
// temporary; to easy porting to char16_t
char16_t *to_utf16(ushort *p) { return reinterpret_cast<char16_t *>(p); }
}
/* /*
* Note on the use of SIMD in qstring.cpp: * Note on the use of SIMD in qstring.cpp:
* *
@ -136,8 +141,8 @@ QT_BEGIN_NAMESPACE
#if defined(__mips_dsp) #if defined(__mips_dsp)
// From qstring_mips_dsp_asm.S // From qstring_mips_dsp_asm.S
extern "C" void qt_fromlatin1_mips_asm_unroll4 (ushort*, const char*, uint); extern "C" void qt_fromlatin1_mips_asm_unroll4 (char16_t*, const char*, uint);
extern "C" void qt_fromlatin1_mips_asm_unroll8 (ushort*, const char*, uint); extern "C" void qt_fromlatin1_mips_asm_unroll8 (char16_t*, const char*, uint);
extern "C" void qt_toLatin1_mips_dsp_asm(uchar *dst, const ushort *src, int length); extern "C" void qt_toLatin1_mips_dsp_asm(uchar *dst, const ushort *src, int length);
#endif #endif
@ -611,7 +616,7 @@ bool QtPrivate::isValidUtf16(QStringView s) noexcept
} }
// conversion between Latin 1 and UTF-16 // conversion between Latin 1 and UTF-16
void qt_from_latin1(ushort *dst, const char *str, size_t size) noexcept void qt_from_latin1(char16_t *dst, const char *str, size_t size) noexcept
{ {
/* SIMD: /* SIMD:
* Unpacking with SSE has been shown to improve performance on recent CPUs * Unpacking with SSE has been shown to improve performance on recent CPUs
@ -2383,7 +2388,7 @@ QString &QString::operator=(QLatin1String other)
if (isDetached() && other.size() <= capacity()) { // assumes d->alloc == 0 -> !isDetached() (sharedNull) if (isDetached() && other.size() <= capacity()) { // assumes d->alloc == 0 -> !isDetached() (sharedNull)
d.size = other.size(); d.size = other.size();
d.data()[other.size()] = 0; d.data()[other.size()] = 0;
qt_from_latin1(d.data(), other.latin1(), other.size()); qt_from_latin1(to_utf16(d.data()), other.latin1(), other.size());
} else { } else {
*this = fromLatin1(other.latin1(), other.size()); *this = fromLatin1(other.latin1(), other.size());
} }
@ -2553,7 +2558,7 @@ QString &QString::insert(int i, QLatin1String str)
resize(size() + len); resize(size() + len);
::memmove(d.data() + i + len, d.data() + i, (d.size - i - len) * sizeof(QChar)); ::memmove(d.data() + i + len, d.data() + i, (d.size - i - len) * sizeof(QChar));
qt_from_latin1(d.data() + i, s, uint(len)); qt_from_latin1(to_utf16(d.data() + i), s, uint(len));
return *this; return *this;
} }
@ -2677,7 +2682,7 @@ QString &QString::append(QLatin1String str)
int len = str.size(); int len = str.size();
if (d->needsDetach() || size() + len > capacity()) if (d->needsDetach() || size() + len > capacity())
reallocData(uint(size() + len) + 1u, true); reallocData(uint(size() + len) + 1u, true);
ushort *i = d.data() + d.size; char16_t *i = to_utf16(d.data() + d.size);
qt_from_latin1(i, s, uint(len)); qt_from_latin1(i, s, uint(len));
i[len] = '\0'; i[len] = '\0';
d.size += len; d.size += len;
@ -3285,8 +3290,8 @@ QString &QString::replace(QLatin1String before, QLatin1String after, Qt::CaseSen
{ {
int alen = after.size(); int alen = after.size();
int blen = before.size(); int blen = before.size();
QVarLengthArray<ushort> a(alen); QVarLengthArray<char16_t> a(alen);
QVarLengthArray<ushort> b(blen); QVarLengthArray<char16_t> b(blen);
qt_from_latin1(a.data(), after.latin1(), alen); qt_from_latin1(a.data(), after.latin1(), alen);
qt_from_latin1(b.data(), before.latin1(), blen); qt_from_latin1(b.data(), before.latin1(), blen);
return replace((const QChar *)b.data(), blen, (const QChar *)a.data(), alen, cs); return replace((const QChar *)b.data(), blen, (const QChar *)a.data(), alen, cs);
@ -3307,7 +3312,7 @@ QString &QString::replace(QLatin1String before, QLatin1String after, Qt::CaseSen
QString &QString::replace(QLatin1String before, const QString &after, Qt::CaseSensitivity cs) QString &QString::replace(QLatin1String before, const QString &after, Qt::CaseSensitivity cs)
{ {
int blen = before.size(); int blen = before.size();
QVarLengthArray<ushort> b(blen); QVarLengthArray<char16_t> b(blen);
qt_from_latin1(b.data(), before.latin1(), blen); qt_from_latin1(b.data(), before.latin1(), blen);
return replace((const QChar *)b.data(), blen, after.constData(), after.d.size, cs); return replace((const QChar *)b.data(), blen, after.constData(), after.d.size, cs);
} }
@ -3327,7 +3332,7 @@ QString &QString::replace(QLatin1String before, const QString &after, Qt::CaseSe
QString &QString::replace(const QString &before, QLatin1String after, Qt::CaseSensitivity cs) QString &QString::replace(const QString &before, QLatin1String after, Qt::CaseSensitivity cs)
{ {
int alen = after.size(); int alen = after.size();
QVarLengthArray<ushort> a(alen); QVarLengthArray<char16_t> a(alen);
qt_from_latin1(a.data(), after.latin1(), alen); qt_from_latin1(a.data(), after.latin1(), alen);
return replace(before.constData(), before.d.size, (const QChar *)a.data(), alen, cs); return replace(before.constData(), before.d.size, (const QChar *)a.data(), alen, cs);
} }
@ -3347,7 +3352,7 @@ QString &QString::replace(const QString &before, QLatin1String after, Qt::CaseSe
QString &QString::replace(QChar c, QLatin1String after, Qt::CaseSensitivity cs) QString &QString::replace(QChar c, QLatin1String after, Qt::CaseSensitivity cs)
{ {
int alen = after.size(); int alen = after.size();
QVarLengthArray<ushort> a(alen); QVarLengthArray<char16_t> a(alen);
qt_from_latin1(a.data(), after.latin1(), alen); qt_from_latin1(a.data(), after.latin1(), alen);
return replace(&c, 1, (const QChar *)a.data(), alen, cs); return replace(&c, 1, (const QChar *)a.data(), alen, cs);
} }
@ -5344,7 +5349,7 @@ QString::DataPointer QString::fromLatin1_helper(const char *str, int size)
size = qstrlen(str); size = qstrlen(str);
d = DataPointer(Data::allocate(size + 1), size); d = DataPointer(Data::allocate(size + 1), size);
d.data()[size] = '\0'; d.data()[size] = '\0';
ushort *dst = d.data(); char16_t *dst = to_utf16(d.data());
qt_from_latin1(dst, str, uint(size)); qt_from_latin1(dst, str, uint(size));
} }
@ -8394,7 +8399,7 @@ QString QString::arg(QStringView a, int fieldWidth, QChar fillChar) const
*/ */
QString QString::arg(QLatin1String a, int fieldWidth, QChar fillChar) const QString QString::arg(QLatin1String a, int fieldWidth, QChar fillChar) const
{ {
QVarLengthArray<ushort> utf16(a.size()); QVarLengthArray<char16_t> utf16(a.size());
qt_from_latin1(utf16.data(), a.data(), a.size()); qt_from_latin1(utf16.data(), a.data(), a.size());
return arg(QStringView(utf16.data(), utf16.size()), fieldWidth, fillChar); return arg(QStringView(utf16.data(), utf16.size()), fieldWidth, fillChar);
} }
@ -9015,7 +9020,7 @@ static QString argToQStringImpl(StringView pattern, size_t numArgs, const QtPriv
switch (part.tag) { switch (part.tag) {
case QtPrivate::ArgBase::L1: case QtPrivate::ArgBase::L1:
if (part.size) { if (part.size) {
qt_from_latin1(reinterpret_cast<ushort*>(out), qt_from_latin1(reinterpret_cast<char16_t*>(out),
reinterpret_cast<const char*>(part.data), part.size); reinterpret_cast<const char*>(part.data), part.size);
} }
break; break;
@ -12144,7 +12149,7 @@ qsizetype QtPrivate::findString(QStringView haystack, qsizetype from, QLatin1Str
if (haystack.size() < needle.size()) if (haystack.size() < needle.size())
return -1; return -1;
QVarLengthArray<ushort> s(needle.size()); QVarLengthArray<char16_t> s(needle.size());
qt_from_latin1(s.data(), needle.latin1(), needle.size()); qt_from_latin1(s.data(), needle.latin1(), needle.size());
return QtPrivate::findString(haystack, from, QStringView(reinterpret_cast<const QChar*>(s.constData()), s.size()), cs); return QtPrivate::findString(haystack, from, QStringView(reinterpret_cast<const QChar*>(s.constData()), s.size()), cs);
} }
@ -12154,7 +12159,7 @@ qsizetype QtPrivate::findString(QLatin1String haystack, qsizetype from, QStringV
if (haystack.size() < needle.size()) if (haystack.size() < needle.size())
return -1; return -1;
QVarLengthArray<ushort> s(haystack.size()); QVarLengthArray<char16_t> s(haystack.size());
qt_from_latin1(s.data(), haystack.latin1(), haystack.size()); qt_from_latin1(s.data(), haystack.latin1(), haystack.size());
return QtPrivate::findString(QStringView(reinterpret_cast<const QChar*>(s.constData()), s.size()), from, needle, cs); return QtPrivate::findString(QStringView(reinterpret_cast<const QChar*>(s.constData()), s.size()), from, needle, cs);
} }
@ -12164,9 +12169,9 @@ qsizetype QtPrivate::findString(QLatin1String haystack, qsizetype from, QLatin1S
if (haystack.size() < needle.size()) if (haystack.size() < needle.size())
return -1; return -1;
QVarLengthArray<ushort> h(haystack.size()); QVarLengthArray<char16_t> h(haystack.size());
qt_from_latin1(h.data(), haystack.latin1(), haystack.size()); qt_from_latin1(h.data(), haystack.latin1(), haystack.size());
QVarLengthArray<ushort> n(needle.size()); QVarLengthArray<char16_t> n(needle.size());
qt_from_latin1(n.data(), needle.latin1(), needle.size()); qt_from_latin1(n.data(), needle.latin1(), needle.size());
return QtPrivate::findString(QStringView(reinterpret_cast<const QChar*>(h.constData()), h.size()), from, return QtPrivate::findString(QStringView(reinterpret_cast<const QChar*>(h.constData()), h.size()), from,
QStringView(reinterpret_cast<const QChar*>(n.constData()), n.size()), cs); QStringView(reinterpret_cast<const QChar*>(n.constData()), n.size()), cs);
@ -12631,7 +12636,7 @@ QString QString::toHtmlEscaped() const
*/ */
void QAbstractConcatenable::appendLatin1To(const char *a, int len, QChar *out) noexcept void QAbstractConcatenable::appendLatin1To(const char *a, int len, QChar *out) noexcept
{ {
qt_from_latin1(reinterpret_cast<ushort *>(out), a, uint(len)); qt_from_latin1(reinterpret_cast<char16_t *>(out), a, uint(len));
} }
QT_END_NAMESPACE QT_END_NAMESPACE