环行缓冲区的实现(V0.2,C++源码)
来源:互联网 发布:淘宝网中老年女装 编辑:程序博客网 时间:2024/05/22 00:12
- #ifndef FengRingBufH
- #define FengRingBufH
- #include <ctype.h> //for size_t定义
- #include <assert.h> //for assert()
- template<class TYPE = unsigned char>
- class TFengRingBuf
- {
- public:
-
- TFengRingBuf(size_t size = 0);
-
- virtual ~TFengRingBuf(void);
-
- inline size_t Size(void);
-
- size_t Len(void);
-
- TYPE operator[](size_t pos);
-
- inline void Reset(void);
-
- void ReSize(size_t size);
-
- size_t Push(TYPE *buf, size_t len);
-
- size_t Push(TFengRingBuf<TYPE>& buf, size_t len);
-
- TYPE* Get(size_t& len);
-
- size_t Get(TYPE *buf, size_t len);
-
- TYPE* Pop(size_t& len);
-
- size_t Pop(TYPE *buf, size_t len);
-
- size_t Pop(TFengRingBuf<TYPE>& buf, size_t& len);
-
- TYPE* WriteBuf(size_t size = 0);
-
- inline size_t SizeOfWriteBuf(void);
-
- inline size_t& LenOfWriteBuf(void);
-
- size_t CommitWriteBuf(size_t len);
-
- TYPE* ReadBuf(size_t size = 0);
-
- inline size_t SizeOfReadBuf(void);
-
- inline size_t& PosOfReadBuf(void);
-
- size_t CommitReadBuf(size_t len);
- private:
- TYPE *_buf;
- size_t _pRead;
- size_t _pWrite;
- size_t _size;
- TYPE *_writeBuf;
- size_t _sizeWriteBuf;
- size_t _lenWriteBuf;
- bool _isWriteBufTemp;
- TYPE *_readBuf;
- size_t _sizeReadBuf;
- size_t _posReadBuf;
- bool _isReadBufTemp;
- };
- template<class TYPE>
- TFengRingBuf<TYPE>::TFengRingBuf(size_t size)
- {
- _pRead = _pWrite = 0;
- _buf = new TYPE[size + 1];
- assert(NULL != _buf);
- _size = size;
- _writeBuf = NULL;
- _sizeWriteBuf = 0;
- _lenWriteBuf = 0;
- _isWriteBufTemp = false;
- _readBuf = NULL;
- _sizeReadBuf = 0;
- _posReadBuf = 0;
- _isReadBufTemp = false;
- }
- template<class TYPE>
- TFengRingBuf<TYPE>::~TFengRingBuf(void)
- {
- if(0 != SizeOfWriteBuf()) CommitWriteBuf(0);
- if(0 != SizeOfReadBuf()) CommitReadBuf(0);
- delete[] _buf;
- }
- template<class TYPE>
- size_t TFengRingBuf<TYPE>::Size(void)
- {
- return _size;
- }
- template<class TYPE>
- size_t TFengRingBuf<TYPE>::Len(void)
- {
- return ((_pWrite+Size()+1) - _pRead) % (Size()+1);
- }
- template<class TYPE>
- TYPE TFengRingBuf<TYPE>::operator[](size_t pos)
- {
- return _buf[(_pRead+pos)%(Size()+1)];
- }
- template<class TYPE>
- void TFengRingBuf<TYPE>::Reset(void)
- {
- _pRead = _pWrite = 0;
- }
- template<class TYPE>
- void TFengRingBuf<TYPE>::ReSize(size_t size)
- {
- if(0 != SizeOfWriteBuf()) return;
-
- size_t len;
- TYPE *buf = Get(len);
- delete[] _buf;
- Reset();
- _buf = new TYPE[size + 1];
- _size = size;
- assert(NULL != _buf);
- Push(buf, len);
- delete[] buf;
- }
- template<class TYPE>
- size_t TFengRingBuf<TYPE>::Push(TYPE *buf, size_t len)
- {
- if(0 != SizeOfWriteBuf()) return 0;
-
- if(len > Size() - Len())
- {
- size_t oldLen = len;
- len = Size() - Len();
- buf += oldLen - len;
- }
- if(0 == len) return 0;
-
- size_t tryMove = (0 == _pRead) ?
- Size()+1-_pWrite-1 : Size()+1-_pWrite;
- if( tryMove >= len)
- {
- memcpy(&_buf[_pWrite], buf, sizeof(TYPE)*len);
- }
- else
- {
- memcpy(&_buf[_pWrite], buf, sizeof(TYPE)*tryMove);
- memcpy(&_buf[0], &buf[tryMove], sizeof(TYPE)*(len - tryMove));
- }
-
- _pWrite += len;
- _pWrite %= Size() + 1;
- return len;
- }
- template<class TYPE>
- size_t TFengRingBuf<TYPE>::Push(TFengRingBuf<TYPE>& buf, size_t len)
- {
- if(0 != SizeOfWriteBuf()) return 0;
- size_t ret, tempLen;
- tempLen = len > buf.Len() ? buf.Len() : len;
- TYPE *tempBuf = new TYPE[tempLen];
- tempLen = buf.Get(tempBuf, tempLen);
- ret = Push(tempBuf, tempLen);
- delete[] tempBuf;
- return ret;
- }
- template<class TYPE>
- TYPE * TFengRingBuf<TYPE>::Get(size_t& len)
- {
- TYPE *buf(NULL);
- len = Len();
- if(0 != len)
- {
- buf = new TYPE[Len()];
- Get(buf, Len());
- }
- return buf;
- }
- template<class TYPE>
- size_t TFengRingBuf<TYPE>::Get(TYPE *buf, size_t len)
- {
-
- if(len > Len())
- {
- len = Len();
- }
-
- size_t tryMove = (_pWrite > _pRead) ?
- _pWrite - _pRead : (Size()+1 - _pRead);
- if(len <= tryMove)
- {
- memcpy(buf, &_buf[_pRead], len);
- }
- else
- {
- memcpy(&buf[0], &_buf[_pRead], tryMove);
- memcpy(&buf[tryMove], &_buf[0], len-tryMove);
- }
- return len;
- }
- template<class TYPE>
- size_t TFengRingBuf<TYPE>::Pop(TYPE *buf, size_t len)
- {
- if(0 != SizeOfReadBuf()) return 0;
- len = Get(buf, len);
- _pRead += len;
- _pRead %= Size() + 1;
- return len;
- }
- template<class TYPE>
- TYPE * TFengRingBuf<TYPE>::Pop(size_t& len)
- {
- len = 0;
- if(0 != SizeOfReadBuf()) return NULL;
- TYPE *buf = Get(len);
- _pRead += len;
- _pRead %= Size() + 1;
- return buf;
- }
- template<class TYPE>
- size_t TFengRingBuf<TYPE>::Pop(TFengRingBuf<TYPE>& buf, size_t& len)
- {
- if(0 != SizeOfReadBuf()) return 0;
- if(len > this->Len())
- {
- len = this->Len();
- }
- size_t ret = buf.Push(*this, len);
- _pRead += len;
- _pRead %= Size() + 1;
- return ret;
- }
- template<class TYPE>
- TYPE* TFengRingBuf<TYPE>::WriteBuf(size_t size)
- {
- if(0 == size) return _writeBuf;
- if(0 != _sizeWriteBuf && 0 != size) return NULL;
- _sizeWriteBuf = size;
- _lenWriteBuf = 0;
- if(Size()+1 - _pWrite >= size)
- {
- _writeBuf = &_buf[_pWrite];
- _isWriteBufTemp = false;
- }
- else
- {
- _writeBuf = new TYPE[size];
- assert(NULL != _writeBuf);
- _isWriteBufTemp = true;
- }
- return _writeBuf;
- }
- template<class TYPE>
- size_t TFengRingBuf<TYPE>::SizeOfWriteBuf(void)
- {
- return _sizeWriteBuf;
- }
- template<class TYPE>
- size_t& TFengRingBuf<TYPE>::LenOfWriteBuf(void)
- {
- return _lenWriteBuf;
- }
- template<class TYPE>
- size_t TFengRingBuf<TYPE>::CommitWriteBuf(size_t len)
- {
- if(0 == _sizeWriteBuf) return 0;
- if(len > _sizeWriteBuf) len = _sizeWriteBuf;
- TYPE *pOuterBuf = _writeBuf;
- _writeBuf = NULL;
- _sizeWriteBuf = 0;
- if(_isWriteBufTemp)
- {
- len = Push(pOuterBuf, len);
- delete[] pOuterBuf;
- _isWriteBufTemp = false;
- }
- else
- {
- _pWrite += len;
- }
- _lenWriteBuf = 0;
- return len;
- }
- template<class TYPE>
- TYPE* TFengRingBuf<TYPE>::ReadBuf(size_t size)
- {
- if(size > Len()) size = Len();
- if(0 == size) return _readBuf;
- if(0 != _sizeReadBuf && 0 != size) return NULL;
- if(Size()+1 - _pRead >= size)
- {
- _readBuf = &_buf[_pRead];
- _isReadBufTemp = false;
- }
- else
- {
- _readBuf = new TYPE[size];
- assert(NULL != _readBuf);
- Get(_readBuf, size);
- _isReadBufTemp = true;
- }
- _sizeReadBuf = size;
- _posReadBuf = 0;
- return _readBuf;
- }
- template<class TYPE>
- size_t TFengRingBuf<TYPE>::SizeOfReadBuf(void)
- {
- return _sizeReadBuf;
- }
- template<class TYPE>
- size_t& TFengRingBuf<TYPE>::PosOfReadBuf(void)
- {
- return _posReadBuf;
- }
- template<class TYPE>
- size_t TFengRingBuf<TYPE>::CommitReadBuf(size_t len)
- {
- if(len > Len()) len = Len();
- _pRead += len;
- _pRead %= Size() + 1;
- if(0 == _sizeReadBuf) return 0;
- if(_isReadBufTemp)
- {
- delete[] _readBuf;
- _isReadBufTemp = false;
- }
- _posReadBuf = 0;
- _sizeReadBuf = 0;
- _readBuf = NULL;
- return len;
- }
- #endif