summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Englund <tomenglund26@gmail.com>2026-01-31 14:35:39 +0100
committerGitHub <noreply@github.com>2026-01-31 13:35:39 +0000
commit4330b49a84f527a52d1e7723ef42b459de58b8ae (patch)
tree681ed5f0b7fbfab5f4f143b357b2e360db4f2c5f
parent2ad7f6edd4e44f2eb8878361bf4ef5a7eb3b91b1 (diff)
buffer: add move constructor and operator to CHLBufferReference (#13157)
add missing move constructor and operator, a lot of churn was done on always copying CHLBufferReference, also add a self copy check.
-rw-r--r--src/protocols/types/Buffer.cpp17
-rw-r--r--src/protocols/types/Buffer.hpp3
2 files changed, 20 insertions, 0 deletions
diff --git a/src/protocols/types/Buffer.cpp b/src/protocols/types/Buffer.cpp
index ad19cb32..93bd5d20 100644
--- a/src/protocols/types/Buffer.cpp
+++ b/src/protocols/types/Buffer.cpp
@@ -59,6 +59,10 @@ CHLBufferReference::CHLBufferReference(const CHLBufferReference& other) : m_buff
m_buffer->lock();
}
+CHLBufferReference::CHLBufferReference(CHLBufferReference&& other) noexcept : m_buffer(std::move(other.m_buffer)) {
+ ;
+}
+
CHLBufferReference::CHLBufferReference(SP<IHLBuffer> buffer_) : m_buffer(buffer_) {
if (m_buffer)
m_buffer->lock();
@@ -70,6 +74,9 @@ CHLBufferReference::~CHLBufferReference() {
}
CHLBufferReference& CHLBufferReference::operator=(const CHLBufferReference& other) {
+ if (m_buffer == other.m_buffer)
+ return *this; // same buffer, do nothing
+
if (other.m_buffer)
other.m_buffer->lock();
if (m_buffer)
@@ -78,6 +85,16 @@ CHLBufferReference& CHLBufferReference::operator=(const CHLBufferReference& othe
return *this;
}
+CHLBufferReference& CHLBufferReference::operator=(CHLBufferReference&& other) {
+ if (this != &other) {
+ if (m_buffer)
+ m_buffer->unlock();
+ m_buffer = other.m_buffer;
+ other.m_buffer = nullptr;
+ }
+ return *this;
+}
+
bool CHLBufferReference::operator==(const CHLBufferReference& other) const {
return m_buffer == other.m_buffer;
}
diff --git a/src/protocols/types/Buffer.hpp b/src/protocols/types/Buffer.hpp
index f85670ef..bda44ebc 100644
--- a/src/protocols/types/Buffer.hpp
+++ b/src/protocols/types/Buffer.hpp
@@ -49,10 +49,13 @@ class CHLBufferReference {
public:
CHLBufferReference();
CHLBufferReference(const CHLBufferReference& other);
+ CHLBufferReference(CHLBufferReference&& other) noexcept;
CHLBufferReference(SP<IHLBuffer> buffer);
~CHLBufferReference();
CHLBufferReference& operator=(const CHLBufferReference& other);
+ CHLBufferReference& operator=(CHLBufferReference&& other);
+
bool operator==(const CHLBufferReference& other) const;
bool operator==(const SP<IHLBuffer>& other) const;
bool operator==(const SP<Aquamarine::IBuffer>& other) const;