crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbolLib/Generic/Collection/GenericSymbolCollection.cs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbolLib/Generic/Collection/GenericSymbolCollection.cs Thu Feb 11 15:50:58 2010 +0200
@@ -0,0 +1,311 @@
+/*
+* 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.IO;
+using System.Collections;
+using System.Collections.Generic;
+using SymbolLib.Utils;
+using SymbianUtils.Range;
+
+namespace SymbolLib.Generics
+{
+ public abstract class GenericSymbolCollection : IEnumerable<GenericSymbol>, IComparable<GenericSymbolCollection>
+ {
+ #region Construct & destruct
+ protected GenericSymbolCollection( string aHostBinaryFileName )
+ {
+ HostBinaryFileName = aHostBinaryFileName;
+ }
+ #endregion
+
+ #region Virtual API
+ public virtual void ClearTag()
+ {
+ Tagged = false;
+ }
+
+ public virtual void WriteToStream( StreamWriter aWriter )
+ {
+ // First write the binary name
+ aWriter.WriteLine( string.Empty );
+ aWriter.WriteLine( "From " + HostBinaryFileName );
+ aWriter.WriteLine( string.Empty );
+
+ foreach ( GenericSymbol symbol in this )
+ {
+ aWriter.WriteLine( symbol.ToStringForStream() );
+ }
+ }
+ #endregion
+
+ #region Abstract API - methods
+ public abstract void Add( GenericSymbolEngine aEngine, GenericSymbol aSymbol );
+
+ public abstract void Remove( GenericSymbol aSymbol );
+
+ public abstract void RemoveAt( int aIndex );
+
+ public abstract IEnumerator CreateEnumerator();
+
+ public abstract IEnumerator<GenericSymbol> CreateGenericEnumerator();
+
+ public abstract GenericSymbol SymbolForAddress( long aAddress );
+ #endregion
+
+ #region Abstract API - properties
+ public abstract int Count
+ {
+ get;
+ }
+
+ public abstract GenericSymbol this[ int aIndex ]
+ {
+ get;
+ }
+
+ public abstract void Sort();
+ #endregion
+
+ #region API
+ public bool AddressFallsWithinRange( long aAddress )
+ {
+ bool found = false;
+ //
+ if ( this.Count == 1 && this[ 0 ].IsUnknownSymbol )
+ {
+ int x = 0;
+ x++;
+ }
+
+ if ( aAddress > 0 )
+ {
+ if ( iAddresses == null )
+ {
+ RebuildAddressRange();
+ }
+ //
+ found = iAddresses.IsWithinRange( aAddress );
+ }
+ //
+ return found;
+ }
+
+#if DEBUG
+ public void Dump()
+ {
+ int i = 0;
+ string line = string.Empty;
+ foreach ( GenericSymbol entry in this )
+ {
+ line = i.ToString( "d8" ) + " [" + entry.Address.ToString( "x8" ) + "-" + entry.EndAddress.ToString( "x8" ) + "] " + entry.Symbol.ToString();
+ System.Diagnostics.Debug.WriteLine( line );
+ i++;
+ }
+ }
+
+ public void Dump( long aAddress )
+ {
+ int i = 0;
+ string line = string.Empty;
+ foreach ( GenericSymbol entry in this )
+ {
+ if ( entry.FallsWithinDomain( aAddress ) )
+ {
+ line = i.ToString( "d8" ) + " * [" + entry.Address.ToString( "x8" ) + "-" + entry.EndAddress.ToString( "x8" ) + "] " + entry.Symbol.ToString();
+ }
+ else
+ {
+ line = i.ToString( "d8" ) + " [" + entry.Address.ToString( "x8" ) + "-" + entry.EndAddress.ToString( "x8" ) + "] " + entry.Symbol.ToString();
+ }
+ System.Diagnostics.Debug.WriteLine( line );
+ i++;
+ }
+ }
+#endif
+ #endregion
+
+ #region Symbol Properties
+ public GenericSymbol FirstSymbol
+ {
+ get
+ {
+ GenericSymbol ret = null;
+ if ( Count > 0 )
+ {
+ ret = this[ 0 ];
+ }
+ return ret;
+ }
+ }
+
+ public GenericSymbol LastSymbol
+ {
+ get
+ {
+ GenericSymbol ret = null;
+ if ( Count > 0 )
+ {
+ ret = this[ Count - 1 ];
+ }
+ return ret;
+ }
+ }
+ #endregion
+
+ #region Misc Properties
+ public bool Tagged
+ {
+ get { return iTagged; }
+ set { iTagged = value; }
+ }
+
+ public long BaseAddress
+ {
+ get { return iBaseAddress; }
+ internal set { iBaseAddress = value; }
+ }
+
+ public string HostBinaryFileName
+ {
+ get { return iHostBinaryFileName; }
+ set
+ {
+ System.Diagnostics.Debug.Assert( !value.ToLower().Contains( ".map" ) );
+ iHostBinaryFileName = value;
+ }
+ }
+
+ public bool HostBinaryExists
+ {
+ get { return File.Exists( HostBinaryFileName ); }
+ }
+
+ public virtual long AddressRangeStart
+ {
+ get
+ {
+ long ret = 0;
+ //
+ if ( Count > 0 )
+ {
+ ret = FirstSymbol.Address;
+ }
+ //
+ return ret;
+ }
+ }
+
+ public virtual long AddressRangeEnd
+ {
+ get
+ {
+ long ret = 0xffffffff;
+ //
+ if ( Count > 0 )
+ {
+ ret = LastSymbol.EndAddress;
+ }
+ //
+ return ret;
+ }
+ }
+
+ public virtual AddressRange AddressRange
+ {
+ get { return new AddressRange( AddressRangeStart, AddressRangeEnd ); }
+ }
+
+ public string SourceFile
+ {
+ get { return iSourceFile; }
+ internal set { iSourceFile = value; }
+ }
+ #endregion
+
+ #region Internal methods
+ protected void RebuildAddressRange()
+ {
+ iAddresses = new SymbolAddressRange( this );
+ }
+ #endregion
+
+ #region From IEnumerable
+ IEnumerator IEnumerable.GetEnumerator()
+ {
+ return CreateEnumerator();
+ }
+
+ IEnumerator<GenericSymbol> IEnumerable<GenericSymbol>.GetEnumerator()
+ {
+ return CreateGenericEnumerator();
+ }
+ #endregion
+
+ #region From IComparable
+ public int CompareTo( GenericSymbolCollection aOther )
+ {
+ int ret = 1;
+ //
+ if ( aOther != null )
+ {
+ ret = string.Compare( HostBinaryFileName, aOther.HostBinaryFileName, true );
+ //
+ if ( aOther is GenericSymbolCollection )
+ {
+ GenericSymbolCollection otherCol = (GenericSymbolCollection) aOther;
+ //
+ if ( BaseAddress == otherCol.BaseAddress )
+ {
+ ret = 0;
+ }
+ else if ( BaseAddress > otherCol.BaseAddress )
+ {
+ ret = 1;
+ }
+ else
+ {
+ ret = -1;
+ }
+ }
+ }
+
+ // Debug check
+ if ( aOther == this )
+ {
+ System.Diagnostics.Debug.Assert( ret == 0 );
+ }
+ //
+ return ret;
+ }
+ #endregion
+
+ #region From System.Object
+ public override string ToString()
+ {
+ return string.Format( "{0} {1}", AddressRange, iHostBinaryFileName );
+ }
+ #endregion
+
+ #region Data members
+ private bool iTagged = false;
+ private long iBaseAddress = 0;
+ private string iHostBinaryFileName = string.Empty;
+ private string iSourceFile = string.Empty;
+ private SymbolAddressRange iAddresses = null;
+ #endregion
+ }
+}