]> git.tdb.fi Git - r2c2.git/blob - source/libr2c2/layout.h
Reduce interface clutter in Layout by storing Objects in a uniform way
[r2c2.git] / source / libr2c2 / layout.h
1 #ifndef LIBR2C2_LAYOUT_H_
2 #define LIBR2C2_LAYOUT_H_
3
4 #include <set>
5 #include <sigc++/sigc++.h>
6 #include <msp/datafile/objectloader.h>
7 #include <msp/time/timestamp.h>
8 #include "geometry.h"
9 #include "sensor.h"
10
11 namespace R2C2 {
12
13 class ArticleNumber;
14 class Block;
15 class Catalogue;
16 class Driver;
17 class Object;
18 class Route;
19 class Signal;
20 class Track;
21 class Train;
22 class Vehicle;
23 class Zone;
24
25 class Layout
26 {
27 public:
28         class Loader: public Msp::DataFile::ObjectLoader<Layout>
29         {
30         private:
31                 bool new_tracks;
32
33         public:
34                 Loader(Layout &);
35         private:
36                 void route();
37                 void route(const std::string &);
38                 void signal(ArticleNumber);
39                 void track(unsigned);
40                 void track(ArticleNumber);
41                 void train(unsigned, unsigned, const std::string &);
42                 void train(ArticleNumber, unsigned, const std::string &);
43                 void turnout(unsigned, unsigned);
44                 void zone();
45         };
46
47 private:
48         template<typename B>
49         class Storage
50         {
51         private:
52                 std::set<B *> base;
53                 mutable std::list<Msp::Variant> caches;
54
55         public:
56                 ~Storage();
57
58                 bool insert(B &);
59                 bool erase(B &);
60
61                 const std::set<B *> &get() const { return base; }
62
63                 template<typename T>
64                 const std::set<T *> &get() const;
65
66                 template<typename T>
67                 void del();
68         };
69
70 public:
71         typedef std::set<Zone *> ZoneSet;
72         typedef std::vector<Zone *> ZoneArray;
73
74         sigc::signal<void, Object &> signal_object_added;
75         sigc::signal<void, Object &> signal_object_removed;
76         sigc::signal<void, Route &> signal_route_added;
77         sigc::signal<void, Route &> signal_route_removed;
78         sigc::signal<void, Zone &> signal_zone_added;
79         sigc::signal<void, Zone &> signal_zone_removed;
80         sigc::signal<void, Train &> signal_train_added;
81         sigc::signal<void, Train &> signal_train_removed;
82         sigc::signal<void, Block &, Train *> signal_block_reserved;
83         sigc::signal<void, Sensor &, Sensor::State> signal_sensor_state_changed;
84         sigc::signal<void, const std::string &> signal_emergency;
85
86 private:
87         Catalogue &catalogue;
88         Driver *driver;
89         std::string base;
90         Storage<Object> objects;
91         std::set<Route *> routes;
92         ZoneSet zones;
93         std::set<Block *> blocks;
94         std::set<Sensor *> sensors;
95         std::map<unsigned, Train *> trains;
96         Msp::Time::TimeStamp last_tick;
97         unsigned next_turnout_id;
98
99 public:
100         Layout(Catalogue &, Driver * = 0);
101         ~Layout();
102
103         Catalogue &get_catalogue() const { return catalogue; }
104         bool has_driver() const { return driver; }
105         Driver &get_driver() const;
106         const std::string &get_base() const { return base; }
107
108         void add(Object &);
109         void add(Track &);
110
111         template<typename T>
112         const std::set<T *> &get_all() const;
113
114         template<typename T>
115         T *pick(const Ray &);
116
117         void remove(Object &);
118         void remove(Track &);
119
120         unsigned allocate_turnout_id();
121
122         void add_block(Block &);
123         Block &get_block(unsigned) const;
124         const std::set<Block *> &get_blocks() const { return blocks; }
125         void create_blocks();
126         void create_blocks(Track &);
127         void remove_block(Block &);
128
129         void add_route(Route &);
130         const std::set<Route *> &get_routes() const { return routes; }
131         Route &get_route(const std::string &) const;
132         void update_routes();
133         void remove_route(Route &);
134
135         void add_zone(Zone &);
136         const ZoneSet &get_zones() const { return zones; }
137         ZoneArray get_zones(const std::string &) const;
138         Zone &get_zone(const std::string &, unsigned) const;
139         void remove_zone(Zone &);
140
141         void add_train(Train &);
142         Train &get_train(unsigned) const;
143         const std::map<unsigned, Train *> &get_trains() const { return trains; }
144         void remove_train(Train &);
145
146         void add_sensor(Sensor &);
147         void remove_sensor(Sensor &);
148
149         void tick();
150         void emergency(const std::string &);
151
152         void save(const std::string &) const;
153         void save_dynamic(const std::string &) const;
154 private:
155         void sensor_state_changed(Sensor &, Sensor::State);
156 };
157
158 } // namespace R2C2
159
160 #endif
161