#pragma once #include #include #include #include #include "typedefs.hpp" namespace util { /// @brief Thread-safe pool of same-sized buffers /// @tparam T array type template class BufferPool { std::vector> buffers; std::queue freeBuffers; std::mutex mutex; size_t bufferSize; public: BufferPool(size_t bufferSize) : bufferSize(bufferSize) { } /// @brief Retrieve a buffer for use /// @return pointer that brings buffer back to the pool when destroyed std::shared_ptr get() { std::lock_guard lock(mutex); if (freeBuffers.empty()) { buffers.emplace_back(std::make_unique(bufferSize)); freeBuffers.push(buffers[buffers.size() - 1].get()); } auto* buffer = freeBuffers.front(); freeBuffers.pop(); return std::shared_ptr(buffer, [this](T* ptr) { std::lock_guard lock(mutex); freeBuffers.push(ptr); }); } size_t getBufferSize() const { return bufferSize; } }; }