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