⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ringbufferex.cpp

📁 奇迹世界公用文件源代码,研究网络游戏的朋友可以研究下
💻 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 + -