#pragma once #include template 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 m_items; };