]> git.tdb.fi Git - r2c2.git/blob - source/libr2c2/trainrouteplanner.h
57d2de508cdc27be0dbc17c3953d24bc2d9c4c61
[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 distance_traveled;
67                 float remaining_estimate;
68                 Msp::Time::TimeDelta wait_time;
69                 int blocked_by;
70
71                 TrainRoutingState(TrainRoutingInfo &);
72                 TrainRoutingState(const TrainRoutingState &);
73                 ~TrainRoutingState();
74
75                 Msp::Time::TimeDelta get_time_to_next_track() const;
76                 bool is_occupying(Track &) const;
77                 bool check_arrival();
78                 void advance(float);
79                 void advance(const Msp::Time::TimeDelta &);
80                 void advance_track(unsigned);
81                 void update_estimate();
82         };
83
84         struct RoutingStep
85         {
86                 Msp::Time::TimeDelta time;
87                 Msp::Time::TimeDelta cost_estimate;
88                 std::vector<TrainRoutingState> trains;
89                 const RoutingStep *prev;
90
91                 RoutingStep();
92                 RoutingStep(const RoutingStep *);
93
94                 void create_successors(std::list<RoutingStep> &) const;
95                 bool update_states();
96                 bool check_deadlocks() const;
97                 int get_occupant(Track &) const;
98                 int find_next_train() const;
99                 void advance(const Msp::Time::TimeDelta &);
100                 void update_estimate();
101                 bool is_viable() const;
102                 bool is_goal() const;
103
104                 bool operator<(const RoutingStep &) const;
105         };
106
107         std::vector<TrainRoutingInfo> routed_trains;
108         std::list<RoutingStep> steps;
109         std::list<RoutingStep> queue;
110
111 public:
112         TrainRoutePlanner(Layout &);
113
114         void plan();
115 private:
116         const RoutingStep &get_step();
117         void add_steps(const RoutingStep &);
118         void create_routes(const RoutingStep &);
119 };
120
121 } // namespace R2C2
122
123 #endif