]> git.tdb.fi Git - r2c2.git/blob - source/libr2c2/route.h
Reduce interface clutter in Layout by storing Objects in a uniform way
[r2c2.git] / source / libr2c2 / route.h
1 #ifndef LIBR2C2_ROUTE_H_
2 #define LIBR2C2_ROUTE_H_
3
4 #include <map>
5 #include <set>
6 #include <string>
7 #include <sigc++/trackable.h>
8 #include <msp/datafile/objectloader.h>
9
10 namespace R2C2 {
11
12 class Layout;
13 class Object;
14 class Track;
15 class TrackIter;
16 class Zone;
17
18 enum RouteValidityMask
19 {
20         ROUTE_INVALID = 0,
21         ROUTE_LINKED = 1,
22         ROUTE_LINEAR = 2,
23         ROUTE_SMOOTH = 4,
24         ROUTE_VALID = 7
25 };
26
27 class bad_route: public std::logic_error
28 {
29 public:
30         bad_route(RouteValidityMask m): std::logic_error(get_message(m)) { }
31         virtual ~bad_route() throw() { }
32
33 private:
34         static std::string get_message(RouteValidityMask);
35 };
36
37
38 class Route: public sigc::trackable
39 {
40 public:
41         typedef std::map<unsigned, int> TurnoutMap;
42
43         class Loader: public Msp::DataFile::ObjectLoader<Route>
44         {
45         private:
46                 TurnoutMap turnouts;
47
48         public:
49                 Loader(Route &);
50         private:
51                 virtual void finish();
52                 void turnout(unsigned, unsigned);
53         };
54
55         sigc::signal<void, const std::string &> signal_name_changed;
56
57 private:
58         Layout &layout;
59         std::string name;
60         bool temporary;
61         std::set<Track *> tracks;
62         TurnoutMap turnouts;
63
64 public:
65         Route(Layout &);
66         ~Route();
67
68         void set_name(const std::string &);
69         const std::string &get_name() const { return name; }
70         void set_temporary(bool);
71         bool is_temporary() const { return temporary; }
72         void set_turnout(unsigned, unsigned);
73         void update_turnouts();
74         int get_turnout(unsigned) const;
75         unsigned get_path(Track &) const;
76         const std::map<unsigned, int> &get_turnouts() const { return turnouts; }
77         void add_track(Track &);
78         void add_tracks(const std::set<Track *> &);
79         void add_track_chain(const TrackIter &, const TurnoutMap &);
80         const std::set<Track *> &get_tracks() const { return tracks; }
81         bool has_track(Track &) const;
82         void save(std::list<Msp::DataFile::Statement> &) const;
83 private:
84         RouteValidityMask check_validity(Track &) const;
85         void object_removed(Object &);
86
87 public:
88         static Route *find(const TrackIter &, Track &);
89         static Route *find(const TrackIter &, const Route &);
90         static Route *find(const TrackIter &, const Zone &);
91         static Route *find(const TrackIter &, const std::set<Track *> &);
92 };
93
94 } // namespace R2C2
95
96 #endif