Struct sim::mechanics::queue::Queue [−][src]
pub(crate) struct Queue {
pub id: Traversable,
members: VecDeque<Queued>,
pub laggy_head: Option<CarID>,
pub geom_len: Distance,
pub reserved_length: Distance,
}
Expand description
A Queue of vehicles on a single lane or turn. This is where https://a-b-street.github.io/docs/tech/trafficsim/discrete_event.html#exact-positions is implemented.
Some helpful pieces of terminology:
- a “laggy head” is a vehicle whose front is now past the end of this queue, but whose back may still be partially in the queue. The position of the first car in the queue is still bounded by the laggy head’s back.
- a “static blockage” is due to a vehicle exiting a driveway and immediately cutting across a few lanes. The “static” part means it occupies a fixed interval of distance in the queue. When the vehicle is finished exiting the driveway, this blockage is removed.
- a “dynamic blockage” is due to a vehicle changing lanes in the middle of the queue. The exact position of the blockage in this queue is unknown (it depends on the target queue). The blockage just occupies the length of the vehicle and keeps following whatever’s in front of it.
- “active cars” are the main members of the queue – everything except for laggy heads and blockages.
Fields
id: Traversable
members: VecDeque<Queued>
laggy_head: Option<CarID>
This car’s back is still partly in this queue.
geom_len: Distance
How long the lane or turn physically is.
reserved_length: Distance
When a car’s turn is accepted, reserve the vehicle length + FOLLOWING_DISTANCE for the target lane. When the car completely leaves (stops being the laggy_head), free up that space. To prevent blocking the box for possibly scary amounts of time, allocate some of this length first. This is unused for turns themselves. This value can exceed geom_len (for the edge case of ONE long car on a short queue).
Implementations
Get the front of the last car in the queue.
Return the exact position of each member of the queue. The farthest along (greatest distance) is first.
fn inner_get_last_car_position(
&self,
now: Time,
cars: &FixedMap<CarID, Car>,
queues: &HashMap<Traversable, Queue>,
recursed_queues: &mut BTreeSet<Traversable>,
intermediate_results: Option<&mut Vec<QueueEntry>>
) -> Option<(CarID, Distance)>
fn inner_get_last_car_position(
&self,
now: Time,
cars: &FixedMap<CarID, Car>,
queues: &HashMap<Traversable, Queue>,
recursed_queues: &mut BTreeSet<Traversable>,
intermediate_results: Option<&mut Vec<QueueEntry>>
) -> Option<(CarID, Distance)>
Returns the front of the last car in the queue, only if the last member is an active car.
If the specified car can appear in the queue, return the position in the queue to do so.
Record that a car has entered a queue at a position. This must match get_idx_to_insert_car – the same index and immediately after passing that query.
Record that a car has entered a queue at the end. It’s assumed that try_to_reserve_entry has already happened.
Change the first car in the queue to the laggy head, indicating that it’s front has left the queue, but its back is still there. Return that car.
If true, there’s room and the car must actually start the turn (because the space is reserved).
True if the reserved length exceeds the physical length. This means a vehicle is headed towards the queue already and is expected to not fit entirely inside.
Can a car start a turn for this queue?
Once a car has fully exited a queue, free up the space it was reserving.
Return a penalty for entering this queue, as opposed to some adjacent ones. Used for lane-changing. (number of vehicles, is there a bike here)
Find the vehicle in front of the specified input. None if the specified vehicle isn’t ACTIVE (not a blockage) in the queue at all, or they’re the front (with or without a laggy head).
Record that a car is blocking a static portion of the queue (from front to back). Must use the index from can_block_from_driveway.
Record that a car is no longer blocking a static portion of the queue.
Record that a car is starting to change lanes away from this queue.
Record that a car is no longer blocking a dynamic portion of the queue.
True if a static blockage can be inserted into the queue without anything already there intersecting it. Returns the index if so. The position represents the front of the blockage.
Get all cars in the queue, not including the laggy head or blockages.
TODO Do NOT use this for calculating indices or getting the leader/follower. Might be safer to just hide this and only expose number of active cars, first, and last.
Remove a car from a position. Need to separately do free_reserved_space.
If a car thinks it’s reached the end of the queue, double check. Blockages or laggy heads might be in the way.
Trait Implementations
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error> where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error> where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read more
Auto Trait Implementations
impl RefUnwindSafe for Queue
impl UnwindSafe for Queue
Blanket Implementations
Mutably borrows from an owned value. Read more
impl<T> Downcast for T where
T: Any,
impl<T> Downcast for T where
T: Any,
Convert Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
. Read more
pub fn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>
pub fn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>
Convert Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
. Read more
Convert &Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s. Read more
pub fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
pub fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Convert &mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s. Read more
Instruments this type with the provided Span
, returning an
Instrumented
wrapper. Read more
type Output = T
type Output = T
Should always be Self