99 lines
2.7 KiB
C++
99 lines
2.7 KiB
C++
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose: Defines an interface for circular buffers. Data can be written to
|
|
// and read from these buffers as though from a file. When it is
|
|
// write-overflowed (you write more data in than the buffer can hold),
|
|
// the read pointer is advanced to allow the new data to be written.
|
|
// This means old data will be discarded if you write too much data
|
|
// into the buffer.
|
|
//
|
|
// MikeD: Moved all the functions into a class.
|
|
// Changed it so when the buffer overflows, the old data
|
|
// is discarded rather than the new.
|
|
//
|
|
//=====================================================================================//
|
|
|
|
#ifndef CIRCULARBUFFER_H
|
|
#define CIRCULARBUFFER_H
|
|
|
|
#pragma once
|
|
|
|
class CCircularBuffer
|
|
{
|
|
public:
|
|
CCircularBuffer();
|
|
CCircularBuffer( int size );
|
|
void SetSize( int nSize );
|
|
|
|
protected:
|
|
inline void AssertValid()
|
|
{
|
|
#ifdef _DEBUG
|
|
Assert( this );
|
|
Assert( m_nSize > 0 );
|
|
Assert( m_nCount >= 0 );
|
|
Assert( m_nCount <= m_nSize );
|
|
Assert( m_nWrite < m_nSize );
|
|
|
|
// Verify that m_nCount is correct.
|
|
if( m_nRead == m_nWrite )
|
|
{
|
|
Assert( m_nCount == 0 || m_nCount == m_nSize );
|
|
}
|
|
else
|
|
{
|
|
int testCount=0;
|
|
if ( m_nRead < m_nWrite )
|
|
testCount = m_nWrite - m_nRead;
|
|
else
|
|
testCount = (m_nSize - m_nRead) + m_nWrite;
|
|
|
|
Assert( testCount == m_nCount );
|
|
}
|
|
#endif
|
|
}
|
|
|
|
public:
|
|
|
|
void Flush();
|
|
int GetSize(); // Get the size of the buffer (how much can you write without reading
|
|
// before losing data.
|
|
|
|
int GetWriteAvailable(); // Get the amount available to write without overflowing.
|
|
// Note: you can write however much you want, but it may overflow,
|
|
// in which case the newest data is kept and the oldest is discarded.
|
|
|
|
int GetReadAvailable(); // Get the amount available to read.
|
|
|
|
int GetMaxUsed();
|
|
int Peek(char *pchDest, int nCount);
|
|
int Advance(int nCount);
|
|
int Read(void *pchDest, int nCount);
|
|
int Write(void *pchData, int nCount);
|
|
|
|
public:
|
|
int m_nCount; // Space between the read and write pointers (how much data we can read).
|
|
|
|
int m_nRead; // Read index into circular buffer
|
|
int m_nWrite; // Write index into circular buffer
|
|
|
|
int m_nSize; // Size of circular buffer in bytes (how much data it can hold).
|
|
char m_chData[1]; // Circular buffer holding data
|
|
};
|
|
|
|
|
|
// Use this to instantiate a CircularBuffer.
|
|
template< int size >
|
|
class CSizedCircularBuffer : public CCircularBuffer
|
|
{
|
|
public:
|
|
CSizedCircularBuffer() : CCircularBuffer(size) {}
|
|
|
|
private:
|
|
char myData[size-1];
|
|
};
|
|
|
|
CCircularBuffer *AllocateCircularBuffer( int nSize );
|
|
void FreeCircularBuffer( CCircularBuffer *pCircularBuffer );
|
|
|
|
#endif // CIRCULARBUFFER_H
|