Files
redAcore/BufferCore.h
Charl Wentzel 5b4e6822c7 Bug fixes:
- Fixed bugs on CRollingBuffer and CShiftBuffer
  - Remove "virtual" from methods declarations
  - Correct validation checks on methods
  - Use memmove to shift data in ShiftBuffer
  - Initialise buffer in RollingBuffer
  - FindStr() -> Return start position of match
  - Fix incorrect params passed to Peek()/PeekCopy() in Pop()/PopCopy()
  - Fix endless lopp in RollingBuffer::Push()
2017-03-22 07:52:58 +02:00

131 lines
4.9 KiB
C++

/*
* BufferCore.h
*
* Created on: 18 May 2016
* Author: wentzelc
*/
#ifndef REDACORE_BUFFERCORE_H_
#define REDACORE_BUFFERCORE_H_
// redA Libraries
/* none */
// Standard C/C++ Libraries
/* none */
//---------------------------------------------------------------------------
/** 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
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 in buffer
int BufEnd; // Next write position for new data (End of unread data + 1)
public:
// Life Cycle
CRollingBuffer( int BufferSize );
~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
int Push( bool Overwrite, const char * Data, int Len = -1 );
int Clear( int ClearLen = -1 );
int Pop( char ** Data, int MaxLen = -1 );
int PopCopy( char ** Data, int MaxLen = -1 );
// File operations
int ReadFromFD( int Handle, int MaxRead = -1, bool Overwrite = false );
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
CShiftBuffer( int BufferSize );
~CShiftBuffer();
// 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
int Push( bool Overwrite, const char * Data, int Len = -1 );
int Clear( int ClearLen = -1 );
int Pop( char ** Data, int MaxLen = -1 );
int PopCopy( char ** Data, int MaxLen = -1 );
// File operations
int ReadFromFD( int Handle, int MaxRead = -1 );
int WriteToFD( int Handle, int MaxWrite = -1 );
// Miscellaneous
int Size() { return BufSize; };
int Len() { return BufLen; };
};
//---------------------------------------------------------------------------
#endif /* REDACORE_BUFFERCORE_H_ */