]> git.tdb.fi Git - r2c2.git/blob - source/libr2c2/trainrouteplanner.h
Further fix delay handling
[r2c2.git] / source / libr2c2 / trainrouteplanner.h
1 #ifndef LIBR2C2_TRAINROUTEPLANNER_H_
2 #define LIBR2C2_TRAINROUTEPLANNER_H_
3
4 #include <list>
5 #include <vector>
6 #include <msp/time/timedelta.h>
7 #include "trackiter.h"
8
9 namespace R2C2 {
10
11 class Layout;
12 class Route;
13 class Track;
14 class Train;
15 class TrainRouter;
16
17 class TrainRoutePlanner
18 {
19 private:
20         struct TrainRoutingState;
21
22         struct TrainRoutingInfo
23         {
24                 Train *train;
25                 float speed;
26                 TrainRouter *router;
27                 std::list<Route *> routes;
28                 Track *track_history[3];
29                 std::list<const TrainRoutingState *> waits;
30
31                 TrainRoutingInfo(Train &);
32         };
33
34         struct OccupiedTrack
35         {
36                 Track *track;
37                 float path_length;
38                 OccupiedTrack *next;
39                 unsigned n_tracks;
40                 unsigned refcount;
41
42                 OccupiedTrack(Track &, unsigned, OccupiedTrack *);
43                 OccupiedTrack(const OccupiedTrack &);
44                 ~OccupiedTrack();
45         };
46
47         enum TrainState
48         {
49                 MOVING,
50                 WAITING,
51                 BLOCKED,
52                 ARRIVED
53         };
54
55         struct TrainRoutingState
56         {
57                 TrainRoutingInfo *info;
58                 TrackIter track;
59                 unsigned path;
60                 OccupiedTrack *occupied_tracks;
61                 float offset;
62                 float back_offset;
63                 TrainState state;
64                 Msp::Time::TimeDelta delay;
65                 int waypoint;
66                 float remaining_estimate;
67                 int blocked_by;
68
69                 TrainRoutingState(TrainRoutingInfo &);
70                 TrainRoutingState(const TrainRoutingState &);
71                 ~TrainRoutingState();
72
73                 Msp::Time::TimeDelta get_time_to_next_track() const;
74                 bool is_occupying(Track &) const;
75                 bool check_arrival();
76                 void advance(float);
77                 void advance(const Msp::Time::TimeDelta &);
78                 void advance_track(unsigned);
79                 void update_estimate();
80         };
81
82         struct RoutingStep
83         {
84                 Msp::Time::TimeDelta time;
85                 Msp::Time::TimeDelta total_estimate;
86                 std::vector<TrainRoutingState> trains;
87                 const RoutingStep *prev;
88
89                 RoutingStep();
90                 RoutingStep(const RoutingStep *);
91
92                 void create_successors(std::list<RoutingStep> &) const;
93                 bool update_states();
94                 bool check_deadlocks() const;
95                 int get_occupant(Track &) const;
96                 int find_next_train() const;
97                 void advance(const Msp::Time::TimeDelta &);
98                 void update_estimate();
99                 bool is_viable() const;
100                 bool is_goal() const;
101
102                 bool operator<(const RoutingStep &) const;
103         };
104
105         std::vector<TrainRoutingInfo> routed_trains;
106         std::list<RoutingStep> steps;
107         std::list<RoutingStep> queue;
108
109 public:
110         TrainRoutePlanner(Layout &);
111
112         void plan();
113 private:
114         const RoutingStep &get_step();
115         void add_steps(const RoutingStep &);
116         void create_routes(const RoutingStep &);
117 };
118
119 } // namespace R2C2
120
121 #endif