diff -r 000000000000 -r f72a12da539e idlehomescreen/inc/xndepthfirsttreeiterator.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/idlehomescreen/inc/xndepthfirsttreeiterator.h Thu Dec 17 08:40:49 2009 +0200 @@ -0,0 +1,210 @@ +/* +* 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, depth first +* +*/ + +#ifndef XNDEPTHFIRSTTREEITERATOR_H +#define XNDEPTHFIRSTTREEITERATOR_H + +// INCLUDES +#include +#include "xnchilditerator.h" + +// Constants +/** + * Queue granularity value + */ +const TInt KMemoryAlocS = 64; + + +template < class T > + class CXnDepthFirstTreeIterator: public CBase, public MXnChildIterator + { +public: + /** + * Two-phased constructor. + * @param aStartNode Object to iterate over + */ + static CXnDepthFirstTreeIterator< T >* NewL( T& aStartNode ); + + /** + * Destructor. + */ + virtual ~CXnDepthFirstTreeIterator(); + + /** + * 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; + + /** + * Get the current iterator level in the tree. + * @return current level + */ + TUint Level() const; + +protected: + + CXnDepthFirstTreeIterator( T* aStartNode ); + + void ConstructL(); + +private: + //Stack + RPointerArray< T > iStack; + //Object to iterate over + T* iStart; + // Current object + T* iCurrent; + + }; + +// ----------------------------------------------------------------------------- +// CXnDepthFirstTreeIterator< T >::NewL() +// ----------------------------------------------------------------------------- +// +template< class T > CXnDepthFirstTreeIterator< T >* + CXnDepthFirstTreeIterator::NewL( T& aStartNode ) + { + CXnDepthFirstTreeIterator* self = + new ( ELeave )CXnDepthFirstTreeIterator< T >( &aStartNode ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// ----------------------------------------------------------------------------- +// CXnDepthFirstTreeIterator< T >::CXnDepthFirstTreeIterator() +// C++ default constructor +// ----------------------------------------------------------------------------- +// +template< class T > CXnDepthFirstTreeIterator< T >::CXnDepthFirstTreeIterator( + T* aStartNode ) : iStart( aStartNode ), iStack( KMemoryAlocS ) + { + + } + +// ----------------------------------------------------------------------------- +// CXnDepthFirstTreeIterator< T >::~CXnDepthFirstTreeIterator() +// C++ default destructor. +// ----------------------------------------------------------------------------- +// +template< class T > + CXnDepthFirstTreeIterator< T >::~CXnDepthFirstTreeIterator() + { + iStack.Close(); + } + +// ----------------------------------------------------------------------------- +// CXnDepthFirstTreeIterator< T >::ConstructL() +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +template< class T > void CXnDepthFirstTreeIterator< T >::ConstructL() + { + iStack.AppendL( iStart ); + } + +// ----------------------------------------------------------------------------- +// CXnDepthFirstTreeIterator< T >::NextL() +// ----------------------------------------------------------------------------- +// +template< class T > T* CXnDepthFirstTreeIterator< T >::NextL() + { + if( iStack.Count() ) + { + // Pop + TInt topIndex( iStack.Count() - 1 ); + iCurrent = iStack[topIndex]; + iStack.Remove( topIndex ); + + RPointerArray< T >& currentChildNodes( iCurrent->Children() ); + TInt currentChildCount( currentChildNodes.Count() ); + + // Push left most child to top + for( TInt i = currentChildCount - 1; i >= 0; --i ) + { + iStack.AppendL( currentChildNodes[i] ); + } + } + else + { + iCurrent = NULL; + iStack.Reset(); + iStack.AppendL( iStart ); + } + return iCurrent; + } + +// ----------------------------------------------------------------------------- +// CXnDepthFirstTreeIterator< T >::Value() +// ----------------------------------------------------------------------------- +// +template< class T > T* CXnDepthFirstTreeIterator< T >::Value() + { + return iCurrent; + } + +// ----------------------------------------------------------------------------- +// CXnDepthFirstTreeIterator< T >::PreviousL() +// ----------------------------------------------------------------------------- +// +template< class T > T* CXnDepthFirstTreeIterator< T >::PreviousL() + { + return NULL; + } + +// ----------------------------------------------------------------------------- +// CXnDepthFirstTreeIterator< T >::Index() +// ----------------------------------------------------------------------------- +// +template< class T > TUint CXnDepthFirstTreeIterator< T >::Index() const + { + return 0; + } + +// ----------------------------------------------------------------------------- +// CXnDepthFirstTreeIterator< T >::Level() +// Get the current iterator level in the tree. +// ----------------------------------------------------------------------------- +template< class T > TUint CXnDepthFirstTreeIterator< T >::Level() const + { + return iStack.Count(); + } + + +#endif // CXNDEPTHFIRSTTREEITERATOR_H + +// End of File \ No newline at end of file