r2mods/ilspy_dump/ror2_csproj/DoXInYSecondsTracker.cs

69 lines
1.3 KiB
C#

using System;
using HG;
public class DoXInYSecondsTracker
{
private readonly float[] timestamps;
private readonly float window;
private int lastValidCount;
private float newestTime => timestamps[0];
private int requirement => timestamps.Length;
public DoXInYSecondsTracker(int requirement, float window)
{
if (requirement < 1)
{
throw new ArgumentException("Argument must be greater than zero", "requirement");
}
timestamps = new float[requirement];
Clear();
this.window = window;
}
public void Clear()
{
for (int i = 0; i < timestamps.Length; i++)
{
timestamps[i] = float.NegativeInfinity;
}
}
private int FindInsertionPosition(float t)
{
for (int i = 0; i < lastValidCount; i++)
{
if (timestamps[i] < t)
{
return i;
}
}
return lastValidCount;
}
public bool Push(float t)
{
float num = t - window;
if (t < newestTime)
{
lastValidCount = timestamps.Length;
}
int num2 = lastValidCount - 1;
while (num2 >= 0 && !(num <= timestamps[num2]))
{
lastValidCount--;
num2--;
}
int num3 = FindInsertionPosition(t);
if (num3 < timestamps.Length)
{
lastValidCount++;
ArrayUtils.ArrayInsertNoResize(timestamps, lastValidCount, num3, in t);
}
return lastValidCount == requirement;
}
}