?? circuitqueue.h
字號(hào):
#ifndef _CIRCUITQUEUE_H_
#define _CIRCUITQUEUE_H_
#include <windows.h>
#include <stdio.h>
#include <assert.h>
//=============================================================================================================================
/// 盔屈 鈕 努貳膠 袍敲復(fù)
//=============================================================================================================================
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
菩哦撈 滾欺 第率俊輯 菊率欄肺 唱穿絹 甸絹哎 錠 菩哦闌 撈絹林扁 困秦 犬焊且
滾欺 第率 咯盒狼 皋葛府 農(nóng)扁(角力 咯盒 皋葛府 = 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
鈕甫 沒(méi)家茄促.
*/
//=============================================================================================================================
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;
}
/// 泅犁 葷儈吝牢 鈕狼 農(nóng)扁甫 府畔茄促.
inline int GetLength()
{
int iRet;
EnterCriticalSection( &m_cs );
iRet = m_nLength;
LeaveCriticalSection( &m_cs );
return iRet;
}
/// 單撈磐啊 鈕 第率欄肺 菜 瞞輯 菊欄肺 撈絹瘤綽 版快, 第率 場(chǎng)鱉瘤狼 單撈磐 俺薦甫 府畔茄促.
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;
}
/// 肋府瘤 臼絆 茄鍋俊 佬闌 薦 樂(lè)綽 辨撈甫 府畔茄促.
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
瀝惑利欄肺 單撈磐 火澇撈 場(chǎng)唱擱 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焊促 菊俊 樂(lè)綽 版快
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焊促 第俊 樂(lè)綽 版快
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焊促 菊俊 樂(lè)綽 版快
memcpy( pTar, m_pData + m_nHead, sizeof(T) * nSize );
}
else
{
// 2. head啊 tail焊促 第俊 樂(lè)綽 版快
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 );
// 滾欺 蓋 締率 咯盒 滾欺俊促啊 滾欺 蓋 菊率俊 樂(lè)綽 單撈磐甫 敬促.
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; /// 鈕 滾欺狼 傈眉 農(nóng)扁
int m_nHead; /// 泅犁 單撈磐啊 矯累登綽 鎊狼 困摹
int m_nTail; /// 泅犁 單撈磐啊 結(jié)龍 鎊狼 困摹
int m_nExtraSize; /// 鈕 第率俊 咯盒欄肺 棱闌 滾欺 農(nóng)扁
};
#endif
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -