diff -r 000000000000 -r e686773b3f54 phonebookengines/contactsmodel/tsrc/cfixedqueue.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/contactsmodel/tsrc/cfixedqueue.h Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,238 @@ +// Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// CFixedQueue Test module +// +// + + +#ifndef CFixedQueue_H +#define CFixedQueue_H + +// INCLUDES +#include + + +// CONSTANTS +_LIT(KFixedQueuePanicText, "CFixedQueue"); + + +// CLASS DECLARATION + +/** + * Fixed size queue. + * @param T type of objects in the queue. T must have accessible default + * constructor and assignment operator. + */ +template +class CFixedQueue : public CBase + { + public: // Constructors and destructor + CFixedQueue(); + + /** + * Initializes a new fixed queue. + * @param aSize maximum size of the queue. + * @pre aSize > 0 + */ + void ConstructL(TInt aSize); + + /** + * Destructor. + */ + ~CFixedQueue(); + + public: // Interface + /** + * Returns the object at the head of this queue. + * @pre !IsEmpty() + */ + T& Head() const; + + /** + * Pops the head off this queue. Does not deallocate memory. + * @pre !IsEmpty() + */ + void PopHead(); + + /** + * Returns true if this queue is empty + */ + TBool IsEmpty() const; + + /** + * Returns the number of objects in the queue. + */ + TInt Count() const; + + /** + * Pushes an object at the tail of the queue. + * @return ETrue if succesful, EFalse if queue run out of space. + */ + TBool Push(const T& aObj); + + /** + * Empties this queue. Does not deallocate memory. + */ + void Reset(); + + private: // Implementation + enum TPanicCode + { + EPanicPreCond_ConstructL = 1, + EPanicPreCond_Head, + EPanicPreCond_PopHead, + EPanicPreCond_Push, + EPanicInvariant + }; + static void Panic(TPanicCode aReason); + __DECLARE_TEST; + + private: // Data + // Own: circural queue array + T* iQueueArray; + // Own: maximum size of queue + TInt iQueueSize; + // Own: number of objects currently in the queue + TInt iCount; + // Ref: head of queue + T* iQueueHead; + // Ref: tail of queue + T* iQueueTail; + }; + +template inline +void CFixedQueue::Panic(TPanicCode aReason) + { + User::Panic(KFixedQueuePanicText,aReason); + } + +template inline +CFixedQueue::CFixedQueue() + { + // CBase::operator new resets memebers + __TEST_INVARIANT; + } + +template inline +void CFixedQueue::ConstructL(TInt aSize) + { + __TEST_INVARIANT; + __ASSERT_ALWAYS(!iQueueArray, Panic(EPanicPreCond_ConstructL)); + __ASSERT_ALWAYS(aSize > 0, Panic(EPanicPreCond_ConstructL)); + iQueueArray = new(ELeave) T[aSize]; + iQueueSize = aSize; + iCount = 0; + iQueueHead = iQueueTail = iQueueArray; + __TEST_INVARIANT; + } + +template +CFixedQueue::~CFixedQueue() + { + __TEST_INVARIANT; + delete [] iQueueArray; + } + +template inline +T& CFixedQueue::Head() const + { + __TEST_INVARIANT; + __ASSERT_ALWAYS(iCount > 0, Panic(EPanicPreCond_Head)); + return *iQueueHead; + } + +template inline +void CFixedQueue::PopHead() + { + __TEST_INVARIANT; + __ASSERT_ALWAYS(iCount > 0, Panic(EPanicPreCond_PopHead)); + ++iQueueHead; + if (iQueueHead == iQueueArray+iQueueSize) + { + iQueueHead = iQueueArray; + } + --iCount; + } + +template inline +TBool CFixedQueue::IsEmpty() const + { + __TEST_INVARIANT; + return (iCount==0); + } + +template inline +TInt CFixedQueue::Count() const + { + __TEST_INVARIANT; + return iCount; + } + +template inline +TBool CFixedQueue::Push(const T& aObj) + { + __TEST_INVARIANT; + if (iCount < iQueueSize) + { + *iQueueTail = aObj; + ++iQueueTail; + if (iQueueTail == iQueueArray+iQueueSize) + { + iQueueTail = iQueueArray; + } + ++iCount; + __TEST_INVARIANT; + return ETrue; + } + else + { + return EFalse; + } + } + +template inline +void CFixedQueue::Reset() + { + __TEST_INVARIANT; + iQueueTail = iQueueHead; + iCount = 0; + __TEST_INVARIANT; + } + +template +void CFixedQueue::__DbgTestInvariant() const + { + if (!iQueueArray) + { + // Not initialised + __ASSERT_ALWAYS(iQueueSize==0 && iCount==0, Panic(EPanicInvariant)); + __ASSERT_ALWAYS(!iQueueHead && !iQueueTail, Panic(EPanicInvariant)); + } + else + { + // Initialised + __ASSERT_ALWAYS(iQueueSize > 0, Panic(EPanicInvariant)); + __ASSERT_ALWAYS(iCount >= 0 && iCount <= iQueueSize, Panic(EPanicInvariant)); + __ASSERT_ALWAYS((iQueueHead >= iQueueArray) && (iQueueHead < iQueueArray+iQueueSize), + Panic(EPanicInvariant)); + __ASSERT_ALWAYS((iQueueTail >= iQueueArray) && (iQueueTail < iQueueArray+iQueueSize), + Panic(EPanicInvariant)); + } + } + + +#endif + +// End of File +