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
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;
else
data = NULL;
}
+
~Buffer()
{
drop();
}
- Buffer& operator=(const Buffer &buffer)
+
+ Buffer& operator=(Buffer &&buffer)
{
if(this == &buffer)
return *this;
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];
{
return data;
}
+
unsigned int getSize() const
{
return m_size;
}
+
private:
void drop()
{
/************************************************
* !!! 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! *
}
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;
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
-