phonebookengines_old/contactsmodel/tsrc/cfixedqueue.h
changeset 40 b46a585f6909
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines_old/contactsmodel/tsrc/cfixedqueue.h	Fri Jun 11 13:29:23 2010 +0300
@@ -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 <e32base.h>
+
+
+// CONSTANTS
+_LIT(KFixedQueuePanicText, "CFixedQueue<T>");
+
+
+// CLASS DECLARATION
+
+/**
+ * Fixed size queue.
+ * @param T type of objects in the queue. T must have accessible default 
+ *          constructor and assignment operator.
+ */
+template<class T>
+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<class T> inline
+void CFixedQueue<T>::Panic(TPanicCode aReason)
+    {
+    User::Panic(KFixedQueuePanicText,aReason);
+    }
+
+template<class T> inline
+CFixedQueue<T>::CFixedQueue()
+    {
+    // CBase::operator new resets memebers
+    __TEST_INVARIANT;
+    }
+
+template<class T> inline
+void CFixedQueue<T>::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<class T>
+CFixedQueue<T>::~CFixedQueue()
+    {
+    __TEST_INVARIANT;
+    delete [] iQueueArray;
+    }
+
+template<class T> inline
+T& CFixedQueue<T>::Head() const
+    {
+    __TEST_INVARIANT;
+    __ASSERT_ALWAYS(iCount > 0, Panic(EPanicPreCond_Head));
+    return *iQueueHead;
+    }
+
+template<class T> inline
+void CFixedQueue<T>::PopHead()
+    {
+    __TEST_INVARIANT;
+    __ASSERT_ALWAYS(iCount > 0, Panic(EPanicPreCond_PopHead));
+    ++iQueueHead;
+    if (iQueueHead == iQueueArray+iQueueSize)
+        {
+        iQueueHead = iQueueArray;
+        }
+    --iCount;
+    }
+
+template<class T> inline
+TBool CFixedQueue<T>::IsEmpty() const
+    {
+    __TEST_INVARIANT;
+    return (iCount==0);
+    }
+
+template<class T> inline
+TInt CFixedQueue<T>::Count() const
+    {
+    __TEST_INVARIANT;
+    return iCount;
+    }
+
+template<class T> inline
+TBool CFixedQueue<T>::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<class T> inline
+void CFixedQueue<T>::Reset()
+    {
+    __TEST_INVARIANT;
+    iQueueTail = iQueueHead;
+    iCount = 0;
+    __TEST_INVARIANT;
+    }
+
+template<class T>
+void CFixedQueue<T>::__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
+