84 lines
2.3 KiB
C++
84 lines
2.3 KiB
C++
#pragma once
|
|
|
|
class CircularBuffer
|
|
{
|
|
// allocated whole block pointer
|
|
uint8 * m_buffer;
|
|
uint8 * m_bufferEnd;
|
|
|
|
// region A pointer, and size
|
|
uint8 * m_regionAPointer;
|
|
size_t m_regionASize;
|
|
|
|
// region size
|
|
uint8 * m_regionBPointer;
|
|
size_t m_regionBSize;
|
|
|
|
// allocated size
|
|
size_t m_bufferSize;
|
|
|
|
|
|
// pointer magic!
|
|
INLINE size_t GetAFreeSpace() { return (m_bufferEnd - m_regionAPointer - m_regionASize); }
|
|
INLINE size_t GetSpaceBeforeA() { return (m_regionAPointer - m_buffer); }
|
|
INLINE size_t GetSpaceAfterA() { return (m_bufferEnd - m_regionAPointer - m_regionASize); }
|
|
INLINE size_t GetBFreeSpace() { if(m_regionBPointer == nullptr) { return 0; } return (m_regionAPointer - m_regionBPointer - m_regionBSize); }
|
|
|
|
public:
|
|
CircularBuffer();
|
|
~CircularBuffer();
|
|
|
|
/** Read bytes from the buffer
|
|
* @param destination pointer to destination where bytes will be written
|
|
* @param bytes number of bytes to read
|
|
* @return true if there was enough data, false otherwise
|
|
*/
|
|
bool Read(void * destination, size_t bytes);
|
|
void AllocateB();
|
|
|
|
/** Write bytes to the buffer
|
|
* @param data pointer to the data to be written
|
|
* @param bytes number of bytes to be written
|
|
* @return true if was successful, otherwise false
|
|
*/
|
|
bool Write(const void * data, size_t bytes);
|
|
|
|
/** Returns the allocated size of the buffer.
|
|
*/
|
|
INLINE size_t GetAllocatedSize() const { return m_bufferSize; }
|
|
|
|
/** Returns the number of available bytes left.
|
|
*/
|
|
size_t GetSpace();
|
|
|
|
/** Returns the number of bytes currently stored in the buffer.
|
|
*/
|
|
size_t GetSize();
|
|
|
|
/** Returns the number of contiguous bytes (that can be pushed out in one operation)
|
|
*/
|
|
size_t GetContiguousBytes();
|
|
|
|
/** Removes len bytes from the front of the buffer
|
|
* @param len the number of bytes to "cut"
|
|
*/
|
|
void Remove(size_t len);
|
|
|
|
/** Returns a pointer at the "end" of the buffer, where new data can be written
|
|
*/
|
|
void * GetBuffer();
|
|
|
|
/** Allocate the buffer with room for size bytes
|
|
* @param size the number of bytes to allocate
|
|
*/
|
|
void Allocate(size_t size);
|
|
|
|
/** Increments the "written" pointer forward len bytes
|
|
* @param len number of bytes to step
|
|
*/
|
|
void IncrementWritten(size_t len); // i.e. "commit"
|
|
|
|
/** Returns a pointer at the "beginning" of the buffer, where data can be pulled from
|
|
*/
|
|
void * GetBufferStart();
|
|
}; |