using System;
using System.Collections.Generic;
namespace sccdlib
{
///
/// Abstracting the event Queue. Currently uses a List to store it's content, but could have better performance when built on a priority queue.
///
public class EventQueue
{
private class EventQueueEntry
{
double time_offset;
Event e;
public EventQueueEntry(Event e, double time_offset)
{
this.e = e;
this.time_offset = time_offset;
}
public void decreaseTime(double offset)
{
this.time_offset -= offset;
}
public Event getEvent()
{
return this.e;
}
public double getTime ()
{
return this.time_offset;
}
}
List event_list = new List();
public void Add (Event e, double time_offset)
{
EventQueueEntry entry = new EventQueueEntry(e,time_offset);
//We maintain a sorted stable list
int insert_index = 0;
for (int index = this.event_list.Count-1; index >= 0; index--)
{
if (this.event_list[index].getTime() <= time_offset)
{
insert_index = index + 1;
break;
}
}
this.event_list.Insert(insert_index, entry);
}
public void decreaseTime(double offset)
{
foreach (EventQueueEntry e in this.event_list)
e.decreaseTime(offset);
}
public bool isEmpty()
{
return this.event_list.Count == 0;
}
///
/// Gets the earliest time.
///
///
/// The earliest time. Positive infinity if no events are present.
///
public double getEarliestTime ()
{
if (this.isEmpty())
{
return double.PositiveInfinity;
}
else
{
return this.event_list[0].getTime();
}
}
public List popDueEvents ()
{
List result = new List ();
if (this.isEmpty() || this.event_list[0].getTime() > 0.0)
//There are no events, or the earliest event isn't due, so we can already return an emtpy result
return result;
int index = 0;
while (index < this.event_list.Count && this.event_list[index].getTime() <= 0.0)
{
result.Add(this.event_list[index].getEvent()); //Add all events that are due (offset less than 0) to the result
index++;
}
this.event_list.RemoveRange(0, result.Count);
return result;
}
}
}