circuitqueue.h

来自「奇迹世界公用文件源代码,研究网络游戏的朋友可以研究下」· C头文件 代码 · 共 359 行

H
359
字号
#ifndef _CIRCUITQUEUE_H_
#define _CIRCUITQUEUE_H_

#include <windows.h>
#include <stdio.h>
#include <assert.h>

//=============================================================================================================================
/// 盔屈 钮 努贰胶 袍敲复
//=============================================================================================================================
template<typename T>
class CircuitQueue
{
public:
	CircuitQueue() : m_pData( NULL ), m_nLength( 0 ), m_nSize( 0 ), m_nHead( 0 ), m_nTail( 0 )
	{
		InitializeCriticalSection( &m_cs );		
	}
	
	virtual ~CircuitQueue()
	{
		if( m_pData ) delete [] m_pData;
		DeleteCriticalSection( &m_cs );
	}
	
//=============================================================================================================================
/**
	@remarks
			钮甫 积己茄促.
	@param	nSize
			钮 荤捞令
	@param	nExtraSize
			菩哦捞 滚欺 第率俊辑 菊率栏肺 唱穿绢 甸绢哎 锭 菩哦阑 捞绢林扁 困秦 犬焊且
			滚欺 第率 咯盒狼 皋葛府 农扁(角力 咯盒 皋葛府 = sizeof(T) * nExtraSize )
*/
//=============================================================================================================================
	void Create( int nSize, int nExtraSize = 0 )
	{
		EnterCriticalSection( &m_cs );
		if( m_pData ) delete [] m_pData;

		m_pData			= new T[nSize + nExtraSize];
		m_nSize			= nSize;
		m_nExtraSize	= nExtraSize;
		LeaveCriticalSection( &m_cs );
	}

//=============================================================================================================================
/**
	@remarks
			钮甫 没家茄促.
*/
//=============================================================================================================================
	inline void Clear()
	{
		EnterCriticalSection( &m_cs );

		m_nLength       = 0;
		m_nHead         = 0;
		m_nTail         = 0;

		LeaveCriticalSection( &m_cs );
	}
	
	/// 钮狼 巢篮 傍埃阑 府畔茄促.
	inline int      GetSpace()
	{
		int iRet;

		EnterCriticalSection( &m_cs );
		iRet = m_nSize - m_nLength;		
		LeaveCriticalSection( &m_cs );

		return iRet;
	}

	/// 泅犁 荤侩吝牢 钮狼 农扁甫 府畔茄促.
	inline int      GetLength()
	{
		int iRet;

		EnterCriticalSection( &m_cs );
		iRet = m_nLength;
		LeaveCriticalSection( &m_cs );

		return iRet;
	}

	/// 单捞磐啊 钮 第率栏肺 菜 瞒辑 菊栏肺 捞绢瘤绰 版快, 第率 场鳖瘤狼 单捞磐 俺荐甫 府畔茄促.
	inline int      GetBackDataCount()
	{
		int iRet;

		EnterCriticalSection( &m_cs );
		iRet = m_nSize - m_nHead;
		LeaveCriticalSection( &m_cs );

		return iRet;
	}

	/// 单捞磐甫 佬阑 器牢磐(Head)甫 府畔茄促.
	inline T*       GetReadPtr()
	{
		T *pRet;

		EnterCriticalSection( &m_cs );
		pRet = m_pData + m_nHead;

		// 父距 滚欺 盖 第率 单捞磐甫 佬栏妨绰 版快 咯盒狼 滚欺俊 利例洒 汗荤秦霖促.
		int nSplitFirstDataCount;
		if( m_nHead > m_nTail && ( nSplitFirstDataCount = m_nSize - m_nHead ) < m_nExtraSize )
		{
			memcpy( m_pData + m_nSize, m_pData, sizeof(T) * ( m_nExtraSize - nSplitFirstDataCount ) );
		}

		LeaveCriticalSection( &m_cs );

		return pRet;
	}

	/// 单捞磐甫 镜 器牢磐(Tail)甫 府畔茄促.
	inline T*       GetWritePtr()
	{
		T *pRet;

		EnterCriticalSection( &m_cs );
		pRet = m_pData + m_nTail;
		LeaveCriticalSection( &m_cs );

		return pRet;
	}
	
	/// 肋府瘤 臼绊 茄锅俊 佬阑 荐 乐绰 辨捞甫 府畔茄促.
	inline int GetReadableLen()
	{
		int iRet;

		EnterCriticalSection( &m_cs );
		if( m_nHead == m_nTail )		iRet = GetLength() > 0 ? m_nSize - m_nHead: 0;
		else if( m_nHead < m_nTail )	iRet = m_nTail - m_nHead;
		else							 iRet = m_nSize - m_nHead;
		LeaveCriticalSection( &m_cs );

		return iRet;
	}
	
	/// 肋府瘤 臼绊 茄锅俊 静扁 啊瓷茄 辨捞甫 府畔茄促.
	inline int GetWritableLen()
	{
		int iRet;

		EnterCriticalSection( &m_cs );
		if( m_nHead == m_nTail )		iRet = GetLength() > 0 ? 0 : m_nSize - m_nTail;
		else if( m_nHead < m_nTail )	iRet = m_nSize - m_nTail;
		else							iRet = m_nHead - m_nTail;
		LeaveCriticalSection( &m_cs );

		return iRet;
	}

//=============================================================================================================================
/**
	@remarks
			钮俊 单捞磐甫 持绰促.
	@param	pSrc
			钮俊 火涝且 单捞磐 器牢磐
	@param	nSize
			钮俊 火涝且 单捞磐狼 辨捞
	@retval	BOOL
			沥惑利栏肺 单捞磐 火涝捞 场唱搁 TRUE甫 府畔茄促.
			钮啊 菜瞒辑 火涝且 荐 绝绰 版快 FALSE甫 府畔茄促.
*/
//=============================================================================================================================
	inline BOOL Enqueue( T *pSrc, int nSize )
	{
		EnterCriticalSection( &m_cs );

		if( GetSpace() < nSize )
		{
			LeaveCriticalSection( &m_cs );
			return FALSE;
		}

		/*
		// 单捞磐啊 唱穿绢廉 滴锅俊 墨乔登绰 版快牢啊?
		BOOL bCopyToExtraBuffer = ( ( m_nHead <= m_nTail ) && ( m_nSize - m_nTail < nSize ) );
		*/

		// pSrc啊 NULL牢 版快 单捞磐 钮雷 绝捞 tail苞 length父 盎脚茄促.
		if( pSrc )
		{
			if( m_nHead <= m_nTail )
			{
				// 1. head啊 tail焊促 菊俊 乐绰 版快
				int nBackSpaceCount = m_nSize - m_nTail;

				if( nBackSpaceCount >= nSize )  
				{
					// 第率俊 巢篮 傍埃捞 汗荤且 剧焊促 鞍芭唱 奴 版快 茄锅俊 汗荤茄促.
					memcpy( m_pData + m_nTail, pSrc, sizeof(T) * nSize );
				}
				else
				{
					// 第率俊 巢篮 傍埃捞 汗荤且 剧焊促 累篮 版快 滴锅俊 唱穿绢 汗荤茄促.
					memcpy( m_pData + m_nTail, pSrc, sizeof(T) * nBackSpaceCount );
					memcpy( m_pData, pSrc + nBackSpaceCount, sizeof(T) * ( nSize - nBackSpaceCount ) );
				}
			}
			else
			{
				// 2. head啊 tail焊促 第俊 乐绰 版快
				memcpy( m_pData + m_nTail, pSrc, sizeof(T) * nSize );
			}
		}

		/*
		if( bCopyToExtraBuffer )
		{
			// 第率狼 肋赴 单捞磐甫 咯盒狼 滚欺俊档 汗荤秦霖促.
			memcpy( m_pData + m_nSize, pSrc + m_nSize - m_nTail, sizeof(T) * ( nSize - ( m_nSize - m_nTail ) ) );
		}
		*/

		m_nTail		+= nSize;
		m_nTail		%= m_nSize;
		m_nLength	+= nSize;

		LeaveCriticalSection( &m_cs );

		return TRUE;
	}

//=============================================================================================================================
/**
	@remarks
			钮俊辑 单捞磐甫 波辰促.
	@param	pTar
			钮俊辑 波辰 单捞磐甫 汗荤且 滚欺狼 器牢磐
	@param	nSize
			钮俊辑 波尘 单捞磐 辨捞
	@retval	BOOL
			沥惑利栏肺 单捞磐甫 波郴搁 TRUE甫 府畔茄促.
			波尘 单捞磐啊 nSize焊促 利篮 版快 FALSE甫 府畔茄促.
*/
//=============================================================================================================================
	inline BOOL Dequeue( T *pTar, int nSize )
	{    
		EnterCriticalSection( &m_cs );

		if( !Peek( pTar, nSize ) )
		{
			LeaveCriticalSection( &m_cs );
			return FALSE;
		}

		m_nHead		+= nSize;
		m_nHead		%= m_nSize;
		m_nLength	-= nSize;

		LeaveCriticalSection( &m_cs );

		return TRUE;
	}

//=============================================================================================================================
/**
	@remarks
			钮俊辑 单捞磐甫 波郴瘤 臼绊 汗荤父 秦柯促.
	@param	pTar
			钮狼 单捞磐甫 汗荤且 滚欺狼 器牢磐
	@param	nSize
			钮俊辑 汗荤且 单捞磐 辨捞
	@retval	BOOL
			沥惑利栏肺 单捞磐甫 汗荤窍搁 TRUE甫 府畔茄促.
			波尘 单捞磐啊 nSize焊促 利篮 版快 FALSE甫 府畔茄促.
*/
//=============================================================================================================================
	inline BOOL Peek( T *pTar, int nSize )
	{
		EnterCriticalSection( &m_cs );

		if( m_nLength < nSize )
		{
			LeaveCriticalSection( &m_cs );
			return FALSE;
		}

		// 郴侩阑 罐阑 器牢磐啊 NULL捞 酒囱 版快俊父 皋葛府甫 汗荤茄促.
		if( pTar != NULL )
		{
			if( m_nHead < m_nTail )
			{
				// 1. head啊 tail焊促 菊俊 乐绰 版快
				memcpy( pTar, m_pData + m_nHead, sizeof(T) * nSize );
			}
			else
			{
				// 2. head啊 tail焊促 第俊 乐绰 版快
				if( GetBackDataCount() >= nSize )
				{
					// 第率俊 巢篮 单捞磐啊 波郴哎 剧焊促 鞍芭唱 奴 版快 nSize父怒 茄锅俊 汗荤茄促.
					memcpy( pTar, m_pData + m_nHead, sizeof(T) * nSize );                           
				}
				else
				{
					// 第率俊 巢篮 单捞磐啊 波郴哎 剧焊促 累篮 版快 滴锅俊 唱穿绢 汗荤茄促.
					memcpy( pTar, m_pData + m_nHead, sizeof(T) * GetBackDataCount() );
					memcpy( pTar + GetBackDataCount(), m_pData, sizeof(T) * ( nSize - GetBackDataCount() ) );
				}
			}
		}

		LeaveCriticalSection( &m_cs );

		return TRUE;
	}

//=============================================================================================================================
/**
	@remarks
			菩哦捞 滚欺 第率俊辑 菊率栏肺 唱穿绢龙 锭 菩哦捞 捞绢瘤档废 咯盒狼 傍埃俊 墨乔茄促.
	@param	nSize
			第率俊辑 肋妨辑 菊率栏肺 捞绢柳 单捞磐狼 辨捞
*/
//=============================================================================================================================
	inline void CopyHeadDataToExtraBuffer( int nSize )
	{
		assert( nSize <= m_nExtraSize );

		EnterCriticalSection( &m_cs );

		// 滚欺 盖 缔率 咯盒 滚欺俊促啊 滚欺 盖 菊率俊 乐绰 单捞磐甫 敬促.
		memcpy( m_pData + m_nSize, m_pData, nSize );

		LeaveCriticalSection( &m_cs );
	}

protected:
	CRITICAL_SECTION	m_cs;
	T					*m_pData;			/// 钮 滚欺 器牢磐
	int					m_nLength;			/// 泅犁 单捞磐 辨捞
	int					m_nSize;			/// 钮 滚欺狼 傈眉 农扁
	int					m_nHead;			/// 泅犁 单捞磐啊 矫累登绰 镑狼 困摹
	int					m_nTail;			/// 泅犁 单捞磐啊 结龙 镑狼 困摹
	int					m_nExtraSize;		/// 钮 第率俊 咯盒栏肺 棱阑 滚欺 农扁 
};

#endif










⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?