From 28660b4c1af1b1b6ac2d3fda6984bda2a1199dc1 Mon Sep 17 00:00:00 2001
From: Kahrl <kahrl@gmx.net>
Date: Mon, 7 Nov 2011 02:24:44 +0100
Subject: [PATCH] utility.h: Change Buffer's interface to be more compatible
 with SharedBuffer's interface, connection.h: use Buffer instead of
 SharedBuffer in command and event queues

---
 src/connection.h |  4 ++--
 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 @@ class Buffer
 		return m_size;
 	}
 private:
+	void drop()
+	{
+		if(data)
+			delete[] data;
+	}
 	T *data;
 	unsigned int m_size;
 };
@@ -471,6 +509,10 @@ class SharedBuffer
 	{
 		return m_size;
 	}
+	operator Buffer<T>() const
+	{
+		return Buffer<T>(data, m_size);
+	}
 private:
 	void drop()
 	{
-- 
GitLab