Aetheria/Assets/Plugins/MSAGL/Routing/Rectilinear/EnumeratorWrapper.cs
Reinier Vens dbc522a224 Weapos Rejiggered
Modified weapon scripts to eliminate specialized projectile behavior - allows charged weapons to have projectiles and modify weapon stats when charged
Added machine gun weapon & VFX
Moved third party code to Plugins folder to improve compile times
2021-01-31 03:52:32 +00:00

50 lines
No EOL
1.6 KiB
C#

using System.Collections.Generic;
using System.Diagnostics;
namespace Microsoft.Msagl.Routing.Rectilinear {
/// <summary>
/// Used in merge-type operations to track whether MoveNext has returned false.
/// </summary>
/// <typeparam name="T"></typeparam>
internal class EnumeratorWrapper<T> {
/// <summary>
/// False iff MoveNext has not been called, or has returned false.
/// </summary>
internal bool HasCurrent { get { return this.state == MoveNextState.True; } }
/// <summary>
/// State of MoveNext. MoveNext is not automatically called on ctor for consistency with unwrapped enumerators.
/// </summary>
private enum MoveNextState {
NotCalled,
True,
False
}
private MoveNextState state = MoveNextState.NotCalled;
private readonly IEnumerator<T> enumerator;
internal EnumeratorWrapper(IEnumerable<T> 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;
}
}
}