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

📄 tcyclequeue.h

📁 五行MMORPG引擎系统V1.0
💻 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 + -