1 #ifndef LIBR2C2_TRAINROUTEPLANNER_H_
2 #define LIBR2C2_TRAINROUTEPLANNER_H_
6 #include <msp/time/timedelta.h>
8 #include "trainrouter.h"
17 class TrainRoutePlanner
28 struct TrainRoutingState;
30 struct TrainRoutingInfo
35 std::list<Route *> routes;
36 Track *track_history[3];
37 std::list<TrainRouter::SequencePoint> sequence;
39 TrainRoutingInfo(Train &);
50 OccupiedTrack(Track &, unsigned, OccupiedTrack *);
51 OccupiedTrack(const OccupiedTrack &);
63 struct TrainRoutingState
65 TrainRoutingInfo *info;
68 OccupiedTrack *occupied_tracks;
72 Msp::Time::TimeDelta delay;
74 float distance_traveled;
75 float remaining_estimate;
76 Msp::Time::TimeDelta wait_time;
79 TrainRoutingState(TrainRoutingInfo &);
80 TrainRoutingState(const TrainRoutingState &);
83 Msp::Time::TimeDelta get_time_to_next_track() const;
84 bool is_occupying(Track &) const;
87 void advance(const Msp::Time::TimeDelta &);
88 void advance_track(unsigned);
89 void update_estimate();
94 Msp::Time::TimeDelta time;
95 Msp::Time::TimeDelta cost_estimate;
96 std::vector<TrainRoutingState> trains;
97 const RoutingStep *prev;
100 RoutingStep(const RoutingStep *);
102 void create_successors(std::list<RoutingStep> &) const;
103 bool update_states();
104 bool check_deadlocks() const;
105 int get_occupant(Track &) const;
106 int find_next_train() const;
107 void advance(const Msp::Time::TimeDelta &);
108 void update_estimate();
109 bool is_viable() const;
110 bool is_goal() const;
112 bool operator<(const RoutingStep &) const;
115 std::vector<TrainRoutingInfo> routed_trains;
116 std::list<RoutingStep> steps;
117 std::list<RoutingStep> queue;
121 TrainRoutePlanner(Layout &);
124 Result get_result() { return result; }
125 const std::list<Route *> &get_routes_for(const Train &) const;
126 const std::list<TrainRouter::SequencePoint> &get_sequence_for(const Train &) const;
128 const TrainRoutingInfo &get_train_info(const Train &) const;
129 const RoutingStep &get_step();
130 void add_steps(const RoutingStep &);
131 void create_routes(const RoutingStep &);