first commit
This commit is contained in:
58
inc/hgl/thread/RingBuffer.cpp
Normal file
58
inc/hgl/thread/RingBuffer.cpp
Normal file
@@ -0,0 +1,58 @@
|
||||
#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
|
Reference in New Issue
Block a user