CMCore/inc/hgl/thread/RingBufferWrite.cpp

182 lines
3.8 KiB
C++
Raw Normal View History

2019-08-19 19:19:58 +08:00
#ifndef HGL_THREAD_RING_BUFFER_WRITE_SOURCE
#define HGL_THREAD_RING_BUFFER_WRITE_SOURCE
#include<string.h>
namespace hgl
{
/**
*
*/
template<typename T>
int RingBuffer<T>::SafeGetWriteSize()
{
Lock();
const int result=_GetWriteSize();
Unlock();
return(result);
}
template<typename T>
int RingBuffer<T>::WriteStart()
{
ClampPosition();
read_off=read_pos%buffer_size;
write_max=_GetWriteSize();
write_count=0;
write_cur=write_pos;
return write_max;
}
template<typename T>
int RingBuffer<T>::_SafeWriteStart()
{
WriteStart();
if(write_max<=0)
Unlock();
return write_max;
}
/**
*
* @return >0
* @return =0
* @return <0
*/
template<typename T>
int RingBuffer<T>::SafeTryWriteStart()
{
if(!TryLock())
return(-1);
return _SafeWriteStart();
}
/**
* ,SafeWriteEnd
* @return
*/
template<typename T>
int RingBuffer<T>::SafeWriteStart()
{
Lock();
return _SafeWriteStart();
}
/**
*
* @param data
* @param size
* @return
*/
template<typename T>
int RingBuffer<T>::Write(const T *data,int size)
{
if(!data||size<=0)return(-1);
const int result=_Write(data,size);
write_count+=result;
return result;
}
/**
*
* @return
*/
template<typename T>
int RingBuffer<T>::WriteEnd()
{
const int result=write_count;
if(result)
write_pos=write_cur;
return result;
}
/**
*
* @return
*/
template<typename T>
int RingBuffer<T>::SafeWriteEnd()
{
const int result=WriteEnd();
Unlock();
return result;
}
/**
* ,使SafeWriteStart/SafeWriteEnd
* @param data
* @param size
* @return
* @return -1
*/
template<typename T>
int RingBuffer<T>::SafeWrite(const T *data,int size)
{
if(!data||size<=0)return(-1);
if(SafeWriteStart()<=0)
return(-1);
Write(data,size);
return SafeWriteEnd();
}
template<typename T>
int RingBuffer<T>::_Write(const T *data,int size)
{
if(size<=0||write_max<=0)return(0);
if(size>write_max)
size=write_max;
if(size>0)
{
const int temp_write=write_cur%buffer_size;
if(read_off<=temp_write)
{
int temp=buffer_size-temp_write;
if(size>temp)
{
memcpy(buffer+temp_write,data,temp*sizeof(T));
memcpy(buffer,(char *)(data+temp),(size-temp)*sizeof(T));
}
else
{
memcpy(buffer+temp_write,data,size*sizeof(T));
}
}
else
{
memcpy(buffer+temp_write,data,size*sizeof(T));
}
write_cur+=size;
write_max-=size;
}
return size;
}
}//namespace hgl
#endif//HGL_THREAD_RING_BUFFER_WRITE_SOURCE