📄 ringbufferex.cpp
字号:
#include "UtilityCommon.h"
#include "RingBufferEx.h"
namespace util
{
RingBufferEx::RingBufferEx(int bufferSize)
: m_pBuffer(NULL), m_BufferSize(bufferSize), m_Head(0), m_Tail(0)
{
assert( bufferSize >= 0 );
if (bufferSize > 0)
{
Init( bufferSize );
}
}
RingBufferEx::~RingBufferEx()
{
Release();
}
void
RingBufferEx::Init( int bufferSize )
{
assert( bufferSize > 0 );
assert( m_pBuffer==NULL );
m_pBuffer = new BYTE [bufferSize];
m_BufferSize = bufferSize;
m_Head = 0;
m_Tail = 0;
}
void
RingBufferEx::Release()
{
SAFE_DELETE_ARRAY( m_pBuffer );
m_BufferSize = 0;
m_Head = 0;
m_Tail = 0;
}
void
RingBufferEx::Recycle()
{
m_Head = 0;
m_Tail = 0;
}
// 郴何 滚欺俊促啊 pBuffer甫 memcpy
int
RingBufferEx::Write( const BYTE * pBuffer, int len )
{
// Tail第俊促啊 pBuffer甫 len父怒 眠啊秦具 窍绰单..
// 老窜.. buffer啊 何练窍搁 扯菩!
if ( GetFreeSize() < len )
{
// HooooooooooooT
// oooooooTHooooo
return -1;
}
if (m_Head <= m_Tail)
{
// ......HT......
// ....HooooT....
// tail 第率阑 静绊..
int rightFreeSize = m_BufferSize - m_Tail; // 0锅掳 磊府啊 厚绢乐栏骨肺 场鳖瘤 盲况档 等促.(tail -1 救秦拎档 等促.)
int writeLen = min( rightFreeSize, len );
memcpy( m_pBuffer+m_Tail, pBuffer, writeLen );
m_Tail = ( m_Tail + writeLen ) % m_BufferSize;
// 镜霸 巢疽栏搁 菊率何磐 敬促.
int remainLen = len - writeLen;
if (remainLen > 0)
{
assert( m_Tail == 0 ); // 镜霸 巢篮 版快绰 tail篮 0捞 等促.
memcpy( m_pBuffer, pBuffer+writeLen, remainLen );
m_Tail = remainLen;
}
}
else
{
// T............H
// T........Hoooo
// ooooT........H
// ooooT....Hoooo
// HoooooooooT...
// FreeSize绰 眉农沁栏骨肺 tail何磐 妇帛 静搁 等促.
memcpy( m_pBuffer+m_Tail, pBuffer, len );
m_Tail += len;
}
return len;
}
// 郴何 滚欺俊辑 pBuffer肺 memcpy
int
RingBufferEx::Read( BYTE * pBuffer, int len )
{
if ( GetDataSize() < len )
{
// len捞 农搁 酒抗 角菩肺 贸府茄促.
return -1;
}
if (m_Head < m_Tail)
{
// HooooooooooooT
// ......HT......
// ....HooooT....
// HoooooooooT...
// dataSize绰 困俊辑 眉农沁栏骨肺 面盒窍促.
memcpy( pBuffer, m_pBuffer+m_Head, len );
m_Head += len;
}
else
{
// oooooooTHooooo
// T............H
// T........Hoooo
// ooooT........H
// ooooT....Hoooo
// head何磐 场鳖瘤?
int writeLen = min( len, m_BufferSize-m_Head );
memcpy( pBuffer, m_pBuffer+m_Head, writeLen );
m_Head = (m_Head + writeLen) % m_BufferSize;
// 酒流 歹 结具登搁 菊率何磐 敬促.
int remainLen = len - writeLen;
if (remainLen > 0)
{
assert( m_Head == 0 );
memcpy( pBuffer+writeLen, m_pBuffer, remainLen );
m_Head += remainLen;
}
}
return len;
}
// 郴何 滚欺俊辑 pBuffer肺 memcpy, 窜 郴何 head, tail篮 函拳窍瘤 臼绰促.
int
RingBufferEx::Peek( BYTE * pBuffer, int len )
{
if ( GetDataSize() < len )
{
// len捞 农搁 酒抗 角菩肺 贸府茄促.
return -1;
}
if (m_Head < m_Tail)
{
// HooooooooooooT
// ......HT......
// ....HooooT....
// HoooooooooT...
// dataSize绰 困俊辑 眉农沁栏骨肺 面盒窍促.
memcpy( pBuffer, m_pBuffer+m_Head, len );
}
else
{
// oooooooTHooooo
// T............H
// T........Hoooo
// ooooT........H
// ooooT....Hoooo
// head何磐 场鳖瘤?
int writeLen = min( len, m_BufferSize-m_Head );
memcpy( pBuffer, m_pBuffer+m_Head, writeLen );
// 酒流 歹 结具登搁 菊率何磐 敬促.
int remainLen = len - writeLen;
if (remainLen > 0)
{
memcpy( pBuffer+writeLen, m_pBuffer, remainLen );
}
}
return len;
}
// head, tail狼 困摹父 捞悼矫挪促.
int
RingBufferEx::Skip( int len )
{
if ( GetDataSize() < len )
{
// len捞 农搁 酒抗 角菩肺 贸府茄促.
return -1;
}
m_Head = (m_Head + len) % m_BufferSize;
return len;
}
BYTE * RingBufferEx::GetContigousPtr(OUT int & size) const
{
if (m_Head <= m_Tail)
{
size = m_Tail - m_Head;
return (m_pBuffer+m_Head);
}
else
{
size = m_BufferSize-m_Head;
return (m_pBuffer+m_Head);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -