#include "PreAllocBufferPriorityQueue.h" PreAllocBufferPriorityQueue::PreAllocBufferPriorityQueue(const PreAllocBufferPriorityQueue::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); } } PreAllocBufferPriorityQueue::~PreAllocBufferPriorityQueue() { if (!usedBuffers.empty()) { //#todo warning used } freeBuffers.clear(); usedBuffers.clear(); for (buffers_vec_t::iterator iter = allBuffers.begin(); iter != allBuffers.end(); ++iter) { Buffer* qbuff = *iter; delete qbuff->buffer; delete qbuff; } allBuffers.clear(); } PreAllocBufferPriorityQueue::Buffer* PreAllocBufferPriorityQueue::Seek() { if (usedBuffers.empty()) return nullptr; Buffer* qbuff = usedBuffers.front(); return qbuff; } PreAllocBufferPriorityQueue::Buffer* PreAllocBufferPriorityQueue::Dequeue() { if (usedBuffers.empty()) return nullptr; Buffer* qbuff = usedBuffers.front(); usedBuffers.pop_front(); return qbuff; } void PreAllocBufferPriorityQueue::Release(PreAllocBufferPriorityQueue::Buffer* buffer) { if (buffer == nullptr) return; buffer->buffSize = 0; freeBuffers.push_back(buffer); } PreAllocBufferPriorityQueue::Buffer* PreAllocBufferPriorityQueue::Enqueue() { if (cfg.fullQueueDropFront && Full()) Release(Dequeue()); if (freeBuffers.empty()) return nullptr; Buffer* qbuff = freeBuffers.back(); freeBuffers.pop_back(); usedBuffers.push_back(qbuff);//#todo insert by operator return qbuff; } bool PreAllocBufferPriorityQueue::Empty() const { return usedBuffers.empty(); } bool PreAllocBufferPriorityQueue::Full() const { return freeBuffers.empty(); }