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 + -
显示快捷键?