#pragma once template class CircularBuffer { private: T buf[size]; size_t oldestIndex; public: CircularBuffer(const T& initValue); void push(const T& element); T& operator[](size_t index); void clear(); }; template inline CircularBuffer::CircularBuffer(const T& initValue) : oldestIndex(0) { for (size_t i = 0; i < size; i++) { buf[i] = initValue; } } template inline void CircularBuffer::push(const T& element) { this->buf[this->oldestIndex] = element; this->oldestIndex = ++this->oldestIndex % size; } template inline T& CircularBuffer::operator[](size_t index) { return this->buf[(this->oldestIndex - index - 1 + size) % size]; } template inline void CircularBuffer::clear(){ memset(this->buf, T(0), size); this->oldestIndex = 0; }