4 #include "../intlimits.h"
12 template <
typename index_t = u
int_fast8_t, index_t size = 16>
15 static constexpr
bool size_is_power2 = !(size & (size - 1));
17 static_assert(size <= std::numeric_limits<index_t>::max() / 2,
18 "index_t is too small for the requested size");
31 return count() == size;
59 inline index_t
back()
const {
65 if constexpr (size_is_power2)
79 static index_t
mask(index_t cursor) {
return cursor % size; }
82 static index_t
next(index_t cursor) {
85 if constexpr (size_is_power2)
88 return (cursor + 1) % (size * 2);
99 template <
typename T = u
int8_t,
typename index_t = u
int_fast8_t,
size_t size = 16>
102 inline bool empty()
const {
103 return index.empty();
143 index_t count()
const {
144 return index.count();
Definition: circular_buffer.h:100
CircularIndex< index_t, size > index
circular index
Definition: circular_buffer.h:149
void reset()
Reset the circular buffer to empty.
Definition: circular_buffer.h:111
bool pop(T &elem)
Definition: circular_buffer.h:135
bool push(T elem)
Definition: circular_buffer.h:119
T front() const
Definition: circular_buffer.h:129
T data[size]
array of stored elements
Definition: circular_buffer.h:148
Definition: circular_buffer.h:13
static index_t next(index_t cursor)
Definition: circular_buffer.h:82
index_t tail
cursor of the element to read (pop/extract) from the buffer
Definition: circular_buffer.h:75
index_t head
cursor of the empty spot or element insertion (write)
Definition: circular_buffer.h:76
void reset()
Reset the indexes to empty.
Definition: circular_buffer.h:35
static index_t mask(index_t cursor)
Definition: circular_buffer.h:79
index_t back() const
Definition: circular_buffer.h:59
bool empty() const
Definition: circular_buffer.h:25
index_t count() const
Definition: circular_buffer.h:64
void pop()
Definition: circular_buffer.h:47
index_t front() const
Definition: circular_buffer.h:53
bool full() const
Definition: circular_buffer.h:30
void push()
Definition: circular_buffer.h:41