别人写的一个环缓冲类,比较简洁,也没有平台相关。没有测试有没有BUG,仅供参考

 /*-------------------------
* Author: XadillaX |
* Data: 2010/10/3 |
* Class: CircleBuffer |
*------------------------|---
*/

#ifndef CircleBuffer_H
#define CircleBuffer_H

#ifndef SAFEDEL(p)
#define SAFEDEL(p) { delete p; p = NULL; }
#endif

/*
* 类:环形缓冲区
*/
template<typename ElemType>
class CircleBuffer {
private:
ElemType *Arr;
int _l;
int _c;
int _size;
int _cnt;

int conv(int i);
public:
CircleBuffer(int MaxSize = 65535);
~CircleBuffer();

bool push(ElemType ele);
void clear();
bool pop(ElemType &ele);
bool empty();
int count();
int GetSize();
};

/*
* 实现环形缓冲区
*/
template<typename ElemType>
CircleBuffer<ElemType>::CircleBuffer(int MaxSize) : _size(MaxSize)
{
if(_size < 1) _size = 1;
Arr = new ElemType[MaxSize];
_l = _c = _size - 1;
_cnt = 0;
}

template<typename ElemType>
CircleBuffer<ElemType>::~CircleBuffer()
{
delete []Arr;
Arr = NULL;
}

template<typename ElemType>
int CircleBuffer<ElemType>::conv(int i)
{
return (i < _size) ? i : 0;
}

template<typename ElemType>
bool CircleBuffer<ElemType>::push(ElemType ele)
{
if(_cnt < _size)
{
_l = conv(_l + 1);
Arr[_l] = ele;
_cnt++;

return true;
}
else return false;
}

template<typename ElemType>
bool CircleBuffer<ElemType>::pop(ElemType &ele)
{
if(_cnt == 0) return false;
else
{
_cnt--;
_c = conv(_c + 1);
ele = Arr[_c];
return true;
}
}

template<typename ElemType>
int CircleBuffer<ElemType>::count()
{
return _cnt;
}

template<typename ElemType>
bool CircleBuffer<ElemType>::empty()
{
if(!_cnt) return true;
else return false;
}

template<typename ElemType>
int CircleBuffer<ElemType>::GetSize()
{
return _size;
}

template<typename ElemType>
void CircleBuffer<ElemType>::clear()
{
_l = _c = _size - 1;
_cnt = 0;
}
#endif

 

posted @ 2012-01-31 06:50  littlestone08  阅读(151)  评论(0)    收藏  举报