43 : m_buffer{buffer}, m_index{
index} {}
80 : m_buffer{buffer}, m_index{
index} {}
188 constexpr size_t size()
const {
return m_length; }
193 constexpr T&
front() {
return (*
this)[0]; }
198 constexpr const T&
front()
const {
return (*
this)[0]; }
207 return m_data[(m_front + m_length - 1) % m_data.size()];
216 constexpr const T&
back()
const {
217 return m_data[(m_front + m_length - 1) % m_data.size()];
226 if (m_data.size() == 0) {
230 m_front = ModuloDec(m_front);
232 m_data[m_front] = value;
234 if (m_length < m_data.size()) {
245 if (m_data.size() == 0) {
249 m_data[(m_front + m_length) % m_data.size()] = value;
251 if (m_length < m_data.size()) {
255 m_front = ModuloInc(m_front);
265 template <
class... Args>
267 if (m_data.size() == 0) {
271 m_front = ModuloDec(m_front);
273 m_data[m_front] = T{args...};
275 if (m_length < m_data.size()) {
286 template <
class... Args>
288 if (m_data.size() == 0) {
292 m_data[(m_front + m_length) % m_data.size()] = T{args...};
294 if (m_length < m_data.size()) {
298 m_front = ModuloInc(m_front);
309 T& temp = m_data[m_front];
310 m_front = ModuloInc(m_front);
323 return m_data[(m_front + m_length) % m_data.size()];
330 if (size > m_data.size()) {
332 size_t insertLocation = (m_front + m_length) % m_data.size();
335 if (insertLocation <= m_front) {
336 m_front += size - m_data.size();
340 m_data.insert(m_data.begin() + insertLocation, size - m_data.size(), 0);
341 }
else if (size < m_data.size()) {
347 size_t elemsToRemove = m_data.size() -
size;
348 auto frontIter = m_data.begin() + m_front;
349 if (m_front < elemsToRemove) {
353 m_data.erase(frontIter + size, m_data.end());
356 m_data.erase(m_data.begin(), frontIter);
362 m_data.erase(frontIter - elemsToRemove, frontIter);
365 m_front -= elemsToRemove;
372 if (m_length > size) {
390 return m_data[(m_front +
index) % m_data.size()];
397 return m_data[(m_front +
index) % m_data.size()];
401 std::vector<T> m_data;
415 constexpr size_t ModuloInc(
size_t index) {
416 return (
index + 1) % m_data.size();
425 constexpr size_t ModuloDec(
size_t index) {
427 return m_data.size() - 1;
Definition circular_buffer.h:71
constexpr const_iterator & operator++()
Definition circular_buffer.h:82
constexpr const_iterator(const circular_buffer *buffer, size_t index)
Definition circular_buffer.h:79
std::ptrdiff_t difference_type
Definition circular_buffer.h:75
constexpr const_iterator & operator--()
Definition circular_buffer.h:91
constexpr const_iterator operator--(int)
Definition circular_buffer.h:95
T value_type
Definition circular_buffer.h:74
const T & const_reference
Definition circular_buffer.h:77
constexpr const_iterator operator++(int)
Definition circular_buffer.h:86
T * pointer
Definition circular_buffer.h:76
constexpr bool operator==(const const_iterator &) const =default
constexpr const_reference operator*() const
Definition circular_buffer.h:101
std::bidirectional_iterator_tag iterator_category
Definition circular_buffer.h:73
Definition circular_buffer.h:34
constexpr bool operator==(const iterator &) const =default
constexpr iterator operator++(int)
Definition circular_buffer.h:49
constexpr reference operator*()
Definition circular_buffer.h:64
std::ptrdiff_t difference_type
Definition circular_buffer.h:38
std::bidirectional_iterator_tag iterator_category
Definition circular_buffer.h:36
constexpr iterator & operator++()
Definition circular_buffer.h:45
T & reference
Definition circular_buffer.h:40
constexpr iterator operator--(int)
Definition circular_buffer.h:58
T * pointer
Definition circular_buffer.h:39
constexpr iterator & operator--()
Definition circular_buffer.h:54
constexpr iterator(circular_buffer *buffer, size_t index)
Definition circular_buffer.h:42
T value_type
Definition circular_buffer.h:37
This is a simple circular buffer so we don't need to "bucket brigade" copy old values.
Definition circular_buffer.h:20
constexpr T & operator[](size_t index)
Definition circular_buffer.h:389
constexpr const_iterator cend() const
Returns const end iterator.
Definition circular_buffer.h:143
constexpr const T & operator[](size_t index) const
Definition circular_buffer.h:396
constexpr T pop_front()
Pop value at front of buffer.
Definition circular_buffer.h:308
constexpr T & back()
Returns value at back of buffer.
Definition circular_buffer.h:206
std::reverse_iterator< iterator > reverse_iterator
Definition circular_buffer.h:108
constexpr const_reverse_iterator rend() const
Returns const reverse end iterator.
Definition circular_buffer.h:167
constexpr const T & back() const
Returns value at back of buffer.
Definition circular_buffer.h:216
constexpr circular_buffer & operator=(const circular_buffer &)=default
constexpr void reset()
Empties internal buffer.
Definition circular_buffer.h:381
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 circular_buffer.h:287
constexpr const_iterator end() const
Returns const end iterator.
Definition circular_buffer.h:131
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition circular_buffer.h:109
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 circular_buffer.h:266
constexpr reverse_iterator rend()
Returns reverse end iterator.
Definition circular_buffer.h:155
constexpr const_reverse_iterator crbegin() const
Returns const reverse begin iterator.
Definition circular_buffer.h:174
constexpr const_iterator cbegin() const
Returns const begin iterator.
Definition circular_buffer.h:138
constexpr T & front()
Returns value at front of buffer.
Definition circular_buffer.h:193
constexpr reverse_iterator rbegin()
Returns reverse begin iterator.
Definition circular_buffer.h:150
constexpr T pop_back()
Pop value at back of buffer.
Definition circular_buffer.h:321
constexpr circular_buffer(circular_buffer &&)=default
constexpr iterator end()
Returns end iterator.
Definition circular_buffer.h:119
constexpr void push_front(T value)
Push a new value onto the front of the buffer.
Definition circular_buffer.h:225
constexpr iterator begin()
Returns begin iterator.
Definition circular_buffer.h:114
constexpr const_iterator begin() const
Returns const begin iterator.
Definition circular_buffer.h:126
constexpr const_reverse_iterator crend() const
Returns const reverse end iterator.
Definition circular_buffer.h:181
constexpr circular_buffer(size_t size)
Constructs a circular buffer.
Definition circular_buffer.h:27
constexpr void resize(size_t size)
Resizes internal buffer to given size.
Definition circular_buffer.h:329
constexpr circular_buffer & operator=(circular_buffer &&)=default
constexpr void push_back(T value)
Push a new value onto the back of the buffer.
Definition circular_buffer.h:244
constexpr size_t size() const
Returns number of elements in buffer.
Definition circular_buffer.h:188
constexpr const T & front() const
Returns value at front of buffer.
Definition circular_buffer.h:198
constexpr const_reverse_iterator rbegin() const
Returns const reverse begin iterator.
Definition circular_buffer.h:160
constexpr circular_buffer(const circular_buffer &)=default
Definition ntcore_cpp.h:26