using System; using System.Collections.Generic; using System.Collections; using Microsoft.Msagl.Core.GraphAlgorithms; namespace Microsoft.Msagl.Layout.Layered { /// /// Enumerator of the vertex successors /// internal class SuccEnumerator : IEnumerator { IEnumerator edges; public void Reset() { edges.Reset(); } public void Dispose() { GC.SuppressFinalize(this); } public bool MoveNext() { return edges.MoveNext(); } internal SuccEnumerator(IEnumerator edges) { this.edges = edges; } #region IEnumerator Members public int Current { get { return((IntEdge)edges.Current).Target; } } #endregion #region IEnumerator Members object IEnumerator.Current { get { throw new NotImplementedException(); } } #endregion } /// /// Enumeration of the vertex predecessors /// internal class PredEnumerator : IEnumerator { IEnumerator edges; public void Dispose() { GC.SuppressFinalize(this); } public void Reset() { edges.Reset(); } #if SHARPKIT //http://code.google.com/p/sharpkit/issues/detail?id=203 public int Current { #else int IEnumerator.Current { #endif get { return ((IntEdge)edges.Current).Source; } } object IEnumerator.Current { get { IntEdge l = edges.Current as IntEdge; return l.Source; } } public bool MoveNext() { return edges.MoveNext(); } internal PredEnumerator(IEnumerator edges) { this.edges = edges; } } internal class EmptyEnumerator : IEnumerator { public bool MoveNext() { return false; } #if SHARPKIT //http://code.google.com/p/sharpkit/issues/detail?id=203 public int Current { get { return 0; } } #else int IEnumerator.Current { get { return 0; } } #endif object IEnumerator.Current { get { return 0; } } void IEnumerator.Reset() { } public void Dispose() { GC.SuppressFinalize(this); } } internal class Pred : IEnumerable { #region IEnumerable Members BasicGraph graph; int vert; #if SHARPKIT //http://code.google.com/p/sharpkit/issues/detail?id=203 public IEnumerator GetEnumerator() { #else IEnumerator IEnumerable.GetEnumerator() { #endif IEnumerable e = graph.InEdges(vert); if (e == null) { return new EmptyEnumerator(); } else return new PredEnumerator(e.GetEnumerator()); } IEnumerator IEnumerable.GetEnumerator() { IEnumerable e = graph.InEdges(vert); if (e == null) { return new EmptyEnumerator(); } else return new PredEnumerator(e.GetEnumerator()); } internal Pred(BasicGraph g, int v) { this.graph = g; this.vert = v; } #endregion } internal class Succ { #region IEnumerable Members BasicGraph graph; int vert; public IEnumerator GetEnumerator() { return new SuccEnumerator(graph.OutEdges(vert).GetEnumerator()); } internal Succ(BasicGraph g, int v) { this.graph = g; this.vert = v; } #endregion } }