20 package org.matsim.core.mobsim.qsim.qnetsimengine;
22 import java.io.Serializable;
23 import java.util.Comparator;
24 import java.util.LinkedList;
25 import java.util.List;
26 import java.util.ListIterator;
27 import java.util.PriorityQueue;
28 import java.util.Queue;
44 final class TransitQLink {
49 private final Queue<QVehicle> transitVehicleStopQueue =
new PriorityQueue<>(5, VEHICLE_EXIT_COMPARATOR);
50 private final QLaneI road;
52 private static final Comparator<QVehicle> VEHICLE_EXIT_COMPARATOR =
new QVehicleEarliestLinkExitTimeComparator();
55 TransitQLink(QLaneI road){
59 Queue<QVehicle> getTransitVehicleStopQueue(){
60 return this.transitVehicleStopQueue;
63 final boolean addTransitToStopQueue(
final double now,
final QVehicle veh,
final Id<Link> linkId) {
64 if (veh.getDriver() instanceof TransitDriverAgent) {
65 TransitDriverAgent driver = (TransitDriverAgent) veh.getDriver();
67 TransitStopFacility stop = driver.getNextTransitStop();
68 if ((stop != null) && (stop.getLinkId().equals(linkId))) {
69 double delay = driver.handleTransitStop(stop, now);
73 veh.setEarliestLinkExitTime(now + delay);
75 transitVehicleStopQueue.add(veh);
92 void handleTransitVehiclesInStopQueue(
final double now) {
95 List<QVehicle> departingTransitVehicles = null;
96 while ((veh = transitVehicleStopQueue.peek()) != null) {
98 if (veh.getEarliestLinkExitTime() > now) {
101 if (departingTransitVehicles == null) {
102 departingTransitVehicles =
new LinkedList<>();
104 departingTransitVehicles.add(transitVehicleStopQueue.poll());
106 if (departingTransitVehicles != null) {
108 ListIterator<QVehicle> iter = departingTransitVehicles.listIterator(departingTransitVehicles.size());
109 while (iter.hasPrevious()) {
110 this.road.addTransitSlightlyUpstreamOfStop(iter.previous()) ;
115 HandleTransitStopResult handleTransitStop(
final double now,
final QVehicle veh,
116 final TransitDriverAgent transitDriver, Id<Link> linkId) {
117 TransitStopFacility stop = transitDriver.getNextTransitStop();
118 if ((stop != null) && (stop.getLinkId().equals(linkId))) {
119 double delay = transitDriver.handleTransitStop(stop, now);
121 veh.setEarliestLinkExitTime(now + delay);
123 if (!stop.getIsBlockingLane()) {
124 transitVehicleStopQueue.add(veh);
126 return HandleTransitStopResult.accepted;
129 return HandleTransitStopResult.rehandle;
133 return HandleTransitStopResult.rehandle;
137 return HandleTransitStopResult.continue_driving;
147 static class QVehicleEarliestLinkExitTimeComparator
implements Comparator<QVehicle>,
148 Serializable, MatsimComparator {
150 private static final long serialVersionUID = 1L;
153 public int compare(
final QVehicle veh1,
final QVehicle veh2) {
154 if (veh1.getEarliestLinkExitTime() > veh2.getEarliestLinkExitTime()) {
157 if (veh1.getEarliestLinkExitTime() < veh2.getEarliestLinkExitTime()) {
162 return veh2.getId().compareTo(veh1.getId());