diff -r 000000000000 -r 818e61de6cd1 crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbianTree/Nodes/SymNodeEnumerators.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbianTree/Nodes/SymNodeEnumerators.cs Thu Feb 11 15:50:58 2010 +0200 @@ -0,0 +1,378 @@ +/* +* Copyright (c) 2009 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: +* +*/ +using System; +using System.Collections; +using System.Collections.Generic; + +namespace SymbianTree +{ + #region SymNodeEnumeratorSiblings + public class SymNodeEnumeratorSiblings : IEnumerator, IEnumerable + { + #region Constructors + public SymNodeEnumeratorSiblings( SymNode aNodeToEnumerate ) + { + iNode = aNodeToEnumerate; + } + #endregion + + #region From IEnumerable + IEnumerator IEnumerable.GetEnumerator() + { + return this; + } + + IEnumerator IEnumerable.GetEnumerator() + { + return this; + } + #endregion + + #region IEnumerator Members + void IEnumerator.Reset() + { + iCurrentNode = null; + } + + object IEnumerator.Current + { + get + { + return iCurrentNode; + } + } + + bool IEnumerator.MoveNext() + { + if ( iCurrentNode == null ) + { + iCurrentNode = iNode; + } + else + { + iCurrentNode = iCurrentNode.Next; + } + + bool haveMoreNodes = ( iCurrentNode.Next != null ); + return haveMoreNodes; + } + #endregion + + #region From IEnumerator + SymNode IEnumerator.Current + { + get { return iCurrentNode; } + } + #endregion + + #region From IDisposable + public void Dispose() + { + } + #endregion + + #region Data members + private readonly SymNode iNode; + private SymNode iCurrentNode = null; + #endregion + } + #endregion + + #region SymNodeEnumeratorChildren + public class SymNodeEnumeratorChildren : IEnumerator, IEnumerable + { + #region Constructors + public SymNodeEnumeratorChildren( SymNode aNodeToEnumerate ) + { + iNode = aNodeToEnumerate; + } + #endregion + + #region From IEnumerable + IEnumerator IEnumerable.GetEnumerator() + { + return this; + } + + IEnumerator IEnumerable.GetEnumerator() + { + return this; + } + #endregion + + #region IEnumerator Members + void IEnumerator.Reset() + { + iEnumeratorIndex = -1; + } + + object IEnumerator.Current + { + get + { + return iNode.Children[ iEnumeratorIndex ]; + } + } + + bool IEnumerator.MoveNext() + { + return ( ++iEnumeratorIndex < iNode.ChildCount ); + } + #endregion + + #region From IEnumerator + SymNode IEnumerator.Current + { + get { return iNode.Children[ iEnumeratorIndex ]; } + } + #endregion + + #region From IDisposable + public void Dispose() + { + } + #endregion + + #region Data members + private readonly SymNode iNode; + private int iEnumeratorIndex = -1; + #endregion + } + #endregion + + #region SymNodeEnumeratorTreeChildrenFirst + public class SymNodeEnumeratorTreeChildrenFirst : IEnumerator, IEnumerable + { + #region Constructors + public SymNodeEnumeratorTreeChildrenFirst( SymNode aStartingNode ) + { + iStartingNode = aStartingNode; + } + #endregion + + #region From IEnumerable + IEnumerator IEnumerable.GetEnumerator() + { + return this; + } + + IEnumerator IEnumerable.GetEnumerator() + { + return this; + } + #endregion + + #region IEnumerator Members + void IEnumerator.Reset() + { + iCurrentNode = null; + } + + object IEnumerator.Current + { + get + { + return iCurrentNode; + } + } + + bool IEnumerator.MoveNext() + { + iCurrentNode = NextNode( iCurrentNode ); + + bool haveMoreNodes = ( NextNode( iCurrentNode ) != null ); + return haveMoreNodes; + } + #endregion + + #region From IEnumerator + SymNode IEnumerator.Current + { + get { return iCurrentNode; } + } + #endregion + + #region From IDisposable + public void Dispose() + { + } + #endregion + + #region Internal methods + private SymNode NextNode( SymNode aCurrentNode ) + { + SymNode nextNode = null; + // + if ( aCurrentNode == null ) + { + nextNode = iStartingNode; + } + else + { + #region Example + // + // [A] + // / + // / + // [B] + // / | \ + // / | \ + // [C] [E] [I] + // / / \ \ + // / / \ \ + // [D] [F] [H] [J] + // / + // / + // [G] + // + // Navigation plan: + // + // [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [G] -> [H] -> [I] -> [J] + // + #endregion + + if ( aCurrentNode.HasChildren ) + { + // Try to visit the node's children first. + nextNode = aCurrentNode.FirstChild; + } + else + { + // No children... + if ( aCurrentNode.HasNext ) + { + // Go to next sibling + nextNode = aCurrentNode.Next; + } + else + { + // No (more) siblings - go to parent's next sibling. + // For example, in the case of the current node being [G] + // we need to traverse seemlessly to [H]. Therefore + // we go from [G] -> [F] -> [H] + nextNode = aCurrentNode.Parent; // [F] + while( nextNode != null && nextNode.HasNext == false ) + { + nextNode = nextNode.Parent; + } + + // We'll now be at [F] + if ( nextNode != null ) + { + // Now we'll be at [H] + nextNode = nextNode.Next; + } + } + } + } + // + return nextNode; + } + #endregion + + #region Data members + private readonly SymNode iStartingNode; + private SymNode iCurrentNode = null; + #endregion + } + #endregion + + #region SymNodeEnumeratorUpTreeSiblingsFirst + public class SymNodeEnumeratorUpTreeSiblingsFirst : IEnumerator, IEnumerable + { + #region Constructors + public SymNodeEnumeratorUpTreeSiblingsFirst( SymNode aStartingNode ) + { + iStartingNode = aStartingNode.FirstSibling; + } + #endregion + + #region From IEnumerable + IEnumerator IEnumerable.GetEnumerator() + { + return this; + } + + IEnumerator IEnumerable.GetEnumerator() + { + return this; + } + #endregion + + #region IEnumerator Members + void IEnumerator.Reset() + { + iCurrentNode = null; + } + + object IEnumerator.Current + { + get + { + return iCurrentNode; + } + } + + bool IEnumerator.MoveNext() + { + if ( iCurrentNode == null ) + { + iCurrentNode = iStartingNode; + } + else + { + if ( iCurrentNode.HasNext ) + { + iCurrentNode = iCurrentNode.Next; + } + else + { + iCurrentNode = iCurrentNode.Parent.FirstSibling; + } + + System.Diagnostics.Debug.Assert( iCurrentNode != null ); + } + + bool haveMoreNodes = iCurrentNode.HasNext; + if ( haveMoreNodes == false ) + { + haveMoreNodes = iCurrentNode.HasParent; + } + return haveMoreNodes; + } + #endregion + + #region From IEnumerator + SymNode IEnumerator.Current + { + get { return iCurrentNode; } + } + #endregion + + #region From IDisposable + public void Dispose() + { + } + #endregion + + #region Data members + private readonly SymNode iStartingNode; + private SymNode iCurrentNode = null; + #endregion + } + #endregion +}