]> git.tdb.fi Git - r2c2.git/blob - source/libr2c2/trainrouteplanner.h
Replace waits with a more robust sequencing system
[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         struct TrainRoutingInfo;
22
23         struct SequencingInfo
24         {
25                 Track *track;
26                 TrainRoutingInfo *preceding;
27                 unsigned sequence_in;
28                 unsigned sequence_out;
29
30                 SequencingInfo(Track *, unsigned);
31         };
32
33         struct TrainRoutingInfo
34         {
35                 Train *train;
36                 float speed;
37                 TrainRouter *router;
38                 std::list<Route *> routes;
39                 Track *track_history[3];
40                 std::list<SequencingInfo> sequence;
41
42                 TrainRoutingInfo(Train &);
43         };
44
45         struct OccupiedTrack
46         {
47                 Track *track;
48                 float path_length;
49                 OccupiedTrack *next;
50                 unsigned n_tracks;
51                 unsigned refcount;
52
53                 OccupiedTrack(Track &, unsigned, OccupiedTrack *);
54                 OccupiedTrack(const OccupiedTrack &);
55                 ~OccupiedTrack();
56         };
57
58         enum TrainState
59         {
60                 MOVING,
61                 WAITING,
62                 BLOCKED,
63                 ARRIVED
64         };
65
66         struct TrainRoutingState
67         {
68                 TrainRoutingInfo *info;
69                 TrackIter track;
70                 unsigned path;
71                 OccupiedTrack *occupied_tracks;
72                 float offset;
73                 float back_offset;
74                 TrainState state;
75                 Msp::Time::TimeDelta delay;
76                 int waypoint;
77                 float distance_traveled;
78                 float remaining_estimate;
79                 Msp::Time::TimeDelta wait_time;
80                 int blocked_by;
81
82                 TrainRoutingState(TrainRoutingInfo &);
83                 TrainRoutingState(const TrainRoutingState &);
84                 ~TrainRoutingState();
85
86                 Msp::Time::TimeDelta get_time_to_next_track() const;
87                 bool is_occupying(Track &) const;
88                 bool check_arrival();
89                 void advance(float);
90                 void advance(const Msp::Time::TimeDelta &);
91                 void advance_track(unsigned);
92                 void update_estimate();
93         };
94
95         struct RoutingStep
96         {
97                 Msp::Time::TimeDelta time;
98                 Msp::Time::TimeDelta cost_estimate;
99                 std::vector<TrainRoutingState> trains;
100                 const RoutingStep *prev;
101
102                 RoutingStep();
103                 RoutingStep(const RoutingStep *);
104
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;
114
115                 bool operator<(const RoutingStep &) const;
116         };
117
118         std::vector<TrainRoutingInfo> routed_trains;
119         std::list<RoutingStep> steps;
120         std::list<RoutingStep> queue;
121
122 public:
123         TrainRoutePlanner(Layout &);
124
125         void plan();
126 private:
127         const RoutingStep &get_step();
128         void add_steps(const RoutingStep &);
129         void create_routes(const RoutingStep &);
130 };
131
132 } // namespace R2C2
133
134 #endif