Index: src/libchcore/TOrderedBufferQueue.h =================================================================== diff -u -N -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 +#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 - { 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; + + BufferCollection m_setBuffers; + TEvent m_eventHasBuffers; + unsigned long long m_ullExpectedBufferPosition = NoPosition; }; + + using TOrderedBufferQueuePtr = std::shared_ptr; } #endif