]> git.tdb.fi Git - r2c2.git/blob - source/libr2c2/trainrouteplanner.h
Support routing through multiple waypoints
[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                 TrainRouter *router;
26                 Route *route;
27                 std::list<TrainRoutingState *> waits;
28
29                 TrainRoutingInfo(Train &);
30         };
31
32         struct OccupiedTrack
33         {
34                 Track *track;
35                 float path_length;
36                 OccupiedTrack *next;
37                 unsigned n_tracks;
38                 unsigned refcount;
39
40                 OccupiedTrack(Track &, unsigned, OccupiedTrack *);
41                 OccupiedTrack(const OccupiedTrack &);
42                 ~OccupiedTrack();
43         };
44
45         enum TrainState
46         {
47                 MOVING,
48                 WAITING,
49                 BLOCKED,
50                 ARRIVED
51         };
52
53         struct TrainRoutingState
54         {
55                 TrainRoutingInfo *info;
56                 TrackIter track;
57                 unsigned path;
58                 OccupiedTrack *occupied_tracks;
59                 float offset;
60                 float back_offset;
61                 TrainState state;
62                 Msp::Time::TimeDelta delay;
63                 int waypoint;
64
65                 TrainRoutingState(TrainRoutingInfo &);
66                 TrainRoutingState(const TrainRoutingState &);
67                 ~TrainRoutingState();
68
69                 Msp::Time::TimeDelta get_time_to_next_track() const;
70                 bool is_occupied(Track &) const;
71                 void advance(float);
72                 void advance_track(unsigned);
73         };
74
75         struct RoutingStep
76         {
77                 Msp::Time::TimeDelta time;
78                 std::vector<TrainRoutingState> trains;
79                 RoutingStep *prev;
80
81                 RoutingStep();
82                 RoutingStep(RoutingStep *);
83
84                 void advance(const Msp::Time::TimeDelta &);
85                 bool is_goal() const;
86
87                 bool operator<(const RoutingStep &) const;
88         };
89
90         std::vector<TrainRoutingInfo> routed_trains;
91         std::list<RoutingStep> steps;
92
93 public:
94         TrainRoutePlanner(Layout &);
95
96         void plan();
97 private:
98         bool update_states(RoutingStep &);
99         int find_next_train(RoutingStep &);
100         void add_steps(RoutingStep &, unsigned);
101         void add_waiting_step(RoutingStep &, unsigned);
102         void add_steps(RoutingStep &, TrainRoutingState &train);
103         void create_routes(RoutingStep &);
104 };
105
106 } // namespace R2C2
107
108 #endif