59 lines
1.6 KiB
C++
59 lines
1.6 KiB
C++
#ifndef HGL_THREAD_RING_BUFFER_SOURCE
|
||
#define HGL_THREAD_RING_BUFFER_SOURCE
|
||
|
||
/**
|
||
* 由于设定read_pos=write_pos表示无数据,所以当数据刚好读写到结尾时,不立即转成0,而是仍为buffer_size
|
||
*/
|
||
//--------------------------------------------------------------------------------------------------
|
||
namespace hgl
|
||
{
|
||
template<typename T>
|
||
RingBuffer<T>::RingBuffer(int size)
|
||
{
|
||
buffer_size=size;
|
||
|
||
buffer=new T[size];
|
||
|
||
// memset(buffer,0,size); //有write_pos/read_pos没有根本读不出数据,所以无需清0
|
||
|
||
read_pos=0;
|
||
write_pos=0;
|
||
}
|
||
|
||
template<typename T>
|
||
RingBuffer<T>::~RingBuffer()
|
||
{
|
||
delete[] buffer;
|
||
}
|
||
|
||
template<typename T>
|
||
void RingBuffer<T>::Clear()
|
||
{
|
||
read_pos=0;
|
||
write_pos=0;
|
||
}
|
||
|
||
template<typename T>
|
||
void RingBuffer<T>::SafeClear()
|
||
{
|
||
Lock();
|
||
Clear();
|
||
Unlock();
|
||
}
|
||
|
||
template<typename T>
|
||
void RingBuffer<T>::ClampPosition()
|
||
{
|
||
if(read_pos<buffer_size
|
||
||write_pos<buffer_size)return; //将指针减去整数部分,以免溢出
|
||
|
||
//不可以用read_pos%=buffer_size,write_pos%=buffer_size。
|
||
//因为有可能read_pos=0,write_pos=buffersize,都用%buffer_size就会形成两个都为0的错误。
|
||
//一般也就破一次界限,所以效能影响无所谓。
|
||
|
||
read_pos-=buffer_size;
|
||
write_pos-=buffer_size;
|
||
}
|
||
}//namespace hgl
|
||
#endif//HGL_THREAD_RING_BUFFER_SOURCE
|