diff options
author | Marc Mutz <marc.mutz@qt.io> | 2021-12-13 12:03:51 +0100 |
---|---|---|
committer | Marc Mutz <marc.mutz@qt.io> | 2021-12-15 18:36:00 +0000 |
commit | 758a830f7ef23ebea542bc6dad4490b29e22bab8 (patch) | |
tree | 84211dc469328fa6118f859638e04f9e8d974ef8 /src | |
parent | 63a35898f4990963fe91acd565df49111a281fa4 (diff) |
QRingBuffer: overload append() for rvalues
The majority of append() callers in QtBase pass rvalues, so overload
append() to avoid the need for manipulating QBA's atomic ref counts.
Also adjust a caller that could pass by rvalue, but didn't, to do so.
Pick-to: 6.3
Change-Id: I3d9e60b0d04ef837bfdc526e1f0f691a151006f9
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>
Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/tools/qringbuffer.cpp | 15 | ||||
-rw-r--r-- | src/corelib/tools/qringbuffer_p.h | 11 | ||||
-rw-r--r-- | src/network/socket/qsocks5socketengine.cpp | 2 |
3 files changed, 27 insertions, 1 deletions
diff --git a/src/corelib/tools/qringbuffer.cpp b/src/corelib/tools/qringbuffer.cpp index 09b0336145..d46dcdffdf 100644 --- a/src/corelib/tools/qringbuffer.cpp +++ b/src/corelib/tools/qringbuffer.cpp @@ -363,6 +363,21 @@ void QRingBuffer::append(const QByteArray &qba) bufferSize += qba.size(); } +/*! + \internal + + Append a new buffer to the end +*/ +void QRingBuffer::append(QByteArray &&qba) +{ + const auto qbaSize = qba.size(); + if (bufferSize != 0 || buffers.isEmpty()) + buffers.emplace_back(std::move(qba)); + else + buffers.last().assign(std::move(qba)); + bufferSize += qbaSize; +} + qint64 QRingBuffer::readLine(char *data, qint64 maxLength) { Q_ASSERT(data != nullptr && maxLength > 1); diff --git a/src/corelib/tools/qringbuffer_p.h b/src/corelib/tools/qringbuffer_p.h index 65952f8ac7..0f5ce04c83 100644 --- a/src/corelib/tools/qringbuffer_p.h +++ b/src/corelib/tools/qringbuffer_p.h @@ -81,6 +81,10 @@ public: chunk(qba), headOffset(0), tailOffset(qba.size()) { } + explicit QRingChunk(QByteArray &&qba) noexcept : + chunk(std::move(qba)), headOffset(0), tailOffset(chunk.size()) + { + } inline QRingChunk &operator=(const QRingChunk &other) noexcept { @@ -161,6 +165,12 @@ public: headOffset = 0; tailOffset = qba.size(); } + void assign(QByteArray &&qba) + { + chunk = std::move(qba); + headOffset = 0; + tailOffset = chunk.size(); + } inline void reset() { headOffset = tailOffset = 0; @@ -248,6 +258,7 @@ public: Q_CORE_EXPORT qint64 peek(char *data, qint64 maxLength, qint64 pos = 0) const; Q_CORE_EXPORT void append(const char *data, qint64 size); Q_CORE_EXPORT void append(const QByteArray &qba); + Q_CORE_EXPORT void append(QByteArray &&qba); inline qint64 skip(qint64 length) { qint64 bytesToSkip = qMin(length, bufferSize); diff --git a/src/network/socket/qsocks5socketengine.cpp b/src/network/socket/qsocks5socketengine.cpp index 884199581f..3708ce9df2 100644 --- a/src/network/socket/qsocks5socketengine.cpp +++ b/src/network/socket/qsocks5socketengine.cpp @@ -1190,7 +1190,7 @@ void QSocks5SocketEnginePrivate::_q_controlSocketReadNotification() } if (buf.size()) { QSOCKS5_DEBUG << dump(buf); - connectData->readBuffer.append(buf); + connectData->readBuffer.append(std::move(buf)); emitReadNotification(); } break; |