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
28 std::list<const TrainRoutingState *> waits;
30 TrainRoutingInfo(Train &);
41 OccupiedTrack(Track &, unsigned, OccupiedTrack *);
42 OccupiedTrack(const OccupiedTrack &);
54 struct TrainRoutingState
56 TrainRoutingInfo *info;
59 OccupiedTrack *occupied_tracks;
63 Msp::Time::TimeDelta delay;
65 Msp::Time::TimeDelta remaining_estimate;
68 TrainRoutingState(TrainRoutingInfo &);
69 TrainRoutingState(const TrainRoutingState &);
72 Msp::Time::TimeDelta get_time_to_next_track() const;
73 bool is_occupying(Track &) const;
76 void advance_track(unsigned);
77 void update_estimate();
82 Msp::Time::TimeDelta time;
83 Msp::Time::TimeDelta total_estimate;
84 std::vector<TrainRoutingState> trains;
85 const RoutingStep *prev;
88 RoutingStep(const RoutingStep *);
90 void create_successors(std::list<RoutingStep> &) const;
92 bool check_deadlocks() const;
93 int get_occupant(Track &) const;
94 int find_next_train() const;
95 void advance(const Msp::Time::TimeDelta &);
96 void update_estimate();
97 bool is_viable() const;
100 bool operator<(const RoutingStep &) const;
103 std::vector<TrainRoutingInfo> routed_trains;
104 std::list<RoutingStep> steps;
105 std::list<RoutingStep> queue;
108 TrainRoutePlanner(Layout &);
112 const RoutingStep &get_step();
113 void add_steps(const RoutingStep &);
114 void create_routes(const RoutingStep &);