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