#include "vector.hpp" template class RingBuffer { private: Vector data; std::size_t head, tail; void AdvanceHead() { ++head; if(head >= data.GetSize()) { head = 0; } } void AdvanceTail() { ++tail; if(tail >= data.GetSize()) { tail = 0; } if(tail == head) { AdvanceHead(); } } public: void Push(const T value) { data[tail] = value; AdvanceTail(); } T Pop() { if(head == tail) { throw std::out_of_range("Cannot retrieve value when size is 0"); } T const & toReturn = data[head]; AdvanceHead(); return toReturn; } std::size_t GetSize() const { if(head <= tail) { return tail - head; } else { return tail + (data.GetSize() - head); } } bool IsEmpty() const { return head == tail; } RingBuffer(std::size_t const size) : data(), head(0), tail(0) { data.Resize(size + 1ul); } };