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
}
}