]> git.tdb.fi Git - r2c2.git/blob - source/libr2c2/block.h
Create a base class to handle common operations in Block, Route and Zone
[r2c2.git] / source / libr2c2 / block.h
1 #ifndef LIBR2C2_BLOCK_H_
2 #define LIBR2C2_BLOCK_H_
3
4 #include <list>
5 #include <set>
6 #include "track.h"
7 #include "trackchain.h"
8
9 namespace R2C2 {
10
11 class Layout;
12 class Route;
13 class TrackCircuit;
14 class TrackIter;
15 class Train;
16
17 class Block: public TrackChain
18 {
19 public:
20         struct Endpoint
21         {
22                 Track *track;
23                 unsigned track_ep;
24                 Block *link;
25                 unsigned paths;
26
27                 Endpoint(Track *, unsigned);
28
29                 TrackIter track_iter() const;
30         };
31
32         sigc::signal<void, Train *> signal_reserved;
33
34 private:
35         unsigned id;
36         unsigned sensor_id;
37         unsigned turnout_id;
38         TrackCircuit *sensor;
39         std::vector<Endpoint> endpoints;
40         Train *train;
41
42 public:
43         Block(Layout &, Track &);
44         ~Block();
45
46 private:
47         virtual Validity check_validity(Track &) const;
48
49 public:
50         unsigned get_id() const { return id; }
51         unsigned get_sensor_id() const { return sensor_id; }
52         unsigned get_turnout_id() const { return turnout_id; }
53         TrackCircuit &get_sensor() const { return *sensor; }
54         const std::vector<Endpoint> &get_endpoints() const { return endpoints; }
55         const Endpoint &get_endpoint(unsigned) const;
56         int get_endpoint_by_link(Block &) const;
57         float get_path_length(unsigned, const Route * = 0) const;
58         void check_link(Block &);
59         void break_link(Block &);
60         Block *get_link(unsigned) const;
61         bool reserve(Train *);
62         Train *get_train() const { return train; }
63 private:
64         void find_paths(const TrackIter &, unsigned);
65         void determine_id();
66 };
67
68 } // namespace R2C2
69
70 #endif