Qstring: replace index-based loops with range-for / STL algorithms

Change-Id: I1082a8245d219697676c59e77ce9939641e73451
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Ahmad Samir 2022-09-20 20:13:09 +02:00
parent f2b4adebd4
commit b6db79d82f

View File

@ -128,6 +128,12 @@ char16_t valueTypeToUtf16<char>(char t)
return char16_t{uchar(t)}; return char16_t{uchar(t)};
} }
template <typename T>
static inline bool foldAndCompare(const T a, const T b)
{
return foldCase(a) == b;
}
/*! /*!
\internal \internal
@ -153,10 +159,9 @@ static inline qsizetype qFindChar(QStringView str, QChar ch, qsizetype from, Qt:
return n - s; return n - s;
} else { } else {
c = foldCase(c); c = foldCase(c);
--n; auto it = std::find_if(n, e, [c](const auto &ch) { return foldAndCompare(ch, c); });
while (++n != e) if (it != e)
if (foldCase(*n) == c) return std::distance(s, it);
return n - s;
} }
} }
return -1; return -1;
@ -509,12 +514,7 @@ const char16_t *QtPrivate::qustrchr(QStringView str, char16_t c) noexcept
} }
#endif // aarch64 #endif // aarch64
--n; return std::find(n, e, c);
while (++n != e)
if (*n == c)
return n;
return n;
} }
#ifdef __SSE2__ #ifdef __SSE2__
@ -2562,11 +2562,10 @@ QString::QString(qsizetype size, QChar ch)
d = DataPointer(Data::allocate(size), size); d = DataPointer(Data::allocate(size), size);
Q_CHECK_PTR(d.data()); Q_CHECK_PTR(d.data());
d.data()[size] = '\0'; d.data()[size] = '\0';
char16_t *i = d.data() + size;
char16_t *b = d.data(); char16_t *b = d.data();
char16_t *e = d.data() + size;
const char16_t value = ch.unicode(); const char16_t value = ch.unicode();
while (i != b) std::fill(b, e, value);
*--i = value;
} }
} }
@ -3728,18 +3727,16 @@ QString& QString::replace(QChar before, QChar after, Qt::CaseSensitivity cs)
char16_t *const e = i + d.size; char16_t *const e = i + d.size;
i += idx; i += idx;
*i = a; *i = a;
++i;
if (cs == Qt::CaseSensitive) { if (cs == Qt::CaseSensitive) {
const char16_t b = before.unicode(); const char16_t toReplace = before.unicode();
while (++i != e) { std::replace(i, e, toReplace, a);
if (*i == b)
*i = a;
}
} else { } else {
const char16_t b = foldCase(before.unicode()); const char16_t toReplace = foldCase(before.unicode());
while (++i != e) { auto match = [toReplace](const char16_t c) {
if (foldCase(*i) == b) return foldAndCompare(c, toReplace);
*i = a; };
} std::replace_if(i, e, match, a);
} }
} }
} }
@ -6002,8 +5999,7 @@ QString& QString::fill(QChar ch, qsizetype size)
if (d.size) { if (d.size) {
QChar *i = (QChar*)d.data() + d.size; QChar *i = (QChar*)d.data() + d.size;
QChar *b = (QChar*)d.data(); QChar *b = (QChar*)d.data();
while (i != b) std::fill(b, i, ch);
*--i = ch;
} }
return *this; return *this;
} }
@ -7924,8 +7920,7 @@ void qt_string_normalize(QString *data, QString::NormalizationForm mode, QChar::
} else if (int(version) <= NormalizationCorrectionsVersionMax) { } else if (int(version) <= NormalizationCorrectionsVersionMax) {
const QString &s = *data; const QString &s = *data;
QChar *d = nullptr; QChar *d = nullptr;
for (int i = 0; i < NumNormalizationCorrections; ++i) { for (const NormalizationCorrection &n : uc_normalization_corrections) {
const NormalizationCorrection &n = uc_normalization_corrections[i];
if (n.version > version) { if (n.version > version) {
qsizetype pos = from; qsizetype pos = from;
if (QChar::requiresSurrogates(n.ucs4)) { if (QChar::requiresSurrogates(n.ucs4)) {
@ -8149,16 +8144,14 @@ static QString replaceArgEscapes(QStringView s, const ArgEscapeData &d, qsizetyp
// (If negative, relevant loops are no-ops: no need to check.) // (If negative, relevant loops are no-ops: no need to check.)
if (field_width > 0) { // left padded if (field_width > 0) { // left padded
for (qsizetype i = 0; i < pad_chars; ++i) rc = std::fill_n(rc, pad_chars, fillChar);
*rc++ = fillChar;
} }
memcpy(rc, use.data(), use.length() * sizeof(QChar)); memcpy(rc, use.data(), use.length() * sizeof(QChar));
rc += use.length(); rc += use.length();
if (field_width < 0) { // right padded if (field_width < 0) { // right padded
for (qsizetype i = 0; i < pad_chars; ++i) rc = std::fill_n(rc, pad_chars, fillChar);
*rc++ = fillChar;
} }
if (++repl_cnt == d.occurrences) { if (++repl_cnt == d.occurrences) {
@ -8708,7 +8701,7 @@ static ArgIndexToPlaceholderMap makeArgIndexToPlaceholderMap(const ParseResult &
{ {
ArgIndexToPlaceholderMap result; ArgIndexToPlaceholderMap result;
for (Part part : parts) { for (const Part &part : parts) {
if (part.number >= 0) if (part.number >= 0)
result.push_back(part.number); result.push_back(part.number);
} }
@ -8774,7 +8767,7 @@ static QString argToQStringImpl(StringView pattern, size_t numArgs, const QtPriv
QString result(totalSize, Qt::Uninitialized); QString result(totalSize, Qt::Uninitialized);
auto out = const_cast<QChar*>(result.constData()); auto out = const_cast<QChar*>(result.constData());
for (Part part : parts) { for (const Part &part : parts) {
switch (part.tag) { switch (part.tag) {
case QtPrivate::ArgBase::L1: case QtPrivate::ArgBase::L1:
if (part.size) { if (part.size) {
@ -10479,22 +10472,14 @@ qsizetype QtPrivate::count(QStringView haystack, QStringView needle, Qt::CaseSen
return num; return num;
} }
qsizetype QtPrivate::count(QStringView haystack, QChar ch, Qt::CaseSensitivity cs) noexcept qsizetype QtPrivate::count(QStringView haystack, QChar needle, Qt::CaseSensitivity cs) noexcept
{ {
qsizetype num = 0; if (cs == Qt::CaseSensitive)
if (cs == Qt::CaseSensitive) { return std::count(haystack.cbegin(), haystack.cend(), needle);
for (QChar c : haystack) {
if (c == ch) needle = foldCase(needle);
++num; return std::count_if(haystack.cbegin(), haystack.cend(),
} [needle](const QChar c) { return foldAndCompare(c, needle); });
} else {
ch = foldCase(ch);
for (QChar c : haystack) {
if (foldCase(c) == ch)
++num;
}
}
return num;
} }
qsizetype QtPrivate::count(QLatin1StringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs) qsizetype QtPrivate::count(QLatin1StringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs)
@ -10559,22 +10544,16 @@ qsizetype QtPrivate::count(QLatin1StringView haystack, QChar needle, Qt::CaseSen
if (needle.unicode() > 0xff) if (needle.unicode() > 0xff)
return 0; return 0;
qsizetype num = 0; const char needleL1 = needle.toLatin1();
if (cs == Qt::CaseSensitive) { if (cs == Qt::CaseSensitive) {
const char needleL1 = needle.toLatin1(); return std::count(haystack.cbegin(), haystack.cend(), needleL1);
for (char c : haystack) {
if (c == needleL1)
++num;
}
} else { } else {
auto toLower = [](char ch) { return latin1Lower[uchar(ch)]; }; auto toLower = [](char ch) { return latin1Lower[uchar(ch)]; };
const uchar ch = toLower(needle.toLatin1()); const uchar ch = toLower(needleL1);
for (char c : haystack) { return std::count_if(haystack.cbegin(), haystack.cend(), [&toLower, ch](const char c) {
if (toLower(c) == ch) return toLower(c) == ch;
++num; });
}
} }
return num;
} }
/*! /*!