diff --git a/include/buffer.h b/include/buffer.h index 6f79e98fc5b6c64b1ab39bd548b3d97b32873727..2f401be849b767bc6a6272be438c91c83036d31a 100644 --- a/include/buffer.h +++ b/include/buffer.h @@ -15,6 +15,7 @@ public: buffer(const size_t required_size, const MemType mem); // Done buffer(const buffer& other); // Done buffer(buffer&& other) noexcept; // Done + void swap(buffer& other) noexcept; ~buffer(); // Done bool is_available() const; // Done diff --git a/src/buffer.cpp b/src/buffer.cpp index 572da6196725bd84e40b92d8273da08ce3147b54..8e2a7c31355ad8225db852c95f97132013be895d 100644 --- a/src/buffer.cpp +++ b/src/buffer.cpp @@ -55,7 +55,7 @@ buffer::buffer(const buffer& other) } buffer::buffer(buffer&& other) noexcept : - mem(other.mem), ptr(std::move(other.ptr)), allocated_size(other.allocated_size), + mem(other.mem), ptr(other.ptr), allocated_size(other.allocated_size), scalar_size(other.scalar_size), is_free(other.is_free), id(other.id) { @@ -84,6 +84,23 @@ buffer& buffer::operator=(const buffer& other) return *this; } +void buffer::swap(buffer& other) noexcept +{ + std::swap(ptr, other.ptr); + mem = other.mem; + allocated_size = other.allocated_size; + scalar_size = other.scalar_size; + is_free = other.is_free; + id = other.id; + + other.ptr = nullptr; + other.allocated_size = 0; + other.scalar_size = 0; + other.is_free = false; + other.id = -1; + other.mem = MemType::UNDEF; +} + buffer& buffer::operator=(buffer&& other) noexcept { if (this != &other) @@ -91,19 +108,8 @@ buffer& buffer::operator=(buffer&& other) noexcept assert(other.mem != MemType::UNDEF); deallocate(); - mem = other.mem; - ptr = std::move(other.ptr); - allocated_size = other.allocated_size; - scalar_size = other.scalar_size; - is_free = other.is_free; - id = other.id; - - other.ptr = nullptr; - other.allocated_size = 0; - other.scalar_size = 0; - other.is_free = false; - other.id = -1; - other.mem = MemType::UNDEF; + buffer temp{std::move(other)}; + swap(temp); } return *this;