Symbian本身提供的有TSglQue, TDblQue队列的实现, 个人认为这几个类不好使,并且使用时很容易出错,
好像是某个方法传参不正确就导致panic,而这个错误90%的人都容易忽略,错误也很隐蔽,
所以我决定DIY:
/*
==================================================
* Name : CQueue.h
* Author : FangYuan Gui
* Copyright : GPL/BSD
==================================================
*/
#ifndef __CQUEUE_H__
#define __CQUEUE_H__
#include <e32std.h>
#include <e32base.h>
template<typename T>
class CQueue : public CBase
{
public:
static CQueue* NewLC( const TInt aMaxSize );
static CQueue* NewL( const TInt aMaxSize );
~CQueue();
void EnqueueL( const T& aElement );
void DequeueL( T& aOut );
void Count( TInt& aOut );
void MaxSize( TInt& aOut );
private:
CQueue( const TInt aMaxSize );
void ConstructL();
CArrayFixFlat<T>* iQueArr;
RMutex iMutex;
TInt iMaxSize;
};
template <typename T>
CQueue<T>::CQueue( const TInt aMaxSize )
:iMaxSize( aMaxSize )
{
}
template <typename T>
void CQueue<T>::ConstructL()
{
iQueArr = new(ELeave)CArrayFixFlat<T>( iMaxSize );
iMutex.CreateLocal();
}
template <typename T>
CQueue<T>* CQueue<T>::NewLC( const TInt aMaxSize )
{
CQueue<T>* self = new(ELeave)CQueue<T>( aMaxSize );
self->ConstructL();
CleanupStack::PushL( self );
return self;
}
template <typename T>
CQueue<T>* CQueue<T>::NewL( const TInt aMaxSize )
{
CQueue<T>* self = CQueue<T>::NewLC( aMaxSize );
CleanupStack::Pop( self );
return self;
}
template <typename T>
CQueue<T>::~CQueue()
{
if( NULL != iQueArr )
{
iQueArr->Reset();
delete iQueArr;
iQueArr = NULL;
}
iMutex.Close();
}
template <typename T>
void CQueue<T>::MaxSize( TInt& aOut )
{
iMutex.Wait();
aOut = iMaxSize;
iMutex.Signal();
}
template <typename T>
void CQueue<T>::Count( TInt& aOut )
{
iMutex.Wait();
aOut = iQueArr->Count();
iMutex.Signal();
}
template <typename T>
void CQueue<T>::EnqueueL( const T& aElement )
{
iMutex.Wait();
if( iMaxSize > iQueArr->Count() )
{
iQueArr->AppendL( aElement );
}
iMutex.Signal();
}
template <typename T>
void CQueue<T>::DequeueL( T& aOut )
{
iMutex.Wait();
if( 0 < iQueArr->Count() )
{
aOut = iQueArr->At( 0 );
iQueArr->Delete( 0 );
}
iMutex.Signal();
}
#endif /* __CQUEUE_H__ */