diff -r 000000000000 -r f72a12da539e idlehomescreen/inc/xnnodebreadthfirstiterator.h --- /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 +#include +#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