diff --git a/src/data_structures/ring_buffer.hpp b/src/data_structures/ring_buffer.hpp index 4d6574673..80a751b34 100644 --- a/src/data_structures/ring_buffer.hpp +++ b/src/data_structures/ring_buffer.hpp @@ -6,6 +6,7 @@ #include #include #include +#include #include "glog/logging.h" @@ -17,10 +18,11 @@ * * @tparam TElement - type of element the buffer tracks. */ -template +template class RingBuffer { public: - RingBuffer() = default; + RingBuffer(int capacity) : buffer_(capacity) {} + RingBuffer(const RingBuffer &) = delete; RingBuffer(RingBuffer &&) = delete; RingBuffer &operator=(const RingBuffer &) = delete; @@ -31,9 +33,9 @@ class RingBuffer { while (true) { { std::lock_guard guard(lock_); - if (size_ < capacity) { + if (size_ < buffer_.size()) { buffer_[write_pos_++] = TElement(std::forward(args)...); - write_pos_ %= capacity; + write_pos_ %= buffer_.size(); size_++; return; } @@ -52,12 +54,12 @@ class RingBuffer { size_--; std::experimental::optional result( std::move(buffer_[read_pos_++])); - read_pos_ %= capacity; + read_pos_ %= buffer_.size(); return result; } private: - TElement buffer_[capacity]; + std::vector buffer_; SpinLock lock_; int read_pos_{0}; int write_pos_{0}; diff --git a/tests/benchmark/data_structures/ring_buffer.cpp b/tests/benchmark/data_structures/ring_buffer.cpp index fc92216f9..8e2dc5e74 100644 --- a/tests/benchmark/data_structures/ring_buffer.cpp +++ b/tests/benchmark/data_structures/ring_buffer.cpp @@ -7,7 +7,7 @@ class RingBufferMultiThreaded : public benchmark::Fixture { protected: - RingBuffer buffer; + RingBuffer buffer{1024}; }; BENCHMARK_DEFINE_F(RingBufferMultiThreaded, MT)(benchmark::State &st) { diff --git a/tests/unit/ring_buffer.cpp b/tests/unit/ring_buffer.cpp index df3e23db7..de4c718c7 100644 --- a/tests/unit/ring_buffer.cpp +++ b/tests/unit/ring_buffer.cpp @@ -13,7 +13,7 @@ TEST(RingBuffer, MultithreadedUsage) { std::unordered_set consumed; SpinLock consumed_lock; - RingBuffer buffer; + RingBuffer buffer{20}; std::vector producers; for (int i = 0; i < producer_count; i++) @@ -61,7 +61,7 @@ TEST(RingBuffer, MultithreadedUsage) { } TEST(RingBuffer, ComplexValues) { - RingBuffer, 10> buffer; + RingBuffer> buffer{10}; std::vector element; for (int i = 0 ; i < 5 ; i++) { element.emplace_back(i); @@ -78,7 +78,7 @@ TEST(RingBuffer, ComplexValues) { } TEST(RingBuffer, NonCopyable) { - RingBuffer, 10> buffer; + RingBuffer> buffer{10}; buffer.emplace(new std::string("string")); buffer.emplace(new std::string("kifla"));