mloop/src/ringbuffer.h

62 lines
931 B
C++

/* $Id$ */
#ifndef RINGBUFFER_H
#define RINGBUFFER_H
class RingBuffer {
private:
uint8_t *m_buffer;
uint8_t *m_end;
uint8_t *m_write;
uint8_t *m_read;
public:
RingBuffer(size_t length)
{
m_buffer = (uint8_t *)malloc(length);
m_end = m_buffer + length;
m_write = m_buffer;
m_read = m_buffer;
}
~RingBuffer()
{
free(m_buffer);
}
void Write(uint8_t *buffer, size_t length)
{
while (length--) {
if (m_write == m_end) m_write = m_buffer;
*m_write++ = *buffer++;
}
}
void Read(uint8_t *buffer, size_t length)
{
while (length--) {
if (m_read == m_end) m_read = m_buffer;
*buffer++ = *m_read++;
}
}
size_t Size() const
{
if (m_write >= m_read) return m_write - m_read;
return (m_end - m_read) + (m_write - m_buffer);
}
size_t Free() const
{
return (m_end - m_buffer) - Size();
}
void Reset()
{
m_write = m_buffer;
m_read = m_buffer;
}
};
#endif /* RINGBUFFER_H */