49 lines
1.2 KiB
C++
49 lines
1.2 KiB
C++
#ifndef STATICQUEUE_H
|
|
#define STATICQUEUE_H
|
|
|
|
#include "Exception.h"
|
|
#include "Queue.h"
|
|
|
|
namespace Kylin {
|
|
template <typename T, size_t N>
|
|
class StaticQueue : public Queue<T> {
|
|
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
|