- Library Clean up: - Removed all unused C/C++ libraries from source - First C/C++ libraries then redA libraries - Library changes: - renamed BufferCore -> CharBufferCore - added ItemBufferCore - CharBufferCore: - Derive RollingBuffer & ShiftBuffer from common class CharBuffer - CharBuffer is mostly a virtual class (interface)
147 lines
5.9 KiB
C++
147 lines
5.9 KiB
C++
/*
|
|
* CharBufferCore.h
|
|
*
|
|
* Created on: 18 May 2016
|
|
* Author: wentzelc
|
|
*/
|
|
|
|
#ifndef REDACORE_CHARBUFFERCORE_H_
|
|
#define REDACORE_CHARBUFFERCORE_H_
|
|
|
|
// Standard C/C++ Libraries
|
|
/* none */
|
|
|
|
// redA Libraries
|
|
/* none */
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
/** Shift and Rolling buffer class
|
|
*
|
|
* Char Buffer:
|
|
* Virtual definition of core parameters and buffer interface
|
|
*
|
|
* 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 CCharBuffer
|
|
{
|
|
protected:
|
|
// 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
|
|
CCharBuffer( int BufferSize );
|
|
virtual ~CCharBuffer();
|
|
|
|
// Direct Operations
|
|
virtual int Reset(); // Clear buffer and reset all pointers to start of buffer
|
|
|
|
// Reading from buffer
|
|
virtual char PeekChar( int Pos = 0 ) = 0; // Return one character from buffer (do not remove from buffer
|
|
virtual int PeekDirect( char ** Data, int PeekPos = 0 ) = 0; // Return contiguous data pointer direct to buffer (continguous data couont returned)
|
|
virtual int Peek( char ** Data, int PeekPos = 0, int MaxLen = -1 ) = 0; // Return stiched data copied to temporary output buffer
|
|
virtual int PeekCopy( char ** Data, int PeekPos = 0, int MaxLen = -1 ) = 0; // Return stiched data copied to supplied pointer (create if not exist)
|
|
|
|
virtual bool FindStr( const char * SearchStr, int SearchLen, int &FoundPos, int StartPos = 0 ) = 0; // Search buffer directly
|
|
|
|
// Change data on buffer
|
|
virtual int Push( bool Overwrite, const char * Data, int Len = -1 ) = 0; // Add Bytes to the end of the buffer
|
|
virtual int Clear( int ClearLen = -1 ) = 0; // Clear Bytes from start of buffer
|
|
|
|
virtual int Pop( char ** Data, int MaxLen = -1 ); // Read and remove bytes from start of buffer
|
|
virtual int PopCopy( char ** Data, int MaxLen = -1 ); // Same as Pop() except it returns a copy of the bytes in a new pointer
|
|
|
|
// File operations
|
|
virtual int ReadFromFD( int Handle, int MaxRead = -1, bool Overwrite = false ) = 0; // Read directly from file descriptor into buffer (speed advantage)
|
|
virtual int WriteToFD( int Handle, int MaxWrite = -1 ) = 0; // Write directly to file descriptor from buffer (speed advantage)
|
|
|
|
// Miscellaneous
|
|
int Size() { return BufSize; }; // Returns number of total size of buffer (used and empty)
|
|
int Len() { return BufLen; }; // Returns number of bytes stored in buffer
|
|
};
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
class CRollingBuffer : public CCharBuffer
|
|
{
|
|
protected:
|
|
// Buffer pointers
|
|
int BufStart; // First unread characters in buffer
|
|
int BufEnd; // Next write position for new data (End of unread data + 1)
|
|
|
|
public:
|
|
// Life Cycle
|
|
CRollingBuffer( int BufferSize );
|
|
virtual ~CRollingBuffer() {};
|
|
|
|
// Direct Operations
|
|
virtual int Reset();
|
|
|
|
// Reading from buffer
|
|
virtual char PeekChar( int Pos = 0 );
|
|
virtual int PeekDirect( char ** Data, int PeekPos = 0 );
|
|
virtual int Peek( char ** Data, int PeekPos = 0, int MaxLen = -1 );
|
|
virtual int PeekCopy( char ** Data, int PeekPos = 0, int MaxLen = -1 );
|
|
|
|
virtual bool FindStr( const char * SearchStr, int SearchLen, int &FoundPos, int StartPos = 0 );
|
|
|
|
// Change data on buffer
|
|
virtual int Push( bool Overwrite, const char * Data, int Len = -1 );
|
|
virtual int Clear( int ClearLen = -1 );
|
|
|
|
// File operations
|
|
virtual int ReadFromFD( int Handle, int MaxRead = -1, bool Overwrite = false );
|
|
virtual int WriteToFD( int Handle, int MaxWrite = -1 );
|
|
};
|
|
//---------------------------------------------------------------------------
|
|
|
|
class CShiftBuffer : public CCharBuffer
|
|
{
|
|
public:
|
|
// Life Cycle
|
|
CShiftBuffer( int BufferSize );
|
|
virtual ~CShiftBuffer() {};
|
|
|
|
// Reading from buffer
|
|
virtual char PeekChar( int Pos = 0 );
|
|
virtual int PeekDirect( char ** Data, int PeekPos = 0 );
|
|
virtual int Peek( char ** Data, int PeekPos = 0, int MaxLen = -1 );
|
|
virtual int PeekCopy( char ** Data, int PeekPos = 0, int MaxLen = -1 );
|
|
|
|
virtual bool FindStr( const char * SearchStr, int SearchLen, int &FoundPos, int StartPos = 0 );
|
|
|
|
// Change data on buffer
|
|
virtual int Push( bool Overwrite, const char * Data, int Len = -1 );
|
|
virtual int Clear( int ClearLen = -1 );
|
|
|
|
// File operations
|
|
virtual int ReadFromFD( int Handle, int MaxRead = -1, bool Overwrite = false );
|
|
virtual int WriteToFD( int Handle, int MaxWrite = -1 );
|
|
};
|
|
//---------------------------------------------------------------------------
|
|
|
|
#endif /* REDACORE_CHARBUFFERCORE_H_ */
|