From 2753924fcbeb29fa5b34782bd6ad6ed4fe4b51f1 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Thu, 13 Feb 2025 16:09:20 +0100 Subject: [PATCH] QByteArray: optimize replace(char, char) Write every byte only once. Amends 83c2c5055405f09043c35b93cd5ba9b9969f3174 (as well as the start of the public history). Pick-to: 6.9 6.8 Task-number: QTBUG-106185 Change-Id: I883b2f00c754806882131a09dc3cbc5613420151 Reviewed-by: Anton Kudryavtsev Reviewed-by: Edward Welbourne --- src/corelib/text/qbytearray.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/corelib/text/qbytearray.cpp b/src/corelib/text/qbytearray.cpp index 2cc55ef0138..382f08200cc 100644 --- a/src/corelib/text/qbytearray.cpp +++ b/src/corelib/text/qbytearray.cpp @@ -2651,8 +2651,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;