45 lines
1.1 KiB
C++
45 lines
1.1 KiB
C++
|
|
#pragma once
|
|
|
|
#if !defined(BAD_APPLE_OS_OS_TOOLS_RINGBUFFER_HPP_INCLUDED)
|
|
#define BAD_APPLE_OS_OS_TOOLS_RINGBUFFER_HPP_INCLUDED
|
|
|
|
#include <array>
|
|
#include <cstddef>
|
|
|
|
namespace baos
|
|
{
|
|
template<typename T, std::size_t SIZE>
|
|
class RingBuffer
|
|
{
|
|
private:
|
|
std::array<T, SIZE> mElements;
|
|
std::size_t mBufferedElements = 0;
|
|
std::size_t mPosition = 0;
|
|
public:
|
|
[[nodiscard]] bool full() const noexcept { return mBufferedElements == SIZE; }
|
|
[[nodiscard]] bool empty() const noexcept { return mBufferedElements == 0; }
|
|
bool append(T element) noexcept
|
|
{
|
|
if (full()) {
|
|
return false;
|
|
}
|
|
mElements[mPosition] = std::move(element);
|
|
++mBufferedElements;
|
|
mPosition = (mPosition + 1) % SIZE;
|
|
return true;
|
|
}
|
|
bool next(T& outElement) noexcept
|
|
{
|
|
if (empty()) {
|
|
return false;
|
|
}
|
|
outElement = std::move(mElements[(mPosition + SIZE - mBufferedElements) % SIZE]);
|
|
--mBufferedElements;
|
|
return true;
|
|
}
|
|
};
|
|
}
|
|
|
|
#endif // !defined(BAD_APPLE_OS_OS_TOOLS_RINGBUFFER_HPP_INCLUDED)
|