Add initial queue implementation
This commit is contained in:
parent
c48e03dc26
commit
1af4b652b8
92
include/mtl/queue.hpp
Normal file
92
include/mtl/queue.hpp
Normal file
@ -0,0 +1,92 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstddef>
|
||||
#include <utility>
|
||||
|
||||
#include <mtl/exception.hpp>
|
||||
|
||||
namespace mtl {
|
||||
|
||||
/**
|
||||
* \brief Statically allocated queue
|
||||
*/
|
||||
template <typename T>
|
||||
class iqueue {
|
||||
private:
|
||||
T* m_buf;
|
||||
size_t m_size;
|
||||
const size_t m_capacity;
|
||||
|
||||
size_t m_begin;
|
||||
size_t m_end;
|
||||
|
||||
public:
|
||||
using value_type = T;
|
||||
using size_type = size_t;
|
||||
using reference = T&;
|
||||
using const_reference = const T&;
|
||||
|
||||
iqueue(T* buf, size_t capacity) noexcept : m_buf(buf), m_capacity(capacity), m_begin(0), m_end(0) {}
|
||||
|
||||
reference front() noexcept {
|
||||
return m_buf[m_begin];
|
||||
}
|
||||
const_reference front() const noexcept {
|
||||
return m_buf[m_begin];
|
||||
}
|
||||
const_reference cfront() const noexcept {
|
||||
return m_buf[m_begin];
|
||||
}
|
||||
|
||||
reference back() noexcept {
|
||||
return m_buf[m_end];
|
||||
}
|
||||
const_reference back() const noexcept {
|
||||
return m_buf[m_end];
|
||||
}
|
||||
const_reference cback() const noexcept {
|
||||
return m_buf[m_end];
|
||||
}
|
||||
|
||||
bool empty() const noexcept {
|
||||
return m_size == 0;
|
||||
}
|
||||
size_t size() const noexcept {
|
||||
return m_size;
|
||||
}
|
||||
|
||||
void push(T value) {
|
||||
if (m_size == m_capacity) {
|
||||
throw mtl::length_error();
|
||||
}
|
||||
|
||||
m_buf[m_end] = std::move(value);
|
||||
|
||||
++m_size;
|
||||
|
||||
++m_end;
|
||||
m_end %= m_capacity;
|
||||
}
|
||||
void pop() noexcept {
|
||||
if (m_size == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
--m_size;
|
||||
|
||||
++m_begin;
|
||||
m_begin %= m_capacity;
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T, size_t C>
|
||||
class queue : public iqueue<T> {
|
||||
private:
|
||||
T m_buf[C];
|
||||
|
||||
public:
|
||||
queue() noexcept : iqueue<T>(m_buf, C) {}
|
||||
};
|
||||
|
||||
} // namespace mtl
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user