分享自己实现的队列

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__ */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值