QByteArray: optimize replace(char, char)
Write every byte only once.
Amends 83c2c50554 (as well as the start
of the public history).
Task-number: QTBUG-106185
Change-Id: I883b2f00c754806882131a09dc3cbc5613420151
Reviewed-by: Anton Kudryavtsev <antkudr@mail.ru>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
(cherry picked from commit 2753924fcbeb29fa5b34782bd6ad6ed4fe4b51f1)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
(cherry picked from commit a5bafadf8e7d6d8ffd1c3e23747b8761a1f8eef9)
bb10
parent
c46ac58ea3
commit
7e53636c5c
|
|
@ -2626,8 +2626,18 @@ QByteArray &QByteArray::replace(char before, char after)
|
|||
{
|
||||
if (before != after) {
|
||||
if (const auto pos = indexOf(before); pos >= 0) {
|
||||
const auto detachedData = data();
|
||||
std::replace(detachedData + pos, detachedData + size(), before, after);
|
||||
if (d.needsDetach()) {
|
||||
QByteArray tmp(size(), Qt::Uninitialized);
|
||||
auto dst = tmp.d.data();
|
||||
dst = std::copy(d.data(), d.data() + pos, dst);
|
||||
*dst++ = after;
|
||||
std::replace_copy(d.data() + pos + 1, d.end(), dst, before, after);
|
||||
swap(tmp);
|
||||
} else {
|
||||
// in-place
|
||||
d.data()[pos] = after;
|
||||
std::replace(d.data() + pos + 1, d.end(), before, after);
|
||||
}
|
||||
}
|
||||
}
|
||||
return *this;
|
||||
|
|
|
|||
Loading…
Reference in New Issue