/* * CircularBuffer.hpp * * Created on: 21 дек. 2017 г. * Author: titov */ #ifndef SOURCE_COMMON_CIRCULARBUFFER_HPP_ #define SOURCE_COMMON_CIRCULARBUFFER_HPP_ //!Кольцевой буфер. /*!Кольцевой буфер. * Класс не осуществляет защиту данных от переполнения и вычитывания. * \param size Размер кольцевого буфера, должен быть степенью 2. * \param T Тип данных хранящихся в буфуре. * */ template class CircularBuffer { private: static const unsigned int sizemask = size - 1; T buff[size]; unsigned int head; unsigned int tail; public: CircularBuffer(); void clear(); void put(T val); T push(); bool empty() const; bool full() const; unsigned int load() const; unsigned int avalaible() const; }; template inline CircularBuffer::CircularBuffer() : head(0), tail(0) {} template inline void CircularBuffer::clear() { head = 0; tail = 0; } template inline void CircularBuffer::put(T val) { buff[++head & sizemask] = val; } template inline T CircularBuffer::push() { return buff[++tail & sizemask]; } template inline bool CircularBuffer::empty() const { return tail == head; } template inline bool CircularBuffer::full() const { return ((head - tail) & sizemask) == sizemask; } template inline unsigned int CircularBuffer::load() const { return (head - tail) & sizemask; } template inline unsigned int CircularBuffer::avalaible() const { return (tail - head - 1u) & sizemask; } #endif /* SOURCE_COMMON_CIRCULARBUFFER_HPP_ */