43 : m_buffer{buffer}, m_index{
index} {}
71 : m_buffer{buffer}, m_index{
index} {}
108 constexpr size_t size()
const {
return m_length; }
113 constexpr T&
front() {
return (*
this)[0]; }
118 constexpr const T&
front()
const {
return (*
this)[0]; }
127 return m_data[(m_front + m_length - 1) % m_data.size()];
136 constexpr const T&
back()
const {
137 return m_data[(m_front + m_length - 1) % m_data.size()];
146 if (m_data.size() == 0) {
150 m_front = ModuloDec(m_front);
152 m_data[m_front] = value;
154 if (m_length < m_data.size()) {
165 if (m_data.size() == 0) {
169 m_data[(m_front + m_length) % m_data.size()] = value;
171 if (m_length < m_data.size()) {
175 m_front = ModuloInc(m_front);
185 template <
class... Args>
187 if (m_data.size() == 0) {
191 m_front = ModuloDec(m_front);
193 m_data[m_front] = T{args...};
195 if (m_length < m_data.size()) {
206 template <
class... Args>
208 if (m_data.size() == 0) {
212 m_data[(m_front + m_length) % m_data.size()] = T{args...};
214 if (m_length < m_data.size()) {
218 m_front = ModuloInc(m_front);
229 T& temp = m_data[m_front];
230 m_front = ModuloInc(m_front);
243 return m_data[(m_front + m_length) % m_data.size()];
250 if (size > m_data.size()) {
252 size_t insertLocation = (m_front + m_length) % m_data.size();
255 if (insertLocation <= m_front) {
256 m_front += size - m_data.size();
260 m_data.insert(m_data.begin() + insertLocation, size - m_data.size(), 0);
261 }
else if (size < m_data.size()) {
267 size_t elemsToRemove = m_data.size() -
size;
268 auto frontIter = m_data.begin() + m_front;
269 if (m_front < elemsToRemove) {
273 m_data.erase(frontIter + size, m_data.end());
276 m_data.erase(m_data.begin(), frontIter);
282 m_data.erase(frontIter - elemsToRemove, frontIter);
285 m_front -= elemsToRemove;
292 if (m_length > size) {
310 return m_data[(m_front +
index) % m_data.size()];
317 return m_data[(m_front +
index) % m_data.size()];
321 std::vector<T> m_data;
335 constexpr size_t ModuloInc(
size_t index) {
336 return (
index + 1) % m_data.size();
345 constexpr size_t ModuloDec(
size_t index) {
347 return m_data.size() - 1;
Definition circular_buffer.h:62
constexpr const_iterator & operator++()
Definition circular_buffer.h:73
constexpr const_iterator(const circular_buffer *buffer, size_t index)
Definition circular_buffer.h:70
std::ptrdiff_t difference_type
Definition circular_buffer.h:66
T value_type
Definition circular_buffer.h:65
std::forward_iterator_tag iterator_category
Definition circular_buffer.h:64
const T & const_reference
Definition circular_buffer.h:68
constexpr const_iterator operator++(int)
Definition circular_buffer.h:77
T * pointer
Definition circular_buffer.h:67
constexpr bool operator==(const const_iterator &) const =default
constexpr const_reference operator*() const
Definition circular_buffer.h:83
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:55
std::ptrdiff_t difference_type
Definition circular_buffer.h:38
constexpr iterator & operator++()
Definition circular_buffer.h:45
T & reference
Definition circular_buffer.h:40
T * pointer
Definition circular_buffer.h:39
std::forward_iterator_tag iterator_category
Definition circular_buffer.h:36
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:309
constexpr const_iterator cend() const
Definition circular_buffer.h:101
constexpr const T & operator[](size_t index) const
Definition circular_buffer.h:316
constexpr T pop_front()
Pop value at front of buffer.
Definition circular_buffer.h:228
constexpr T & back()
Returns value at back of buffer.
Definition circular_buffer.h:126
constexpr const T & back() const
Returns value at back of buffer.
Definition circular_buffer.h:136
constexpr circular_buffer & operator=(const circular_buffer &)=default
constexpr void reset()
Empties internal buffer.
Definition circular_buffer.h:301
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:207
constexpr const_iterator end() const
Definition circular_buffer.h:96
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:186
constexpr const_iterator cbegin() const
Definition circular_buffer.h:100
constexpr T & front()
Returns value at front of buffer.
Definition circular_buffer.h:113
constexpr T pop_back()
Pop value at back of buffer.
Definition circular_buffer.h:241
constexpr circular_buffer(circular_buffer &&)=default
constexpr iterator end()
Definition circular_buffer.h:91
constexpr void push_front(T value)
Push a new value onto the front of the buffer.
Definition circular_buffer.h:145
constexpr iterator begin()
Definition circular_buffer.h:90
constexpr const_iterator begin() const
Definition circular_buffer.h:95
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:249
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:164
constexpr size_t size() const
Returns number of elements in buffer.
Definition circular_buffer.h:108
constexpr const T & front() const
Returns value at front of buffer.
Definition circular_buffer.h:118
constexpr circular_buffer(const circular_buffer &)=default
Foonathan namespace.
Definition ntcore_cpp.h:26