1 #ifndef LIBR2C2_TRAINROUTEPLANNER_H_
2 #define LIBR2C2_TRAINROUTEPLANNER_H_
6 #include <msp/core/thread.h>
7 #include <msp/time/timedelta.h>
9 #include "trainrouter.h"
18 class TrainRoutePlanner
29 struct TrainRoutingState;
31 struct TrainRoutingInfo
36 std::list<Route *> routes;
37 Track *track_history[2];
38 std::list<TrainRouter::SequencePoint> sequence;
40 TrainRoutingInfo(Train &);
51 OccupiedTrack(Track &, unsigned, OccupiedTrack *);
52 OccupiedTrack(const OccupiedTrack &);
64 struct TrainRoutingState
66 TrainRoutingInfo *info;
69 OccupiedTrack *occupied_tracks;
73 Msp::Time::TimeDelta delay;
74 Msp::Time::TimeDelta duration;
76 float distance_traveled;
77 float remaining_estimate;
78 Msp::Time::TimeDelta wait_time;
81 TrainRoutingState(TrainRoutingInfo &);
82 TrainRoutingState(const TrainRoutingState &);
85 Msp::Time::TimeDelta get_time_to_next_track() const;
86 bool is_occupying(Track &) const;
89 void advance(const Msp::Time::TimeDelta &);
90 void advance_track(unsigned);
91 void update_estimate();
96 Msp::Time::TimeDelta time;
97 Msp::Time::TimeDelta cost_estimate;
98 std::vector<TrainRoutingState> trains;
99 const RoutingStep *prev;
102 RoutingStep(const RoutingStep *);
104 void create_successors(std::list<RoutingStep> &) const;
105 bool update_states();
106 bool check_deadlocks() const;
107 int get_occupant(Track &) const;
108 int find_next_train() const;
109 void advance(const Msp::Time::TimeDelta &);
110 void update_estimate();
111 bool is_viable() const;
112 bool is_goal() const;
114 bool operator<(const RoutingStep &) const;
117 class PlanningThread: public Msp::Thread
120 TrainRoutePlanner &planner;
123 PlanningThread(TrainRoutePlanner &);
129 std::vector<TrainRoutingInfo> routed_trains;
130 std::list<RoutingStep> steps;
131 std::list<RoutingStep> queue;
132 const RoutingStep *goal;
134 PlanningThread *thread;
137 TrainRoutePlanner(Layout &);
138 ~TrainRoutePlanner();
143 Result get_result() { return result; }
144 const std::list<Route *> &get_routes_for(const Train &) const;
145 const std::list<TrainRouter::SequencePoint> &get_sequence_for(const Train &) const;
147 const TrainRoutingInfo &get_train_info(const Train &) const;
148 const RoutingStep &get_step();
151 void add_steps(const RoutingStep &);
152 void finalize_plan();