Files
ParkingRobot/ClumsyPilot/TrajectoryPlanningVisualization/Runtime/BoundedCycleHistory.cs
T

56 lines
1.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace TrajectoryPlanningVisualization;
public sealed class BoundedCycleHistory
{
private readonly object sync = new object();
private readonly int capacity;
private readonly Queue<VisualizationCycleSummary> entries = new Queue<VisualizationCycleSummary>();
private readonly HashSet<long> versions = new HashSet<long>();
public BoundedCycleHistory(int capacity)
{
if (capacity <= 0)
{
throw new ArgumentOutOfRangeException(nameof(capacity));
}
this.capacity = capacity;
}
public void Add(VisualizationCycleSummary summary)
{
if (summary == null)
{
throw new ArgumentNullException(nameof(summary));
}
lock (sync)
{
if (!versions.Add(summary.CycleVersion))
{
return;
}
entries.Enqueue(summary);
while (entries.Count > capacity)
{
VisualizationCycleSummary removed = entries.Dequeue();
versions.Remove(removed.CycleVersion);
}
}
}
public IReadOnlyList<VisualizationCycleSummary> Snapshot()
{
lock (sync)
{
return new ReadOnlyCollection<VisualizationCycleSummary>(
new List<VisualizationCycleSummary>(entries));
}
}
}