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 const TrackChain *destination;
37 std::vector<const TrackChain *> waypoints;
38 std::vector<const TrainRouteMetric *> metrics;
40 std::list<Route *> routes;
41 Track *track_history[2];
42 std::list<TrainRouter::SequencePoint> sequence;
44 TrainRoutingInfo(Train &);
55 OccupiedTrack(Track &, unsigned, OccupiedTrack *);
56 OccupiedTrack(const OccupiedTrack &);
68 struct TrainRoutingState
70 TrainRoutingInfo *info;
73 OccupiedTrack *occupied_tracks;
77 Msp::Time::TimeDelta delay;
78 Msp::Time::TimeDelta duration;
80 float distance_traveled;
81 float remaining_estimate;
82 Msp::Time::TimeDelta wait_time;
85 TrainRoutingState(TrainRoutingInfo &);
86 TrainRoutingState(const TrainRoutingState &);
89 Msp::Time::TimeDelta get_time_to_next_track() const;
90 bool is_occupying(Track &) const;
93 void advance(const Msp::Time::TimeDelta &);
94 void advance_track(unsigned);
95 void update_estimate();
100 Msp::Time::TimeDelta time;
101 Msp::Time::TimeDelta penalty;
102 Msp::Time::TimeDelta cost_estimate;
103 std::vector<TrainRoutingState> trains;
104 const RoutingStep *prev;
107 RoutingStep(const RoutingStep *);
109 void create_successors(std::list<RoutingStep> &) const;
110 bool update_states();
111 bool check_deadlocks() const;
112 int get_occupant(Track &) const;
113 int find_next_train() const;
114 void advance(const Msp::Time::TimeDelta &);
115 void update_estimate();
116 bool is_viable() const;
117 bool is_goal() const;
119 bool operator<(const RoutingStep &) const;
122 class PlanningThread: public Msp::Thread
125 TrainRoutePlanner &planner;
128 PlanningThread(TrainRoutePlanner &);
134 std::vector<TrainRoutingInfo> routed_trains;
135 std::list<RoutingStep> steps;
136 std::list<RoutingStep> queue;
137 const RoutingStep *goal;
139 PlanningThread *thread;
142 TrainRoutePlanner(Layout &);
143 ~TrainRoutePlanner();
148 Result get_result() { return result; }
149 const std::list<Route *> &get_routes_for(const Train &) const;
150 const std::list<TrainRouter::SequencePoint> &get_sequence_for(const Train &) const;
152 const TrainRoutingInfo &get_train_info(const Train &) const;
153 const RoutingStep &get_step();
156 void add_steps(const RoutingStep &);
157 void finalize_plan();