62 lines
931 B
C
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 */
|