📄 tcyclequeue.h
字号:
//CycleQueue.h
/*/////////////////////////////////////////////////////////////////
李亦
liease@163.com 4040719
2006-7-18
/*/////////////////////////////////////////////////////////////////
#ifndef _TCYCLEQUEUE_H_
#define _TCYCLEQUEUE_H_
#ifndef _TVECTOR_H_
#include "core/tVector.h"
#endif
template<class _T>
class CycleQueue : private Vector<_T*>
{
typedef Vector<_T*> Parent;
S32 m_nTail; //当前位置
S32 m_nHeader; //头位置
public:
CycleQueue(U32 uSize,U32 uGrow);
~CycleQueue(){}
//队列未满,则加到尾部
//已满,则删除头1元素,加到尾部,打开always标志即可
BOOL Push(_T* pUnit);
_T* Pop();
_T* Shift();
_T* GetHeader();
_T* GetTail();
BOOL IsEmpty() {return m_nHeader == -1;}
BOOL IsFull();
_T* GetAt(S32 n) {return &mArray[n];}
S32 Header() {return m_nHeader;}
void Next(S32& n) {if(n>=Parent::mElementCount) n=0; else n++;}
BOOL IsEnd(S32 n) {return !IsEmpty() && n > m_nTail;}
};
template<class _T>
CycleQueue<_T>::CycleQueue(U32 uSize,U32 uGrow)
:Parent(uSize,uGrow)
{
m_nHeader = -1;
m_nTail = -1;
//mElementCount = uSize; //占满全部元素,
if(uSize == 0)
increment(Parent::mGrowSize);
}
template<class _T>
BOOL CycleQueue<_T>::IsFull()
{
if(Parent::mElementCount == 0)
return TRUE;
S32 nPos = m_nTail;
if(m_nTail == Parent::mElementCount -1)
nPos = -1;
//已满
return nPos == m_nHeader-1;
}
template<class _T>
BOOL CycleQueue<_T>::Push(_T* pUnit)
{
if(IsFull())
{
//if(bAlways == FALSE)
// return FALSE;
//满的话,增加队列空间
U32 uSize = mElementCount;
increment(Parent::mGrowSize);
//如果头元素在数组中间,则需要把 H--END间的数据,移后
if(m_nHeader > 0)
{
U32 uCount = mElementCount - uSize;
U32 nHeader= m_nHeader + uCount;
dMemmove(&mArray[nHeader],
&mArray[m_nHeader],
(uSize - m_nHeader) * sizeof(_T*));
m_nHeader = nHeader;
}
//Shift();
}
if(m_nHeader == -1)
{
m_nHeader = 0;
m_nTail = 0;
}
else
m_nTail++;
Parent::mArray[m_nTail] = pUnit;
if(m_nTail >= Parent::mElementCount)
m_nTail = 0;
return TRUE;
}
template<class _T>
_T* CycleQueue<_T>::Shift()
{
if(m_nHeader == -1 || Parent::mElementCount == 0)
return NULL;
_T* pRet = Parent::mArray[m_nHeader];
m_nHeader++;
if(m_nHeader >= Parent::mElementCount)
m_nHeader = 0;
//置为Empty标志
if(IsFull())
m_nHeader = -1;
return pRet;
}
template<class _T>
_T* CycleQueue<_T>::Pop()
{
if(m_nHeader == -1 || Parent::mElementCount == 0)
return NULL;
_T* pRet = Parent::mArray[m_nTail];
m_nTail--;
if(m_nTail < 0 )
m_nTail = Parent::mElementCount - 1;
//置为Empty标志
if(IsFull())
m_nHeader = -1;
return pRet;
}
template<class _T>
_T* CycleQueue<_T>::GetHeader()
{
if(IsEmpty() || Parent::mElementCount == 0)
return NULL;
return Parent::mArray[m_nHeader];
}
template<class _T>
_T* CycleQueue<_T>::GetTail()
{
if(IsEmpty() || Parent::mElementCount == 0)
return NULL;
return Parent::mArray[m_nTail];
}
#endif //_TCYCLEQUEUE_H_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -