about summary refs log tree commit diff
path: root/src/engine/shared/ringbuffer.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/shared/ringbuffer.h')
-rw-r--r--src/engine/shared/ringbuffer.h66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/engine/shared/ringbuffer.h b/src/engine/shared/ringbuffer.h
new file mode 100644
index 00000000..aa02b8d9
--- /dev/null
+++ b/src/engine/shared/ringbuffer.h
@@ -0,0 +1,66 @@
+#ifndef ENGINE_SHARED_RINGBUFFER_H
+#define ENGINE_SHARED_RINGBUFFER_H
+
+typedef struct RINGBUFFER RINGBUFFER;
+
+class CRingBufferBase
+{
+	class CItem
+	{
+	public:
+		CItem *m_pPrev;
+		CItem *m_pNext;
+		int m_Free;
+		int m_Size;
+	};
+	
+	CItem *m_pProduce;
+	CItem *m_pConsume;
+	
+	CItem *m_pFirst;
+	CItem *m_pLast;
+	
+	void *m_pMemory;
+	int m_Size;
+	int m_Flags;
+	
+	CItem *NextBlock(CItem *pItem);
+	CItem *PrevBlock(CItem *pItem);
+	CItem *MergeBack(CItem *pItem);
+protected:
+	void *Allocate(int Size);
+	
+	void *Prev(void *pCurrent);
+	void *Next(void *pCurrent);
+	void *First();
+	void *Last();
+	
+	void Init(void *pMemory, int Size, int Flags);
+	int PopFirst();
+public:
+	enum
+	{
+		// Will start to destroy items to try to fit the next one
+		FLAG_RECYCLE=1
+	};
+};
+
+template<typename T, int TSIZE, int TFLAGS=0>
+class TStaticRingBuffer : public CRingBufferBase
+{
+	unsigned char m_aBuffer[TSIZE];
+public:
+	TStaticRingBuffer() { Init(); }
+	
+	void Init() { CRingBufferBase::Init(m_aBuffer, TSIZE, TFLAGS); }
+	
+	T *Allocate(int Size) { return (T*)CRingBufferBase::Allocate(Size); }
+	int PopFirst() { return CRingBufferBase::PopFirst(); }
+
+	T *Prev(T *pCurrent) { return (T*)CRingBufferBase::Prev(pCurrent); }
+	T *Next(T *pCurrent) { return (T*)CRingBufferBase::Next(pCurrent); }
+	T *First() { return (T*)CRingBufferBase::First(); }
+	T *Last() { return (T*)CRingBufferBase::Last(); }
+};
+
+#endif