use std::marker::PhantomData;
use crate::NeedsDeparture;
use crate::Query;
use crate::endpoints::Endpoints;
use crate::ids::RouteIdx;
use crate::ids::StopIdx;
use crate::ids::TripIdx;
use crate::label::ArrivalTime;
use crate::label::Label;
use crate::time::Duration;
use crate::time::SecondOfDay;
use crate::time::Transfers;
pub trait Timetable {
fn n_stops(&self) -> usize;
fn n_routes(&self) -> usize;
fn get_routes_serving_stop(&self, stop: StopIdx) -> &[(RouteIdx, u32)];
fn get_stops_after(&self, route: RouteIdx, pos: u32) -> &[StopIdx];
fn stop_at(&self, route: RouteIdx, pos: u32) -> StopIdx;
fn get_earliest_trip(&self, route: RouteIdx, at: SecondOfDay, pos: u32) -> Option<TripIdx>;
fn get_arrival_time(&self, trip: TripIdx, pos: u32) -> SecondOfDay;
fn get_departure_time(&self, trip: TripIdx, pos: u32) -> SecondOfDay;
fn pickup_allowed(&self, trip: TripIdx, pos: u32) -> bool {
let (_, _) = (trip, pos);
true
}
fn drop_off_allowed(&self, trip: TripIdx, pos: u32) -> bool {
let (_, _) = (trip, pos);
true
}
fn trip_wheelchair_accessible(&self, trip: TripIdx) -> bool {
let _ = trip;
true
}
fn stop_wheelchair_accessible(&self, stop: StopIdx) -> bool {
let _ = stop;
true
}
fn earliest_accessible_trip(
&self,
route: RouteIdx,
at: SecondOfDay,
pos: u32,
require_wheelchair_accessible: bool,
) -> Option<TripIdx> {
if !require_wheelchair_accessible {
return self.get_earliest_trip(route, at, pos);
}
let mut probe = at;
loop {
let trip = self.get_earliest_trip(route, probe, pos)?;
if self.trip_wheelchair_accessible(trip) {
return Some(trip);
}
let dep = self.get_departure_time(trip, pos);
probe = dep + Duration::from_secs(1);
}
}
fn get_footpaths_from(&self, stop: StopIdx) -> &[StopIdx];
fn get_transfer_time(&self, from: StopIdx, to: StopIdx) -> Duration {
let (_, _) = (from, to);
Duration(1)
}
fn footpaths_are_transitively_closed(&self) -> bool {
false
}
fn query(&self) -> Query<'_, Self, ArrivalTime, NeedsDeparture>
where
Self: Sized,
{
Query {
tt: self,
origins: Endpoints::new(),
targets: Endpoints::new(),
max_transfers: Transfers(10),
require_wheelchair_accessible: false,
ctx: Default::default(),
mode: NeedsDeparture,
_label: PhantomData,
}
}
fn query_with_label<L: Label>(&self) -> Query<'_, Self, L, NeedsDeparture>
where
Self: Sized,
{
Query {
tt: self,
origins: Endpoints::new(),
targets: Endpoints::new(),
max_transfers: Transfers(10),
require_wheelchair_accessible: false,
ctx: Default::default(),
mode: NeedsDeparture,
_label: PhantomData,
}
}
}