40 lines
791 B
C
40 lines
791 B
C
|
#pragma once
|
||
|
#include <array>
|
||
|
|
||
|
template<typename T, int Size>
|
||
|
struct Ringbuf {
|
||
|
Ringbuf() : m_head(0), m_tail(0) {}
|
||
|
|
||
|
void clear() {
|
||
|
m_head = 0;
|
||
|
m_tail = 0;
|
||
|
}
|
||
|
|
||
|
bool take(T& dest) {
|
||
|
if (m_head == m_tail) {
|
||
|
return false;
|
||
|
}
|
||
|
const int cur = m_head;
|
||
|
const int nextHead = (m_head + 1) % Size;
|
||
|
m_head = nextHead;
|
||
|
dest = m_items[cur];
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
void insert(const T& src) {
|
||
|
const int cur = m_tail;
|
||
|
const int nextTail = (m_tail + 1) % Size;
|
||
|
if (nextTail == m_head) {
|
||
|
return;
|
||
|
} else {
|
||
|
m_tail = nextTail;
|
||
|
}
|
||
|
m_items[cur] = src;
|
||
|
}
|
||
|
private:
|
||
|
int m_head = 0;
|
||
|
int m_tail = 0;
|
||
|
std::array<T, Size> m_items;
|
||
|
};
|
||
|
|