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
{
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
{
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;
}
SharedBuffer & operator=(const SharedBuffer & buffer)
{
- //std::cout<<"SharedBuffer & operator=(const SharedBuffer & buffer)"<<std::endl;
if(this == &buffer)
return *this;
drop();
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;
}
T & operator[](unsigned int i) const
{
- //assert(i < m_size)
+ assert(i < m_size);
return data[i];
}
T * operator*() const
(*refcount)--;
if(*refcount == 0)
{
- if(data)
- delete[] data;
+ delete[] data;
delete refcount;
}
}
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
-