]> git.tdb.fi Git - r2c2.git/blob - source/libr2c2/block.h
Only create track circuits for blocks that need one
[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
26                 Endpoint(Track *, unsigned);
27
28                 TrackIter track_iter() const;
29         };
30
31         sigc::signal<void, Train *> signal_reserved;
32
33 private:
34         unsigned id;
35         unsigned sensor_id;
36         unsigned turnout_id;
37         TrackCircuit *sensor;
38         std::vector<Endpoint> endpoints;
39         Train *train;
40
41 public:
42         Block(Layout &, Track &);
43         ~Block();
44
45 private:
46         virtual void on_track_added(Track &);
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 determine_id();
65 };
66
67 } // namespace R2C2
68
69 #endif