]> git.lizzy.rs Git - minetest.git/blobdiff - src/util/pointer.h
numeric: Fix clang, broken since d5456da
[minetest.git] / src / util / pointer.h
index f656833328f716a57aefd8d36fb80ded147ec94b..d29ec87399b0ada78530401e61c2b55dfeb1a124 100644 (file)
@@ -17,87 +17,12 @@ 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>
 
-template <typename T>
-class SharedPtr
-{
-public:
-       SharedPtr(T *t=NULL)
-       {
-               refcount = new int;
-               *refcount = 1;
-               ptr = t;
-       }
-       SharedPtr(SharedPtr<T> &t)
-       {
-               //*this = t;
-               drop();
-               refcount = t.refcount;
-               (*refcount)++;
-               ptr = t.ptr;
-       }
-       ~SharedPtr()
-       {
-               drop();
-       }
-       SharedPtr<T> & operator=(T *t)
-       {
-               drop();
-               refcount = new int;
-               *refcount = 1;
-               ptr = t;
-               return *this;
-       }
-       SharedPtr<T> & operator=(SharedPtr<T> &t)
-       {
-               drop();
-               refcount = t.refcount;
-               (*refcount)++;
-               ptr = t.ptr;
-               return *this;
-       }
-       T* operator->()
-       {
-               return ptr;
-       }
-       T & operator*()
-       {
-               return *ptr;
-       }
-       bool operator!=(T *t)
-       {
-               return ptr != t;
-       }
-       bool operator==(T *t)
-       {
-               return ptr == t;
-       }
-       T & operator[](unsigned int i)
-       {
-               return ptr[i];
-       }
-private:
-       void drop()
-       {
-               assert((*refcount) > 0);
-               (*refcount)--;
-               if(*refcount == 0)
-               {
-                       delete refcount;
-                       if(ptr != NULL)
-                               delete ptr;
-               }
-       }
-       T *ptr;
-       int *refcount;
-};
-
 template <typename T>
 class Buffer
 {
@@ -171,13 +96,19 @@ class Buffer
 private:
        void drop()
        {
-               if(data)
-                       delete[] data;
+               delete[] data;
        }
        T *data;
        unsigned int m_size;
 };
 
+/************************************************
+ *           !!!  W A R N I N G  !!!            *
+ *                                              *
+ * This smart pointer class is NOT thread safe. *
+ * ONLY use in a single-threaded context!       *
+ *                                              *
+ ************************************************/
 template <typename T>
 class SharedBuffer
 {
@@ -197,11 +128,11 @@ class SharedBuffer
                else
                        data = NULL;
                refcount = new unsigned int;
+               memset(data,0,sizeof(T)*m_size);
                (*refcount) = 1;
        }
        SharedBuffer(const SharedBuffer &buffer)
        {
-               //std::cout<<"SharedBuffer(const SharedBuffer &buffer)"<<std::endl;
                m_size = buffer.m_size;
                data = buffer.data;
                refcount = buffer.refcount;
@@ -209,7 +140,6 @@ class SharedBuffer
        }
        SharedBuffer & operator=(const SharedBuffer & buffer)
        {
-               //std::cout<<"SharedBuffer & operator=(const SharedBuffer & buffer)"<<std::endl;
                if(this == &buffer)
                        return *this;
                drop();
@@ -241,10 +171,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;
@@ -257,7 +186,7 @@ class SharedBuffer
        }
        T & operator[](unsigned int i) const
        {
-               //assert(i < m_size)
+               assert(i < m_size);
                return data[i];
        }
        T * operator*() const
@@ -279,8 +208,7 @@ class SharedBuffer
                (*refcount)--;
                if(*refcount == 0)
                {
-                       if(data)
-                               delete[] data;
+                       delete[] data;
                        delete refcount;
                }
        }
@@ -288,12 +216,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
-