diff options
author | SmallJoker <SmallJoker@users.noreply.github.com> | 2021-12-01 20:22:33 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-01 20:22:33 +0100 |
commit | 57a59ae92d4bbfa4fdd60d7acd72c6440f63a49c (patch) | |
tree | 6efa0044d48f5e241540b412ef4c7fe63edec570 /src/util | |
parent | 1dc1305ada07da8c2a278b46a34d58af86184af9 (diff) | |
download | minetest-57a59ae92d4bbfa4fdd60d7acd72c6440f63a49c.tar.gz minetest-57a59ae92d4bbfa4fdd60d7acd72c6440f63a49c.tar.bz2 minetest-57a59ae92d4bbfa4fdd60d7acd72c6440f63a49c.zip |
Network: Delete copy constructor and use std::move instead (#11642)
This is a follow-up change which disables class copies where possible to avoid unnecessary memory movements.
Diffstat (limited to 'src/util')
-rw-r--r-- | src/util/pointer.h | 58 |
1 files changed, 32 insertions, 26 deletions
diff --git a/src/util/pointer.h b/src/util/pointer.h index 7fc5de551..245ac85bf 100644 --- a/src/util/pointer.h +++ b/src/util/pointer.h @@ -22,6 +22,21 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes.h" #include "debug.h" // For assert() #include <cstring> +#include <memory> // std::shared_ptr + + +template<typename T> class ConstSharedPtr { +public: + ConstSharedPtr(T *ptr) : ptr(ptr) {} + ConstSharedPtr(const std::shared_ptr<T> &ptr) : ptr(ptr) {} + + const T* get() const noexcept { return ptr.get(); } + const T& operator*() const noexcept { return *ptr.get(); } + const T* operator->() const noexcept { return ptr.get(); } + +private: + std::shared_ptr<T> ptr; +}; template <typename T> class Buffer @@ -40,17 +55,11 @@ public: else data = NULL; } - Buffer(const Buffer &buffer) - { - m_size = buffer.m_size; - if(m_size != 0) - { - data = new T[buffer.m_size]; - memcpy(data, buffer.data, buffer.m_size); - } - else - data = NULL; - } + + // Disable class copy + Buffer(const Buffer &) = delete; + Buffer &operator=(const Buffer &) = delete; + Buffer(Buffer &&buffer) { m_size = buffer.m_size; @@ -81,21 +90,6 @@ public: drop(); } - Buffer& operator=(const Buffer &buffer) - { - if(this == &buffer) - return *this; - drop(); - m_size = buffer.m_size; - if(m_size != 0) - { - data = new T[buffer.m_size]; - memcpy(data, buffer.data, buffer.m_size); - } - else - data = NULL; - return *this; - } Buffer& operator=(Buffer &&buffer) { if(this == &buffer) @@ -113,6 +107,18 @@ public: return *this; } + void copyTo(Buffer &buffer) const + { + buffer.drop(); + buffer.m_size = m_size; + if (m_size != 0) { + buffer.data = new T[m_size]; + memcpy(buffer.data, data, m_size); + } else { + buffer.data = nullptr; + } + } + T & operator[](unsigned int i) const { return data[i]; |