/** 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 <e32base.h>#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<T>::NewL( T& aStartNode ) { CXnDepthFirstTreeIterator<T>* 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 ), iCurrent( 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