9 template<
class T>
class Queue;
14 std::vector<std::unique_ptr<T>> m_queue;
15 unsigned int m_first_index = 0;
16 unsigned int m_size = 0;
18 Queue(
unsigned int t_size);
20 [[nodiscard]]
unsigned int size()
const {
return m_size; }
21 [[nodiscard]]
bool empty()
const {
return bool(m_size == 0); }
23 void push(
const T& t_x);
26 const T& front()
const {
return *m_queue.at(m_first_index); }
27 T& front() {
return *m_queue.at(m_first_index); }
29 const T& at(
unsigned int t_index)
const {
return *m_queue.at((m_first_index + m_size - 1 - t_index) % m_queue.size()); }
30 T& at(
unsigned int t_index) {
return *m_queue.at((m_first_index + m_size - 1 - t_index) % m_queue.size()); }
34idol::Queue<T>::Queue(
unsigned int t_size) : m_queue(t_size) {
39void idol::Queue<T>::push(
const T& t_x) {
41 if (m_size < m_queue.size()) {
42 const unsigned int pos = (m_first_index + m_size) % m_queue.size();
43 m_queue[pos] = std::make_unique<T>(t_x);
46 m_queue[m_first_index] = std::make_unique<T>(t_x);
47 m_first_index = (m_first_index + 1) % m_queue.size();
53void idol::Queue<T>::clear() {
56 m_queue = std::vector<std::unique_ptr<T>>(m_queue.size());