Ring-buffer - heap array instead of vec

Summary: I like this better, it's clearer.

Reviewers: dgleich, mislav.bradac

Reviewed By: dgleich

Subscribers: pullbot

Differential Revision: https://phabricator.memgraph.io/D961
This commit is contained in:
florijan 2017-11-06 10:31:54 +01:00
parent 0ae88bc06b
commit ab2f7c3288

View File

@ -6,7 +6,6 @@
#include <mutex>
#include <thread>
#include <utility>
#include <vector>
#include "glog/logging.h"
@ -21,21 +20,27 @@
template <typename TElement>
class RingBuffer {
public:
RingBuffer(int capacity) : buffer_(capacity) {}
RingBuffer(int capacity) : capacity_(capacity) {
buffer_ = new TElement[capacity_];
}
RingBuffer(const RingBuffer &) = delete;
RingBuffer(RingBuffer &&) = delete;
RingBuffer &operator=(const RingBuffer &) = delete;
RingBuffer &operator=(RingBuffer &&) = delete;
~RingBuffer() {
delete[] buffer_;
}
template <typename... TArgs>
void emplace(TArgs &&... args) {
while (true) {
{
std::lock_guard<SpinLock> guard(lock_);
if (size_ < buffer_.size()) {
if (size_ < capacity_) {
buffer_[write_pos_++] = TElement(std::forward<TArgs>(args)...);
write_pos_ %= buffer_.size();
write_pos_ %= capacity_;
size_++;
return;
}
@ -54,12 +59,13 @@ class RingBuffer {
size_--;
std::experimental::optional<TElement> result(
std::move(buffer_[read_pos_++]));
read_pos_ %= buffer_.size();
read_pos_ %= capacity_;
return result;
}
private:
std::vector<TElement> buffer_;
int capacity_;
TElement *buffer_;
SpinLock lock_;
int read_pos_{0};
int write_pos_{0};