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
27 std::list<Route *> routes;
28 Track *track_history[3];
29 std::list<const TrainRoutingState *> waits;
31 TrainRoutingInfo(Train &);
42 OccupiedTrack(Track &, unsigned, OccupiedTrack *);
43 OccupiedTrack(const OccupiedTrack &);
55 struct TrainRoutingState
57 TrainRoutingInfo *info;
60 OccupiedTrack *occupied_tracks;
64 Msp::Time::TimeDelta delay;
66 float distance_traveled;
67 float remaining_estimate;
68 Msp::Time::TimeDelta wait_time;
71 TrainRoutingState(TrainRoutingInfo &);
72 TrainRoutingState(const TrainRoutingState &);
75 Msp::Time::TimeDelta get_time_to_next_track() const;
76 bool is_occupying(Track &) const;
79 void advance(const Msp::Time::TimeDelta &);
80 void advance_track(unsigned);
81 void update_estimate();
86 Msp::Time::TimeDelta time;
87 Msp::Time::TimeDelta cost_estimate;
88 std::vector<TrainRoutingState> trains;
89 const RoutingStep *prev;
92 RoutingStep(const RoutingStep *);
94 void create_successors(std::list<RoutingStep> &) const;
96 bool check_deadlocks() const;
97 int get_occupant(Track &) const;
98 int find_next_train() const;
99 void advance(const Msp::Time::TimeDelta &);
100 void update_estimate();
101 bool is_viable() const;
102 bool is_goal() const;
104 bool operator<(const RoutingStep &) const;
107 std::vector<TrainRoutingInfo> routed_trains;
108 std::list<RoutingStep> steps;
109 std::list<RoutingStep> queue;
112 TrainRoutePlanner(Layout &);
116 const RoutingStep &get_step();
117 void add_steps(const RoutingStep &);
118 void create_routes(const RoutingStep &);