diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/connection.h | 4 | ||||
-rw-r--r-- | src/utility.h | 54 |
2 files changed, 50 insertions, 8 deletions
diff --git a/src/connection.h b/src/connection.h index 570bc92ab..dc61394fa 100644 --- a/src/connection.h +++ b/src/connection.h @@ -430,7 +430,7 @@ struct ConnectionEvent { enum ConnectionEventType type; u16 peer_id; - SharedBuffer<u8> data; + Buffer<u8> data; bool timeout; Address address; @@ -489,7 +489,7 @@ struct ConnectionCommand Address address; u16 peer_id; u8 channelnum; - SharedBuffer<u8> data; + Buffer<u8> data; bool reliable; ConnectionCommand(): type(CONNCMD_NONE) {} diff --git a/src/utility.h b/src/utility.h index f89574468..98fa83e89 100644 --- a/src/utility.h +++ b/src/utility.h @@ -343,26 +343,59 @@ template <typename T> class Buffer { public: + Buffer() + { + m_size = 0; + data = NULL; + } Buffer(unsigned int size) { m_size = size; - data = new T[size]; + if(size != 0) + data = new T[size]; + else + data = NULL; } Buffer(const Buffer &buffer) { m_size = buffer.m_size; - data = new T[buffer.m_size]; - memcpy(data, buffer.data, buffer.m_size); + if(m_size != 0) + { + data = new T[buffer.m_size]; + memcpy(data, buffer.data, buffer.m_size); + } + else + data = NULL; } Buffer(T *t, unsigned int size) { m_size = size; - data = new T[size]; - memcpy(data, t, size); + if(size != 0) + { + data = new T[size]; + memcpy(data, t, size); + } + else + data = NULL; } ~Buffer() { - delete[] data; + drop(); + } + Buffer& operator=(const Buffer &buffer) + { + if(this == &buffer) + return *this; + drop(); + m_size = buffer.m_size; + if(m_size != 0) + { + data = new T[buffer.m_size]; + memcpy(data, buffer.data, buffer.m_size); + } + else + data = NULL; + return *this; } T & operator[](unsigned int i) const { @@ -377,6 +410,11 @@ public: return m_size; } private: + void drop() + { + if(data) + delete[] data; + } T *data; unsigned int m_size; }; @@ -471,6 +509,10 @@ public: { return m_size; } + operator Buffer<T>() const + { + return Buffer<T>(data, m_size); + } private: void drop() { |