#ifndef STATICQUEUE_H #define STATICQUEUE_H #include "Exception.h" #include "Queue.h" namespace Kylin { template class StaticQueue : public Queue { public: T &head() override { if (m_size <= 0) THROW_EXCEPTION(InvalidParameterException, "There is no element in queue..."); return m_space[m_front]; } void enqueue(const T &value) override { if (m_size >= N) THROW_EXCEPTION(InvalidParameterException, "There is no space..."); m_space[m_rear] = value; m_rear = (m_rear + 1) % N; m_size++; } T dequeue() override { if (m_size <= 0) THROW_EXCEPTION(InvalidParameterException, "There is no element in queue..."); auto result = m_space[m_front]; m_front = (m_front + 1) % N; m_size--; return result; } virtual void clear() { m_front = 0; m_rear = 0; m_size = 0; } size_t size() const noexcept override { return m_size; } size_t capacity() const { return N; } private: T m_space[N]; size_t m_front = 0; size_t m_rear = 0; size_t m_size = 0; }; } // namespace Kylin #endif // STATICQUEUE_H