#include "PreAllocBufferPriorityList.h" PreAllocBufferPriorityList::PreAllocBufferPriorityList(const PreAllocBufferPriorityList::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); } } PreAllocBufferPriorityList::~PreAllocBufferPriorityList() { 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(); } PreAllocBufferQueue::Buffer* PreAllocBufferQueue::Seek() { if (usedBuffers.empty()) return nullptr; Buffer* qbuff = usedBuffers.front(); return qbuff; } PreAllocBufferPriorityList::Buffer* PreAllocBufferPriorityList::Dequeue() { if (usedBuffers.empty()) return nullptr; Buffer* qbuff = usedBuffers.front(); usedBuffers.pop_front(); return qbuff; } void PreAllocBufferPriorityList::Release(PreAllocBufferPriorityList::Buffer* buffer) { if (buffer == nullptr) return; buffer->buffSize = 0; freeBuffers.push_back(buffer); } PreAllocBufferPriorityList::Buffer* PreAllocBufferPriorityList::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 PreAllocBufferPriorityList::Empty() const { return usedBuffers.empty(); } bool PreAllocBufferPriorityList::Full() const { return freeBuffers.empty(); }