objwriter.h

changeset 26
54eaea6dc27c
parent 16
393359908179
child 27
15c06a191f9b
--- a/objwriter.h	Sun Jul 15 03:31:35 2012 +0300
+++ b/objwriter.h	Sun Jul 15 18:56:26 2012 +0300
@@ -42,14 +42,88 @@
 #define __OBJWRITER_H__
 
 #include <stdio.h>
+#include <typeinfo>
+#include <string.h>
 #include "common.h"
 #include "str.h"
 
+extern int g_CurMode;
+
+// ============================================================================
+// DataBuffer: A dynamic data buffer.
+class DataBuffer {
+public:
+	// The actual buffer
+	unsigned char* buffer;
+	
+	// How big is the buffer?
+	unsigned int bufsize;
+	
+	// Position in the buffer
+	unsigned int writepos;
+	unsigned int readpos;
+	
+	// METHODS
+	DataBuffer (unsigned int size=128) {
+		writepos = 0;
+		readpos = 0;
+		
+		buffer = new unsigned char[size];
+		bufsize = size;
+	}
+	
+	~DataBuffer () {
+		delete buffer;
+	}
+	
+	template<class T> void Write(T stuff) {
+		if (sizeof (char) != 1) {
+			error ("DataBuffer: sizeof(char) must be 1!\n");
+		}
+		
+		// Out of space, must resize
+		if (writepos + sizeof(T) >= bufsize) {
+			// First, store the old buffer temporarily
+			char* copy = new char[bufsize];
+			printf ("Resizing buffer: copy buffer to safety. %u bytes to copy\n", bufsize);
+			memcpy (copy, buffer, bufsize);
+			
+			// Remake the buffer with the new size.
+			// Have a bit of leeway so we don't have to
+			// resize immediately again.
+			size_t newsize = bufsize + sizeof (T) + 128;
+			delete buffer;
+			buffer = new unsigned char[newsize];
+			bufsize = newsize;
+			
+			// Now, copy the new stuff over.
+			memcpy (buffer, copy, bufsize);
+			
+			// Nuke the copy now as it's no longer needed
+			delete copy;
+		}
+		
+		// Write the new stuff one byte at a time
+		for (unsigned int x = 0; x < sizeof (T); x++) {
+			buffer[writepos] = CharByte<T> (stuff, x);
+			writepos++;
+		}
+	}
+
+	template<class T> T Read() {
+		T result = buffer[readpos];
+		readpos += sizeof (T);
+		return result;
+	}
+};
+
 class ObjWriter {
 public:
 	// ====================================================================
 	// MEMBERS
 	FILE* fp;
+	DataBuffer* OnEnterBuffer;
+	DataBuffer* MainLoopBuffer;
 	unsigned int numWrittenBytes;
 	
 	// ====================================================================
@@ -59,12 +133,19 @@
 	void WriteString (char* s);
 	void WriteString (const char* s);
 	void WriteString (str s);
+	void WriteBuffers ();
 	
 	template <class T> void Write (T stuff) {
+		// Mainloop and onenter are written into a separate buffer.
+		if (g_CurMode == MODE_MAINLOOP || g_CurMode == MODE_ONENTER) {
+			DataBuffer* buffer = (g_CurMode == MODE_MAINLOOP) ? MainLoopBuffer : OnEnterBuffer;
+			buffer->Write<T> (stuff);
+			return;
+		}
+		
 		fwrite (&stuff, sizeof (T), 1, fp);
 		numWrittenBytes += sizeof (T);
 	}
-	
 	// Cannot use default arguments in function templates..
 	void Write (qbyte stuff) {Write<qbyte> (stuff);}
 };

mercurial