1 #ifndef LIBR2C2_TRAINROUTEPLANNER_H_
2 #define LIBR2C2_TRAINROUTEPLANNER_H_
6 #include <msp/time/timedelta.h>
17 class TrainRoutePlanner
20 struct TrainRoutingState;
21 struct TrainRoutingInfo;
26 TrainRoutingInfo *preceding;
28 unsigned sequence_out;
30 SequencingInfo(Track *, unsigned);
33 struct TrainRoutingInfo
38 std::list<Route *> routes;
39 Track *track_history[3];
40 std::list<SequencingInfo> sequence;
42 TrainRoutingInfo(Train &);
53 OccupiedTrack(Track &, unsigned, OccupiedTrack *);
54 OccupiedTrack(const OccupiedTrack &);
66 struct TrainRoutingState
68 TrainRoutingInfo *info;
71 OccupiedTrack *occupied_tracks;
75 Msp::Time::TimeDelta delay;
77 float distance_traveled;
78 float remaining_estimate;
79 Msp::Time::TimeDelta wait_time;
82 TrainRoutingState(TrainRoutingInfo &);
83 TrainRoutingState(const TrainRoutingState &);
86 Msp::Time::TimeDelta get_time_to_next_track() const;
87 bool is_occupying(Track &) const;
90 void advance(const Msp::Time::TimeDelta &);
91 void advance_track(unsigned);
92 void update_estimate();
97 Msp::Time::TimeDelta time;
98 Msp::Time::TimeDelta cost_estimate;
99 std::vector<TrainRoutingState> trains;
100 const RoutingStep *prev;
103 RoutingStep(const RoutingStep *);
105 void create_successors(std::list<RoutingStep> &) const;
106 bool update_states();
107 bool check_deadlocks() const;
108 int get_occupant(Track &) const;
109 int find_next_train() const;
110 void advance(const Msp::Time::TimeDelta &);
111 void update_estimate();
112 bool is_viable() const;
113 bool is_goal() const;
115 bool operator<(const RoutingStep &) const;
118 std::vector<TrainRoutingInfo> routed_trains;
119 std::list<RoutingStep> steps;
120 std::list<RoutingStep> queue;
123 TrainRoutePlanner(Layout &);
127 const RoutingStep &get_step();
128 void add_steps(const RoutingStep &);
129 void create_routes(const RoutingStep &);