1 #ifndef LIBR2C2_TRAINROUTEPLANNER_H_
2 #define LIBR2C2_TRAINROUTEPLANNER_H_
6 #include <msp/time/timedelta.h>
17 class TrainRoutePlanner
20 struct TrainRoutingState;
22 struct TrainRoutingInfo
28 std::list<TrainRoutingState *> waits;
30 TrainRoutingInfo(Train &);
41 OccupiedTrack(Track &, unsigned, OccupiedTrack *);
42 OccupiedTrack(const OccupiedTrack &);
54 struct TrainRoutingState
56 TrainRoutingInfo *info;
59 OccupiedTrack *occupied_tracks;
63 Msp::Time::TimeDelta delay;
67 TrainRoutingState(TrainRoutingInfo &);
68 TrainRoutingState(const TrainRoutingState &);
71 Msp::Time::TimeDelta get_time_to_next_track() const;
72 bool is_occupied(Track &) const;
74 void advance_track(unsigned);
79 Msp::Time::TimeDelta time;
80 std::vector<TrainRoutingState> trains;
84 RoutingStep(RoutingStep *);
87 bool check_deadlocks() const;
88 int get_occupant(Track &) const;
89 int find_next_train() const;
90 void advance(const Msp::Time::TimeDelta &);
91 bool is_viable() const;
94 bool operator<(const RoutingStep &) const;
97 std::vector<TrainRoutingInfo> routed_trains;
98 std::list<RoutingStep> steps;
101 TrainRoutePlanner(Layout &);
105 bool update_states(RoutingStep &);
106 void add_steps(RoutingStep &, unsigned);
107 void add_waiting_step(RoutingStep &, unsigned);
108 void add_steps(RoutingStep &, TrainRoutingState &train);
109 void create_routes(RoutingStep &);