48template<
class T, std::
size_t CAPACITY>
51 static_assert(CAPACITY > 0,
"CAPACITY must be > 0");
65 bool push(
const T &value);
77 std::optional<T>
pop();
92 [[nodiscard]] std::optional<T>
front()
const;
101 [[nodiscard]]
bool front(T &value)
const;
108 [[nodiscard]] std::optional<T>
back()
const;
117 [[nodiscard]]
bool back(T &value)
const;
128 [[nodiscard]]
bool empty()
const;
135 [[nodiscard]]
bool full()
const;
142 [[nodiscard]] std::size_t
size()
const;
149 [[nodiscard]]
constexpr std::size_t
capacity()
const;
176 [[nodiscard]] std::size_t next(std::size_t index)
const;
182 std::array<T, CAPACITY> m_data{};
183 std::size_t m_head{ 0 };
184 std::size_t m_tail{ 0 };
185 bool m_full{
false };
195template<
class T, std::
size_t CAPACITY>
198 m_data[m_head] = value;
199 m_head = next(m_head);
208 m_full = (m_head == m_tail);
215template<
class T, std::
size_t CAPACITY>
220 const std::optional<T> result = m_data[m_tail];
221 m_tail = next(m_tail);
228template<
class T, std::
size_t CAPACITY>
234 value = m_data[m_tail];
235 m_tail = next(m_tail);
242template<
class T, std::
size_t CAPACITY>
247 return m_data[m_tail];
252template<
class T, std::
size_t CAPACITY>
257 value = m_data[m_tail];
263template<
class T, std::
size_t CAPACITY>
268 return m_data[(m_head == 0) ? CAPACITY - 1 : m_head - 1];
273template<
class T, std::
size_t CAPACITY>
278 std::size_t backIndex = (m_head == 0) ? CAPACITY - 1 : m_head - 1;
279 value = m_data[backIndex];
284template<
class T, std::
size_t CAPACITY>
287 return !m_full && (m_head == m_tail);
291template<
class T, std::
size_t CAPACITY>
298template<
class T, std::
size_t CAPACITY>
303 if (m_head >= m_tail)
304 return m_head - m_tail;
305 return CAPACITY - (m_tail - m_head);
309template<
class T, std::
size_t CAPACITY>
316template<
class T, std::
size_t CAPACITY>
325template<
class T, std::
size_t CAPACITY>
330 const auto nextIndex = index + 1;
331 if (nextIndex == CAPACITY)