Index: src/libchcore/TOrderedBufferQueue.h
===================================================================
diff -u -r1506d51ff1c0a5d156dab398051efc0c87473e81 -r3ccbdb8d3eac3427e6d3354854476e57fdc7ceb9
--- src/libchcore/TOrderedBufferQueue.h	(.../TOrderedBufferQueue.h)	(revision 1506d51ff1c0a5d156dab398051efc0c87473e81)
+++ src/libchcore/TOrderedBufferQueue.h	(.../TOrderedBufferQueue.h)	(revision 3ccbdb8d3eac3427e6d3354854476e57fdc7ceb9)
@@ -19,31 +19,45 @@
 #ifndef __TORDEREDBUFFERQUEUE_H__
 #define __TORDEREDBUFFERQUEUE_H__
 
-#include "libchcore.h"
 #include <set>
+#include "TEvent.h"
+#include "TOverlappedDataBuffer.h"
 
 namespace chcore
 {
-	class TOverlappedDataBuffer;
-
-	struct CompareBufferPositions
+	class TOrderedBufferQueue
 	{
-		bool operator()(const TOverlappedDataBuffer* rBufferA, const TOverlappedDataBuffer* rBufferB) const;
-	};
+	public:
+		static const unsigned long long NoPosition = 0xffffffffffffffff;
 
-	class TOrderedBufferQueue : public std::set<TOverlappedDataBuffer*, CompareBufferPositions>
-	{
 	public:
-		TOverlappedDataBuffer* pop_front()
-		{
-			if(empty())
-				throw std::runtime_error("Bounds exceeded in ordered buffer queue");
+		TOrderedBufferQueue();
+		TOrderedBufferQueue(unsigned long long ullExpectedPosition);
 
-			TOverlappedDataBuffer* pBuffer = *begin();
-			erase(begin());
-			return pBuffer;
-		}
+		void Push(TOverlappedDataBuffer* pBuffer);
+		TOverlappedDataBuffer* Pop();
+		const TOverlappedDataBuffer* const Peek() const;
+
+		void Clear();
+
+		size_t GetCount() const;
+		bool IsEmpty() const;
+
+		HANDLE GetHasBuffersEvent() const;
+
+	private:
+		bool IsBufferReady() const;
+		void UpdateHasBuffers();
+
+	private:
+		using BufferCollection = std::set<TOverlappedDataBuffer*, CompareBufferPositions>;
+
+		BufferCollection m_setBuffers;
+		TEvent m_eventHasBuffers;
+		unsigned long long m_ullExpectedBufferPosition = NoPosition;
 	};
+
+	using TOrderedBufferQueuePtr = std::shared_ptr<TOrderedBufferQueue>;
 }
 
 #endif