#pragma once #if !defined(BAD_APPLE_OS_OS_TOOLS_RINGBUFFER_HPP_INCLUDED) #define BAD_APPLE_OS_OS_TOOLS_RINGBUFFER_HPP_INCLUDED #include #include namespace baos { template class RingBuffer { private: std::array 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)