QString: optimize remove(QChar, Qt::CaseSensitivity)

remove(int, int) with O(N) was used in a loop.
We had a quadratic complexity.

Use erase-remove idiom to fix it.

Change-Id: I643a2a75619ec5ea2bf99e48a25f64a7f69ba156
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
This commit is contained in:
Anton Kudryavtsev 2016-11-13 15:04:33 +03:00 committed by Anton Kudryavtsev
parent b5222307af
commit be94fc445a

View File

@ -2300,21 +2300,20 @@ QString &QString::remove(const QString &str, Qt::CaseSensitivity cs)
*/
QString &QString::remove(QChar ch, Qt::CaseSensitivity cs)
{
int i = 0;
ushort c = ch.unicode();
if (cs == Qt::CaseSensitive) {
while (i < d->size)
if (d->data()[i] == ch)
remove(i, 1);
else
i++;
} else {
c = foldCase(c);
while (i < d->size)
if (foldCase(d->data()[i]) == c)
remove(i, 1);
else
i++;
const int idx = indexOf(ch, 0, cs);
if (idx != -1) {
const auto first = begin(); // implicit detach()
auto last = end();
if (cs == Qt::CaseSensitive) {
last = std::remove(first + idx, last, ch);
} else {
const QChar c = ch.toCaseFolded();
auto caseInsensEqual = [c](QChar x) {
return c == x.toCaseFolded();
};
last = std::remove_if(first + idx, last, caseInsensEqual);
}
resize(last - first);
}
return *this;
}