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