diff options
| author | Tom Englund <tomenglund26@gmail.com> | 2026-01-31 14:35:39 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-01-31 13:35:39 +0000 |
| commit | 4330b49a84f527a52d1e7723ef42b459de58b8ae (patch) | |
| tree | 681ed5f0b7fbfab5f4f143b357b2e360db4f2c5f | |
| parent | 2ad7f6edd4e44f2eb8878361bf4ef5a7eb3b91b1 (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.cpp | 17 | ||||
| -rw-r--r-- | src/protocols/types/Buffer.hpp | 3 |
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; |
