]> git.lizzy.rs Git - minetest.git/blobdiff - src/util/pointer.h
Initialize wield mesh colors when changing item. (#12254)
[minetest.git] / src / util / pointer.h
index f68269882f22ccd1ce36fbb298292f0c5aaf5044..245ac85bfbc028ab808e28ac5353053a331542f8 100644 (file)
@@ -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 <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
@@ -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)"<<std::endl;
                m_size = buffer.m_size;
                data = buffer.data;
                refcount = buffer.refcount;
@@ -143,7 +180,6 @@ class SharedBuffer
        }
        SharedBuffer & operator=(const SharedBuffer & buffer)
        {
-               //std::cout<<"SharedBuffer & operator=(const SharedBuffer & buffer)"<<std::endl;
                if(this == &buffer)
                        return *this;
                drop();
@@ -175,10 +211,9 @@ class SharedBuffer
        SharedBuffer(const Buffer<T> &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<u8> SharedBufferFromString(const char *string)
-{
-       SharedBuffer<u8> b((u8*)string, strlen(string)+1);
-       return b;
-}
-
-#endif
-