diff options
Diffstat (limited to 'lib/buffer_queue_pool.cpp')
-rw-r--r-- | lib/buffer_queue_pool.cpp | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/lib/buffer_queue_pool.cpp b/lib/buffer_queue_pool.cpp new file mode 100644 index 0000000..a30f4a6 --- /dev/null +++ b/lib/buffer_queue_pool.cpp @@ -0,0 +1,54 @@ +// Copyright (C) by Josh Blum. See LICENSE.txt for licensing information. + +#include <gras/buffer_queue.hpp> +#include <gras_impl/debug.hpp> +#include <boost/circular_buffer.hpp> + +using namespace gras; + +struct BufferQueuePool : BufferQueue +{ + BufferQueuePool(const size_t num) + { + queue.resize(num); + } + + SBuffer &front(void) + { + return queue.front(); + } + + void pop(void) + { + ASSERT(not queue.empty()); + queue.front() = SBuffer(); //dont hold ref + queue.pop_front(); + } + + void push(const SBuffer &buff) + { + queue.push_back(buff); + } + + bool empty(void) const + { + return queue.empty(); + } + + boost::circular_buffer<SBuffer> queue; + +}; + +BufferQueueSptr BufferQueue::make_pool( + const SBufferConfig &config, + const size_t num_buffs +){ + BufferQueueSptr bq(new BufferQueuePool(num_buffs)); + for (size_t i = 0; i < num_buffs; i++) + { + SBuffer buff(config); + std::memset(buff.get_actual_memory(), 0, buff.get_actual_length()); + bq->push(buff); + } + return bq; +} |