package simulation;
import java.util.TreeSet;
import java.util.Comparator;
import events.SimEvent;
public class SimDriver {
Simulation sim;
TreeSet<SimEvent> eventQueue;
double currentTime = 0;
public int nevents() {return eventQueue.size();}
public SimDriver(Simulation sim) {
this.sim = sim;
sim.setSimDriver(this);
eventQueue = new TreeSet<SimEvent>(new CmpEvent());
}
public void run() {
while (!eventQueue.isEmpty()) {
SimEvent e = eventQueue.pollFirst();
assert e.getTime() >= currentTime;
currentTime = e.getTime();
e.run();
}
}
public double getCurrentTime() {return currentTime;}
public void schedule(SimEvent e) {
assert e.getTime() >= currentTime: "event time: " + e.getTime() + " currentTime: " + currentTime;
eventQueue.add(e);
}
public void deschedule(SimEvent e) {
eventQueue.remove(e);
}
class CmpEvent implements Comparator<SimEvent> {
public int compare(SimEvent e0, SimEvent e1) {
int cmpTime = Double.compare(e0.getTime(), e1.getTime());
if (0 == cmpTime)
return Long.valueOf(e0.getUniqueID()).compareTo(Long.valueOf(e1.getUniqueID()));
else
return cmpTime;
}
}
}