X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Futil%2Fpointer.h;h=245ac85bfbc028ab808e28ac5353053a331542f8;hb=c7bcebb62856ae5fdb23a13e6fa1052eae700ddf;hp=f68269882f22ccd1ce36fbb298292f0c5aaf5044;hpb=5cc8ad946efb3612eb6ea8655780b29fe4c62e19;p=minetest.git diff --git a/src/util/pointer.h b/src/util/pointer.h index f68269882..245ac85bf 100644 --- a/src/util/pointer.h +++ b/src/util/pointer.h @@ -17,12 +17,26 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef UTIL_POINTER_HEADER -#define UTIL_POINTER_HEADER +#pragma once -#include "../irrlichttypes.h" -#include "../debug.h" // For assert() +#include "irrlichttypes.h" +#include "debug.h" // For assert() #include +#include // std::shared_ptr + + +template class ConstSharedPtr { +public: + ConstSharedPtr(T *ptr) : ptr(ptr) {} + ConstSharedPtr(const std::shared_ptr &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 ptr; +}; template class Buffer @@ -41,17 +55,24 @@ class Buffer else data = NULL; } - Buffer(const Buffer &buffer) + + // Disable class copy + Buffer(const Buffer &) = delete; + Buffer &operator=(const Buffer &) = delete; + + Buffer(Buffer &&buffer) { m_size = buffer.m_size; if(m_size != 0) { - data = new T[buffer.m_size]; - memcpy(data, buffer.data, buffer.m_size); + data = buffer.data; + buffer.data = nullptr; + buffer.m_size = 0; } else - data = NULL; + data = nullptr; } + // Copies whole buffer Buffer(const T *t, unsigned int size) { m_size = size; @@ -63,11 +84,13 @@ class Buffer else data = NULL; } + ~Buffer() { drop(); } - Buffer& operator=(const Buffer &buffer) + + Buffer& operator=(Buffer &&buffer) { if(this == &buffer) return *this; @@ -75,13 +98,27 @@ class Buffer m_size = buffer.m_size; if(m_size != 0) { - data = new T[buffer.m_size]; - memcpy(data, buffer.data, buffer.m_size); + data = buffer.data; + buffer.data = nullptr; + buffer.m_size = 0; } else - data = NULL; + data = nullptr; 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]; @@ -90,10 +127,12 @@ class Buffer { return data; } + unsigned int getSize() const { return m_size; } + private: void drop() { @@ -105,7 +144,6 @@ class Buffer /************************************************ * !!! W A R N I N G !!! * - * !!! A C H T U N G !!! * * * * This smart pointer class is NOT thread safe. * * ONLY use in a single-threaded context! * @@ -135,7 +173,6 @@ class SharedBuffer } SharedBuffer(const SharedBuffer &buffer) { - //std::cout<<"SharedBuffer(const SharedBuffer &buffer)"< &buffer) { m_size = buffer.getSize(); - if(m_size != 0) - { - data = new T[m_size]; - memcpy(data, *buffer, buffer.getSize()); + if (m_size != 0) { + data = new T[m_size]; + memcpy(data, *buffer, buffer.getSize()); } else data = NULL; @@ -221,12 +256,3 @@ class SharedBuffer unsigned int m_size; unsigned int *refcount; }; - -inline SharedBuffer SharedBufferFromString(const char *string) -{ - SharedBuffer b((u8*)string, strlen(string)+1); - return b; -} - -#endif -