12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- #pragma once
- #include <stddef.h>
- class Filler
- {
- public:
- virtual size_t Read(void *dest, size_t len)=0;
- };
- class Drainer
- {
- public:
- virtual size_t Write(const void *dest, size_t len)=0;
- };
- class RingBuffer
- {
- public:
- RingBuffer();
- ~RingBuffer();
- void Reset();
- bool reserve( size_t bytes );
- int expand( size_t bytes );
- bool empty() const;
- size_t avail() const;
- size_t size() const;
- void clear();
- size_t read( void *dest, size_t len );
- size_t advance( size_t len );
- size_t peek( void *dest, size_t len ) const;
- size_t write( const void *src, size_t len );
- size_t fill( Filler *filler, size_t max_bytes );
- size_t drain( Drainer *drainer, size_t max_bytes );
- size_t at( size_t offset, void *dest, size_t len ) const;
- size_t write_position() const;
- size_t read_position() const;
- void get_read_buffer( size_t bytes, const void **buffer, size_t *bytes_available ) const;
-
- void *LockBuffer();
- void UnlockBuffer( size_t written );
- private:
- volatile size_t ringBufferUsed;
- size_t ringBufferSize;
- char *ringBuffer;
- char *ringWritePosition;
- char *ringReadPosition;
- };
|