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