using System.Collections.Generic;
using System.Diagnostics;
namespace Microsoft.Msagl.Routing.Rectilinear {
///
/// Used in merge-type operations to track whether MoveNext has returned false.
///
///
internal class EnumeratorWrapper {
///
/// False iff MoveNext has not been called, or has returned false.
///
internal bool HasCurrent { get { return this.state == MoveNextState.True; } }
///
/// State of MoveNext. MoveNext is not automatically called on ctor for consistency with unwrapped enumerators.
///
private enum MoveNextState {
NotCalled,
True,
False
}
private MoveNextState state = MoveNextState.NotCalled;
private readonly IEnumerator enumerator;
internal EnumeratorWrapper(IEnumerable enumerable) {
this.enumerator = enumerable.GetEnumerator();
}
internal T Current
{
get {
Debug.Assert(this.HasCurrent, "MoveNext has not been called or has returned false");
return this.enumerator.Current;
}
}
internal bool MoveNext() {
Debug.Assert(this.state != MoveNextState.False, "MoveNext has returned false");
if (this.enumerator.MoveNext()) {
this.state = MoveNextState.True;
return true;
}
this.state = MoveNextState.False;
return false;
}
}
}