#include "PreAllocBufferQueue.h" PreAllocBufferQueue::PreAllocBufferQueue(const PreAllocBufferQueue::Config& _cfg) : cfg(_cfg), mtsMux(_cfg.multithreadSafe ? nullptr : nullptr) { //#todo mtsMux for (size_t i = 0; i < cfg.count; i++) { Buffer* qbuff = new Buffer(); qbuff->buffer = new uint8_t[cfg.maxBuffSize]; allBuffers.push_back(qbuff); freeBuffers.push_back(qbuff); } } PreAllocBufferQueue::~PreAllocBufferQueue() { if (!usedBuffers.empty()) { //#todo warning used } freeBuffers.clear(); while (!usedBuffers.empty()) usedBuffers.pop(); for (buffers_vec_t::iterator iter = allBuffers.begin(); iter != allBuffers.end(); ++iter) { Buffer* qbuff = *iter; delete qbuff->buffer; delete qbuff; } allBuffers.clear(); } PreAllocBufferQueue::Buffer* PreAllocBufferQueue::Dequeue() { if (usedBuffers.empty()) return nullptr; Buffer* qbuff = usedBuffers.front(); usedBuffers.pop(); return qbuff; } void PreAllocBufferQueue::Release(PreAllocBufferQueue::Buffer* buffer) { if (buffer == nullptr) return; buffer->buffSize = 0; freeBuffers.push_back(buffer); } PreAllocBufferQueue::Buffer* PreAllocBufferQueue::Enqueue() { if (cfg.fullQueueDropFront && Full()) Release(Dequeue()); if (freeBuffers.empty()) return nullptr; Buffer* qbuff = freeBuffers.back(); freeBuffers.pop_back(); usedBuffers.push(qbuff); return qbuff; } PreAllocBufferQueue::Buffer* PreAllocBufferQueue::Seek() { if (usedBuffers.empty()) return nullptr; Buffer* qbuff = usedBuffers.front(); return qbuff; } bool PreAllocBufferQueue::Empty() const { return usedBuffers.empty(); } bool PreAllocBufferQueue::Full() const { return freeBuffers.empty(); }