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