|
|
@@ -1,186 +1,187 @@
|
|
|
-
|
|
|
-/////////////////////////////////////////////////////////////
|
|
|
-// Function name : RingBuffer::GetMessageHead
|
|
|
-// Description : This will get a pointer to the fist undelivered data in buffer
|
|
|
-// Return type : char *
|
|
|
-// Argument : void
|
|
|
-//////////////////////////////////////////////////////////
|
|
|
-inline char * RingBuffer::GetMessageHead(void)
|
|
|
-{
|
|
|
- return _Buffer+_StartPos;
|
|
|
-}
|
|
|
-/////////////////////////////////////////////////////////////
|
|
|
-// Function name : RingBuffer::GetBufferOpen
|
|
|
-// Description : This will get the first writabe section of the buffer space
|
|
|
-// Return type :
|
|
|
-// Argument : void
|
|
|
-//////////////////////////////////////////////////////////
|
|
|
-inline char * RingBuffer::GetBufferOpen(void)
|
|
|
-{
|
|
|
- return _Buffer+_EndPos;
|
|
|
-}
|
|
|
-/////////////////////////////////////////////////////////////
|
|
|
-// Function name : RingBuffer::ForceWindowSlide
|
|
|
-// Description : Will force a compression of data // shift left to start position
|
|
|
-// Return type : inline void
|
|
|
-// Argument : void
|
|
|
-//////////////////////////////////////////////////////////
|
|
|
-inline void RingBuffer::ForceWindowSlide(void)
|
|
|
-{
|
|
|
- size_t len = AmountBuffered();
|
|
|
- if(len > 0 && _StartPos != 0) // basic flush left..
|
|
|
- {
|
|
|
- memmove(_Buffer,GetMessageHead(),len);
|
|
|
- _StartPos = 0;
|
|
|
- _EndPos = len;
|
|
|
- }
|
|
|
-}
|
|
|
-/////////////////////////////////////////////////////////////
|
|
|
-// Function name : RingBuffer::AmountBuffered
|
|
|
-// Description : Will report the number of unread chars in buffer
|
|
|
-// Return type : int
|
|
|
-// Argument : void
|
|
|
-//////////////////////////////////////////////////////////
|
|
|
-inline size_t RingBuffer::AmountBuffered(void)
|
|
|
-{
|
|
|
- return _EndPos - _StartPos;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-/////////////////////////////////////////////////////////////
|
|
|
-// Function name : RingBuffer::BufferAvailabe
|
|
|
-// Description : Will report amount of data that is contiguas that can be writen at
|
|
|
-// the location returned by GetBufferOpen
|
|
|
-// Return type : inline int
|
|
|
-// Argument : void
|
|
|
-//////////////////////////////////////////////////////////
|
|
|
-inline size_t RingBuffer::BufferAvailabe(void)
|
|
|
-{
|
|
|
- return GetBufferSize() - _EndPos;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-/////////////////////////////////////////////////////////////
|
|
|
-// Function name : RingBuffer::ResetContent
|
|
|
-// Description : Throw away all inread information
|
|
|
-// Return type : void
|
|
|
-// Argument : void
|
|
|
-//////////////////////////////////////////////////////////
|
|
|
-void RingBuffer::ResetContent(void)
|
|
|
-{
|
|
|
- _StartPos = 0;
|
|
|
- _EndPos = 0;
|
|
|
-}
|
|
|
-/////////////////////////////////////////////////////////////
|
|
|
-// Function name : RingBuffer::RingBuffer
|
|
|
-// Description :
|
|
|
-// Return type : inline
|
|
|
-// Argument : int in_size
|
|
|
-//////////////////////////////////////////////////////////
|
|
|
-inline RingBuffer::RingBuffer(size_t in_size) : MemBuffer(in_size)
|
|
|
-{
|
|
|
- _EndPos = 0;
|
|
|
- _StartPos = 0;
|
|
|
-}
|
|
|
-/////////////////////////////////////////////////////////////
|
|
|
-// Function name : RingBuffer::FullCompress
|
|
|
-// Description : Force a compress of the data
|
|
|
-// Return type : inline void
|
|
|
-// Argument : void
|
|
|
-//////////////////////////////////////////////////////////
|
|
|
-inline void RingBuffer::FullCompress(void)
|
|
|
-{
|
|
|
- if(_StartPos == _EndPos)
|
|
|
- {
|
|
|
- _StartPos = 0;
|
|
|
- _EndPos = 0;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ForceWindowSlide();
|
|
|
- }
|
|
|
-}
|
|
|
-/////////////////////////////////////////////////////////////
|
|
|
-// Function name : RingBuffer::Compress
|
|
|
-// Description : Try and do a intelegent compress of the data space
|
|
|
-// the algorithem is really stupid right know.. just say if i have
|
|
|
-// read past 1/2 my space do a compress...Im open for sugestions
|
|
|
-//
|
|
|
-//
|
|
|
-// Return type : inline void
|
|
|
-// Argument : void
|
|
|
-//////////////////////////////////////////////////////////
|
|
|
-inline void RingBuffer::Compress(void)
|
|
|
-{
|
|
|
- if(_StartPos == _EndPos)
|
|
|
- {
|
|
|
- _StartPos = 0;
|
|
|
- _EndPos = 0;
|
|
|
- }
|
|
|
- else if(_StartPos >= GetBufferSize() / 2)
|
|
|
- {
|
|
|
- ForceWindowSlide();
|
|
|
- }
|
|
|
-}
|
|
|
-/////////////////////////////////////////////////////////////
|
|
|
-// Function name : RingBuffer::Put
|
|
|
-// Description : Adds Data to a ring Buffer
|
|
|
-// Will do a compress if needed so pointers suplied by Get Call are no longer valide
|
|
|
-//
|
|
|
-// Return type : inline bool
|
|
|
-// Argument : char * data
|
|
|
-// Argument : int len
|
|
|
-//////////////////////////////////////////////////////////
|
|
|
-inline bool RingBuffer::Put(const char * data, size_t len)
|
|
|
-{
|
|
|
- bool answer = false;
|
|
|
-
|
|
|
- if(len > BufferAvailabe() )
|
|
|
- Compress();
|
|
|
-
|
|
|
- if(len <= BufferAvailabe() )
|
|
|
- {
|
|
|
- memcpy(GetBufferOpen(),data,len);
|
|
|
- _EndPos += len;
|
|
|
- answer = true;
|
|
|
- }
|
|
|
- return answer;
|
|
|
-}
|
|
|
-////////////////////////////////////////////////////////////////////
|
|
|
-// Function name : RingBuffer::PutFast
|
|
|
-// Description :
|
|
|
-//
|
|
|
-// Return type : inline bool
|
|
|
-// Argument : const char * data
|
|
|
-// Argument : int len
|
|
|
-////////////////////////////////////////////////////////////////////
|
|
|
-inline bool RingBuffer::PutFast(const char * data, size_t len)
|
|
|
-{
|
|
|
- // no checking be carefull
|
|
|
- memcpy(GetBufferOpen(),data,len); // should i be using memcopy..
|
|
|
- _EndPos += len;
|
|
|
- return true;
|
|
|
-}
|
|
|
-
|
|
|
-/////////////////////////////////////////////////////////////
|
|
|
-// Function name : RingBuffer::Get
|
|
|
-// Description : will copy the data ..
|
|
|
-// false indicates not enogh data to read .. sorry...
|
|
|
-//
|
|
|
-// Return type : inline bool
|
|
|
-// Argument : char * data
|
|
|
-// Argument : int len
|
|
|
-//////////////////////////////////////////////////////////
|
|
|
-inline bool RingBuffer::Get(char * data, size_t len)
|
|
|
-{
|
|
|
- bool answer = false;
|
|
|
-
|
|
|
- if(len <= AmountBuffered() )
|
|
|
- {
|
|
|
- memcpy(data,GetMessageHead(),len);
|
|
|
- _StartPos += len;
|
|
|
- Compress();
|
|
|
- answer = true;
|
|
|
- }
|
|
|
- return answer;
|
|
|
-}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////
|
|
|
+// Function name : RingBuffer::GetMessageHead
|
|
|
+// Description : This will get a pointer to the fist undelivered data in buffer
|
|
|
+// Return type : char *
|
|
|
+// Argument : void
|
|
|
+//////////////////////////////////////////////////////////
|
|
|
+inline char * RingBuffer::GetMessageHead(void)
|
|
|
+{
|
|
|
+ return _Buffer+_StartPos;
|
|
|
+}
|
|
|
+/////////////////////////////////////////////////////////////
|
|
|
+// Function name : RingBuffer::GetBufferOpen
|
|
|
+// Description : This will get the first writabe section of the buffer space
|
|
|
+// Return type :
|
|
|
+// Argument : void
|
|
|
+//////////////////////////////////////////////////////////
|
|
|
+inline char * RingBuffer::GetBufferOpen(void)
|
|
|
+{
|
|
|
+ return _Buffer+_EndPos;
|
|
|
+}
|
|
|
+/////////////////////////////////////////////////////////////
|
|
|
+// Function name : RingBuffer::ForceWindowSlide
|
|
|
+// Description : Will force a compression of data // shift left to start position
|
|
|
+// Return type : inline void
|
|
|
+// Argument : void
|
|
|
+//////////////////////////////////////////////////////////
|
|
|
+inline void RingBuffer::ForceWindowSlide(void)
|
|
|
+{
|
|
|
+ size_t len = AmountBuffered();
|
|
|
+ if(len > 0 && _StartPos != 0) // basic flush left..
|
|
|
+ {
|
|
|
+ memmove(_Buffer,GetMessageHead(),len);
|
|
|
+ _StartPos = 0;
|
|
|
+ _EndPos = len;
|
|
|
+ }
|
|
|
+}
|
|
|
+/////////////////////////////////////////////////////////////
|
|
|
+// Function name : RingBuffer::AmountBuffered
|
|
|
+// Description : Will report the number of unread chars in buffer
|
|
|
+// Return type : int
|
|
|
+// Argument : void
|
|
|
+//////////////////////////////////////////////////////////
|
|
|
+inline size_t RingBuffer::AmountBuffered(void)
|
|
|
+{
|
|
|
+ return _EndPos - _StartPos;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////
|
|
|
+// Function name : RingBuffer::BufferAvailabe
|
|
|
+// Description : Will report amount of data that is contiguas that can be writen at
|
|
|
+// the location returned by GetBufferOpen
|
|
|
+// Return type : inline int
|
|
|
+// Argument : void
|
|
|
+//////////////////////////////////////////////////////////
|
|
|
+inline size_t RingBuffer::BufferAvailabe(void)
|
|
|
+{
|
|
|
+ return GetBufferSize() - _EndPos;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////
|
|
|
+// Function name : RingBuffer::ResetContent
|
|
|
+// Description : Throw away all inread information
|
|
|
+// Return type : void
|
|
|
+// Argument : void
|
|
|
+//////////////////////////////////////////////////////////
|
|
|
+void RingBuffer::ResetContent(void)
|
|
|
+{
|
|
|
+ _StartPos = 0;
|
|
|
+ _EndPos = 0;
|
|
|
+}
|
|
|
+/////////////////////////////////////////////////////////////
|
|
|
+// Function name : RingBuffer::RingBuffer
|
|
|
+// Description :
|
|
|
+// Return type : inline
|
|
|
+// Argument : int in_size
|
|
|
+//////////////////////////////////////////////////////////
|
|
|
+inline RingBuffer::RingBuffer(size_t in_size) : MemBuffer(in_size)
|
|
|
+{
|
|
|
+ _EndPos = 0;
|
|
|
+ _StartPos = 0;
|
|
|
+}
|
|
|
+/////////////////////////////////////////////////////////////
|
|
|
+// Function name : RingBuffer::FullCompress
|
|
|
+// Description : Force a compress of the data
|
|
|
+// Return type : inline void
|
|
|
+// Argument : void
|
|
|
+//////////////////////////////////////////////////////////
|
|
|
+inline void RingBuffer::FullCompress(void)
|
|
|
+{
|
|
|
+ if(_StartPos == _EndPos)
|
|
|
+ {
|
|
|
+ _StartPos = 0;
|
|
|
+ _EndPos = 0;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ForceWindowSlide();
|
|
|
+ }
|
|
|
+}
|
|
|
+/////////////////////////////////////////////////////////////
|
|
|
+// Function name : RingBuffer::Compress
|
|
|
+// Description : Try and do a intelegent compress of the data space
|
|
|
+// the algorithem is really stupid right know.. just say if i have
|
|
|
+// read past 1/2 my space do a compress...Im open for sugestions
|
|
|
+//
|
|
|
+//
|
|
|
+// Return type : inline void
|
|
|
+// Argument : void
|
|
|
+//////////////////////////////////////////////////////////
|
|
|
+inline void RingBuffer::Compress(void)
|
|
|
+{
|
|
|
+ if(_StartPos == _EndPos)
|
|
|
+ {
|
|
|
+ _StartPos = 0;
|
|
|
+ _EndPos = 0;
|
|
|
+ }
|
|
|
+ else if(_StartPos >= GetBufferSize() / 2)
|
|
|
+ {
|
|
|
+ ForceWindowSlide();
|
|
|
+ }
|
|
|
+}
|
|
|
+/////////////////////////////////////////////////////////////
|
|
|
+// Function name : RingBuffer::Put
|
|
|
+// Description : Adds Data to a ring Buffer
|
|
|
+// Will do a compress if needed so pointers suplied by Get Call are no longer valide
|
|
|
+//
|
|
|
+// Return type : inline bool
|
|
|
+// Argument : char * data
|
|
|
+// Argument : int len
|
|
|
+//////////////////////////////////////////////////////////
|
|
|
+inline bool RingBuffer::Put(const char * data, size_t len)
|
|
|
+{
|
|
|
+ bool answer = false;
|
|
|
+
|
|
|
+ if(len > BufferAvailabe() )
|
|
|
+ Compress();
|
|
|
+
|
|
|
+ if(len <= BufferAvailabe() )
|
|
|
+ {
|
|
|
+ memcpy(GetBufferOpen(),data,len);
|
|
|
+ _EndPos += len;
|
|
|
+ answer = true;
|
|
|
+ }
|
|
|
+ return answer;
|
|
|
+}
|
|
|
+////////////////////////////////////////////////////////////////////
|
|
|
+// Function name : RingBuffer::PutFast
|
|
|
+// Description :
|
|
|
+//
|
|
|
+// Return type : inline bool
|
|
|
+// Argument : const char * data
|
|
|
+// Argument : int len
|
|
|
+////////////////////////////////////////////////////////////////////
|
|
|
+inline bool RingBuffer::PutFast(const char * data, size_t len)
|
|
|
+{
|
|
|
+ // no checking be carefull
|
|
|
+ memcpy(GetBufferOpen(),data,len); // should i be using memcopy..
|
|
|
+ _EndPos += len;
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////
|
|
|
+// Function name : RingBuffer::Get
|
|
|
+// Description : will copy the data ..
|
|
|
+// false indicates not enogh data to read .. sorry...
|
|
|
+//
|
|
|
+// Return type : inline bool
|
|
|
+// Argument : char * data
|
|
|
+// Argument : int len
|
|
|
+//////////////////////////////////////////////////////////
|
|
|
+inline bool RingBuffer::Get(char * data, size_t len)
|
|
|
+{
|
|
|
+ bool answer = false;
|
|
|
+
|
|
|
+ if(len <= AmountBuffered() )
|
|
|
+ {
|
|
|
+ memcpy(data,GetMessageHead(),len);
|
|
|
+ _StartPos += len;
|
|
|
+ Compress();
|
|
|
+ answer = true;
|
|
|
+ }
|
|
|
+ return answer;
|
|
|
+}
|
|
|
+
|