Files
redAcore/CharBufferCore.h
Charl Wentzel 2f81d1fbbe Important Update:
- 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)
2017-07-22 17:46:05 +02:00

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_ */