Major Update: (compiling but untested)
- Replace CBuffer with CRollingBuffer and CShiftBuffer ShiftBuffer is faster and simpler and always zero terminates - Updated SelectableCore to use RollingBuffer - Add Overwrite parameter to Push() and ReadFromFD() methods - Add PeakDirect() method for fast direct access to buffer
This commit is contained in:
114
BufferCore.h
114
BufferCore.h
@@ -16,51 +16,115 @@
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
class CBuffer
|
||||
/** Shift and Rolling buffer class
|
||||
*
|
||||
* Shifting buffer:
|
||||
* Data is either set at start of buffer or appended to buffer
|
||||
* Start of buffered data is always at beginning of buffer
|
||||
* Never rolls over (option to over overwrite if data longer than buffer)
|
||||
* Shifts unsused data to left when clearing used data
|
||||
* Always zero terminates buffer
|
||||
* Can look directly at buffer
|
||||
*
|
||||
* Rolling buffer:
|
||||
* Data is continuosly assigned to buffer
|
||||
* Start of buffer is tracked by references (can be anywhere)
|
||||
* Data rolls over to start of buffer if end of buffer reached (option to overwrite start)
|
||||
* Data is never shifted/moved inside buffer, only references are adjusted
|
||||
* Never zero terminates buffer
|
||||
* Can only look at data by copying (stitching) to another buffer
|
||||
*/
|
||||
|
||||
class CRollingBuffer
|
||||
{
|
||||
private:
|
||||
// Buffer Definition
|
||||
char * Buffer; // Memory allocated to buffer
|
||||
const int BufSize; // Size of allocated buffer
|
||||
char * Buffer; // Memory allocated to buffer
|
||||
const int BufSize; // Size of allocated buffer
|
||||
int BufLen; // Total unread characters in buffer
|
||||
|
||||
// Temporary output buffer
|
||||
char * OutBuffer; // Temporary output buffer for "stitched" (rollover) data
|
||||
|
||||
// Buffer pointers
|
||||
int BufStart; // First unread characters on buffer
|
||||
int BufStart; // First unread characters in buffer
|
||||
int BufEnd; // Next write position for new data (End of unread data + 1)
|
||||
int BufLen; // Total unread characters on buffer
|
||||
|
||||
public:
|
||||
// Life Cycle
|
||||
CRollingBuffer( int BufferSize );
|
||||
virtual ~CRollingBuffer();
|
||||
|
||||
// Direct Operations
|
||||
int Reset(); // Clear buffer and reset all pointers to start of buffer
|
||||
|
||||
// Reading from buffer
|
||||
char PeekChar( int Pos = 0 ); // Return one character from buffer (do not remove from buffer
|
||||
int PeekDirect( char ** Data, int PeekPos = 0 ); // Return contiguous data pointer direct to buffer (continguous data couont returned)
|
||||
int Peek( char ** Data, int PeekPos = 0, int MaxLen = -1 ); // Return stiched data copied to temporary output buffer
|
||||
int PeekCopy( char ** Data, int PeekPos = 0, int MaxLen = -1 ); // Return stiched data copied to supplied pointer (create if not exist)
|
||||
|
||||
bool FindStr( const char * SearchStr, int SearchLen, int &FoundPos, int StartPos = 0 ); // Search buffer directly
|
||||
|
||||
// Change data on buffer
|
||||
virtual int Push( bool Overwrite, const char * Data, int Len = -1 );
|
||||
virtual int Clear( int ClearLen = -1 );
|
||||
|
||||
virtual int Pop( char ** Data, int MaxLen = -1 );
|
||||
virtual int PopCopy( char ** Data, int MaxLen = -1 );
|
||||
|
||||
// File operations
|
||||
virtual int ReadFromFD( int Handle, int MaxRead = -1, bool Overwrite = false );
|
||||
virtual int WriteToFD( int Handle, int MaxWrite = -1 );
|
||||
|
||||
// Miscellaneous
|
||||
int Size() { return BufSize; };
|
||||
int Len() { return BufLen; };
|
||||
};
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
class CShiftBuffer
|
||||
{
|
||||
private:
|
||||
// Buffer Definition
|
||||
char * Buffer; // Memory allocated to buffer
|
||||
const int BufSize; // Size of allocated buffer
|
||||
int BufLen; // Total unread characters in buffer
|
||||
|
||||
// Temporary output buffer
|
||||
char * OutBuffer; // Temporary output buffer for "stitched" (rollover) data
|
||||
|
||||
public:
|
||||
// Life Cycle
|
||||
CBuffer( int BufferSize );
|
||||
~CBuffer();
|
||||
CShiftBuffer( int BufferSize );
|
||||
virtual ~CShiftBuffer();
|
||||
|
||||
// Direct Operations
|
||||
int Reset();
|
||||
int Set( const char * Data, int Len = -1 );
|
||||
int Peek( char ** Data, int PeekPos = 0, int MaxLen = -1 );
|
||||
int PeekCopy( char ** Data, int PeekPos = 0, int MaxLen = -1 );
|
||||
int Clear( int ClearLen = -1 );
|
||||
int Reset(); // Clear buffer and reset all pointers to start of buffer
|
||||
|
||||
// FiFo operations
|
||||
int Push( const char * Data, int Len = -1 );
|
||||
int Pop( char ** Data, int MaxLen = -1 );
|
||||
int PopCopy( char ** Data, int MaxLen = -1 );
|
||||
// Reading from buffer
|
||||
char PeekChar( int Pos = 0 ); // Return one character from buffer (do not remove from buffer
|
||||
int PeekDirect( char ** Data, int PeekPos = 0 ); // Return contiguous data pointer direct to buffer (continguous data couont returned)
|
||||
int Peek( char ** Data, int PeekPos = 0, int MaxLen = -1 ); // Return stiched data copied to temporary output buffer
|
||||
int PeekCopy( char ** Data, int PeekPos = 0, int MaxLen = -1 ); // Return stiched data copied to supplied pointer (create if not exist)
|
||||
|
||||
bool FindStr( const char * SearchStr, int SearchLen, int &FoundPos, int StartPos = 0 ); // Search buffer directly
|
||||
|
||||
// Chagne data on buffer
|
||||
virtual int Push( bool Overwrite, const char * Data, int Len = -1 );
|
||||
virtual int Clear( int ClearLen = -1 );
|
||||
|
||||
virtual int Pop( char ** Data, int MaxLen = -1 );
|
||||
virtual int PopCopy( char ** Data, int MaxLen = -1 );
|
||||
|
||||
// File operations
|
||||
int ReadFromFD( int Handle, int MaxRead = -1 );
|
||||
int WriteToFD( int Handle, int MaxWrite = -1 );
|
||||
|
||||
// Character Operations
|
||||
char PeekChar( int Pos = 0, bool ClearChar = false );
|
||||
bool FindStr( const char * SearchStr, int SearchLen, int &FoundPos, int StartPos = 0 );
|
||||
virtual int ReadFromFD( int Handle, int MaxRead = -1 );
|
||||
virtual int WriteToFD( int Handle, int MaxWrite = -1 );
|
||||
|
||||
// Miscellaneous
|
||||
inline int Size() { return BufSize; };
|
||||
inline int Len() { return BufLen; };
|
||||
int Size() { return BufSize; };
|
||||
int Len() { return BufLen; };
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
#endif /* REDACORE_BUFFERCORE_H_ */
|
||||
|
||||
Reference in New Issue
Block a user