idlehomescreen/inc/xnnodebreadthfirstiterator.h
changeset 0 f72a12da539e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/inc/xnnodebreadthfirstiterator.h	Thu Dec 17 08:40:49 2009 +0200
@@ -0,0 +1,200 @@
+/*
+* Copyright (c) 2002-2004 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:  Iterates over a tree, breadth first
+*
+*/
+
+#ifndef XNNODEBREADTHFIRSTITERATOR_H
+#define XNNODEBREADTHFIRSTITERATOR_H
+
+#include <e32base.h>
+#include <e32cmn.h>
+#include "xnchilditerator.h"
+
+// Constants
+/** 
+ * Queue granularity value
+ */
+const TInt KMemoryAloc = 128;
+
+template< class T > class CXnNodeBreadthFirstIterator : public CBase,
+    public MXnChildIterator
+    {
+public:
+
+    /**
+    * Two-phased constructor.
+    * @param aStartNode Object to iterate over
+    */
+    static CXnNodeBreadthFirstIterator< T >* NewL( T& aStartNode );
+
+    /**
+    * Destructor.
+    */
+    virtual ~CXnNodeBreadthFirstIterator();
+
+    /**
+    * Get the next iterator value.
+    * @return Next object or NULL if no more values. 
+    */
+    T* NextL();
+
+    /**
+    * Get the current iterator value.
+    * @return Current object 
+    */     
+    T* Value();
+
+    /**
+    * Get the previous iterator value. Obsolete!
+    * @return NULL 
+    */
+    T* PreviousL();
+
+    /**
+    * Get the current iterator index. Obsolete!
+    * @return value 0
+    */
+    TUint Index() const;
+
+protected:
+
+    /**
+    * C++ default constructor. 
+    */
+    CXnNodeBreadthFirstIterator( T* aStartNode );
+
+    /**
+    * 2nd phase constructor. 
+    */
+    void ConstructL();
+
+private:   
+    // Queue
+    RPointerArray< T > iQueue;
+    // Object to iterate over
+    T* iStart;   
+    // Current object
+    T* iCurrent;
+    };
+
+
+// -----------------------------------------------------------------------------
+// CXnNodeBreadthFirstIterator< T >::NewL()
+// -----------------------------------------------------------------------------
+//
+template< class T > CXnNodeBreadthFirstIterator< T >* 
+    CXnNodeBreadthFirstIterator< T >::NewL( T& aStartNode )
+    {
+    CXnNodeBreadthFirstIterator< T >* p = 
+        new ( ELeave )CXnNodeBreadthFirstIterator< T >( &aStartNode );
+    CleanupStack::PushL( p );
+    p->ConstructL();
+    CleanupStack::Pop();
+    return p;
+    }
+
+// -----------------------------------------------------------------------------
+// CXnNodeBreadthFirstIterator< T >::CXnNodeBreadthFirstIterator()
+// C++ default constructor
+// -----------------------------------------------------------------------------
+//
+template< class T >
+    CXnNodeBreadthFirstIterator < T >::CXnNodeBreadthFirstIterator(
+    T* aStartNode ): iStart( aStartNode ), iCurrent( aStartNode ),
+    iQueue( KMemoryAloc )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+//  CXnNodeBreadthFirstIterator< T >::~CXnNodeBreadthFirstIterator()
+//  C++ default destructor.     
+// -----------------------------------------------------------------------------
+//     
+template< class T >
+    CXnNodeBreadthFirstIterator< T >::~CXnNodeBreadthFirstIterator()
+    {
+    iQueue.Close();
+    }
+
+// -----------------------------------------------------------------------------
+// CXnNodeBreadthFirstIterator< T >::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+template< class T > void CXnNodeBreadthFirstIterator< T >::ConstructL()
+    {
+    iQueue.AppendL( iStart );
+    }
+
+// -----------------------------------------------------------------------------
+// CXnNodeBreadthFirstIterator< T >::NextL()
+// -----------------------------------------------------------------------------
+//
+template< class T > T* CXnNodeBreadthFirstIterator< T >::NextL()
+    {
+    if( iQueue.Count() )
+        {
+        // Dequeue
+        iCurrent = iQueue[0];
+        iQueue.Remove(0);
+
+        RPointerArray< T >& currentChildNodes = iCurrent->Children();
+        TInt currentChildCount( currentChildNodes.Count() );
+
+        // Enqueue
+        for( TInt i = 0; i < currentChildCount; ++i )
+            {
+            iQueue.AppendL( currentChildNodes[i] );
+            }
+        }
+    else
+        {
+        iCurrent = NULL;
+        iQueue.Reset();
+        iQueue.AppendL( iStart );
+        }
+    return iCurrent;
+    }
+
+// -----------------------------------------------------------------------------
+// CXnNodeBreadthFirstIterator< T >::Value()
+// -----------------------------------------------------------------------------
+//
+template< class T > T* CXnNodeBreadthFirstIterator< T >::Value()
+    {
+    return iCurrent;
+    }
+
+// -----------------------------------------------------------------------------
+// CXnNodeBreadthFirstIterator< T >::PreviousL()
+// -----------------------------------------------------------------------------
+//
+template< class T > T* CXnNodeBreadthFirstIterator< T >::PreviousL()
+    {
+    return NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// CXnNodeBreadthFirstIterator< T >::Index()
+// -----------------------------------------------------------------------------
+//
+template< class T > TUint CXnNodeBreadthFirstIterator< T >::Index() const
+    {
+    return 0;
+    }
+
+#endif    //CXNNODEBREADTHFIRSTITERATOR_H
+
+// End of File
\ No newline at end of file