20template <
class T,
size_t N>
23 static_assert(N > 0,
"Circular buffer size cannot be zero.");
34 : m_buffer{buffer}, m_index{
index} {}
62 : m_buffer{buffer}, m_index{
index} {}
120 constexpr size_t size()
const {
return m_length; }
125 constexpr T&
front() {
return (*
this)[0]; }
130 constexpr const T&
front()
const {
return (*
this)[0]; }
138 constexpr T&
back() {
return m_data[(m_front + m_length - 1) % N]; }
146 constexpr const T&
back()
const {
147 return m_data[(m_front + m_length - 1) % N];
156 m_front = ModuloDec(m_front);
158 m_data[m_front] = value;
171 m_data[(m_front + m_length) % N] = value;
177 m_front = ModuloInc(m_front);
187 template <
class... Args>
189 m_front = ModuloDec(m_front);
191 m_data[m_front] = T{args...};
204 template <
class... Args>
206 m_data[(m_front + m_length) % N] = T{args...};
212 m_front = ModuloInc(m_front);
223 T& temp = m_data[m_front];
224 m_front = ModuloInc(m_front);
237 return m_data[(m_front + m_length) % N];
252 return m_data[(m_front +
index) % N];
259 return m_data[(m_front +
index) % N];
263 std::array<T, N> m_data;
276 constexpr size_t ModuloInc(
size_t index) {
return (
index + 1) % N; }
283 constexpr size_t ModuloDec(
size_t index) {
Definition static_circular_buffer.h:53
std::forward_iterator_tag iterator_category
Definition static_circular_buffer.h:55
constexpr const_reference operator*() const
Definition static_circular_buffer.h:74
constexpr const_iterator & operator++()
Definition static_circular_buffer.h:64
constexpr const_iterator(const static_circular_buffer *buffer, size_t index)
Definition static_circular_buffer.h:61
const T & const_reference
Definition static_circular_buffer.h:59
T * pointer
Definition static_circular_buffer.h:58
constexpr const_iterator operator++(int)
Definition static_circular_buffer.h:68
T value_type
Definition static_circular_buffer.h:56
constexpr bool operator==(const const_iterator &) const =default
std::ptrdiff_t difference_type
Definition static_circular_buffer.h:57
Definition static_circular_buffer.h:25
T value_type
Definition static_circular_buffer.h:28
constexpr iterator(static_circular_buffer *buffer, size_t index)
Definition static_circular_buffer.h:33
std::ptrdiff_t difference_type
Definition static_circular_buffer.h:29
constexpr iterator & operator++()
Definition static_circular_buffer.h:36
constexpr reference operator*()
Definition static_circular_buffer.h:46
constexpr bool operator==(const iterator &) const =default
T & reference
Definition static_circular_buffer.h:31
constexpr iterator operator++(int)
Definition static_circular_buffer.h:40
T * pointer
Definition static_circular_buffer.h:30
std::forward_iterator_tag iterator_category
Definition static_circular_buffer.h:27
This is a simple circular buffer so we don't need to "bucket brigade" copy old values.
Definition static_circular_buffer.h:21
constexpr void emplace_back(Args &&... args)
Push a new value onto the back of the buffer that is constructed with the provided constructor argume...
Definition static_circular_buffer.h:205
constexpr iterator begin()
Returns begin iterator.
Definition static_circular_buffer.h:84
constexpr T & operator[](size_t index)
Definition static_circular_buffer.h:251
constexpr T pop_back()
Pop value at back of buffer.
Definition static_circular_buffer.h:235
constexpr const_iterator begin() const
Returns begin iterator.
Definition static_circular_buffer.h:96
constexpr const T & front() const
Returns value at front of buffer.
Definition static_circular_buffer.h:130
constexpr T & front()
Returns value at front of buffer.
Definition static_circular_buffer.h:125
constexpr void emplace_front(Args &&... args)
Push a new value onto the front of the buffer that is constructed with the provided constructor argum...
Definition static_circular_buffer.h:188
constexpr const T & operator[](size_t index) const
Definition static_circular_buffer.h:258
constexpr void reset()
Empties internal buffer.
Definition static_circular_buffer.h:243
constexpr void push_back(T value)
Push a new value onto the back of the buffer.
Definition static_circular_buffer.h:170
constexpr T & back()
Returns value at back of buffer.
Definition static_circular_buffer.h:138
constexpr iterator end()
Returns end iterator.
Definition static_circular_buffer.h:89
constexpr const T & back() const
Returns value at back of buffer.
Definition static_circular_buffer.h:146
constexpr T pop_front()
Pop value at front of buffer.
Definition static_circular_buffer.h:222
constexpr const_iterator end() const
Returns end iterator.
Definition static_circular_buffer.h:101
constexpr void push_front(T value)
Push a new value onto the front of the buffer.
Definition static_circular_buffer.h:155
constexpr const_iterator cbegin() const
Returns begin iterator.
Definition static_circular_buffer.h:108
constexpr const_iterator cend() const
Returns end iterator.
Definition static_circular_buffer.h:113
constexpr size_t size() const
Returns number of elements in buffer.
Definition static_circular_buffer.h:120
Foonathan namespace.
Definition ntcore_cpp.h:26