]> git.tdb.fi Git - r2c2.git/blob - source/libr2c2/trackchain.h
Create a base class to handle common operations in Block, Route and Zone
[r2c2.git] / source / libr2c2 / trackchain.h
1 #ifndef LIBR2C2_TRACKCHAIN_H_
2 #define LIBR2C2_TRACKCHAIN_H_
3
4 #include <set>
5 #include <stdexcept>
6 #include <sigc++/trackable.h>
7 #include "trackiter.h"
8
9 namespace R2C2 {
10
11 class Layout;
12 class Object;
13
14 class bad_chain: public std::logic_error
15 {
16 public:
17         bad_chain(const std::string &w): std::logic_error(w) { }
18         virtual ~bad_chain() throw() { }
19 };
20
21
22 class TrackChain: public sigc::trackable
23 {
24 public:
25         typedef std::set<Track *> TrackSet;
26
27 protected:
28         enum Validity
29         {
30                 VALID,
31                 UNLINKED,
32                 BAD_PATH,
33                 INCOMPATIBLE
34         };
35
36         Layout &layout;
37         TrackSet tracks;
38         TrackIter ends[2];
39
40         TrackChain(Layout &);
41 public:
42         virtual ~TrackChain() { }
43
44         void add_track(Track &);
45         void add_tracks(const TrackSet &);
46 protected:
47         virtual void on_track_added(Track &) { }
48         virtual Validity check_validity(Track &) const;
49         static void throw_bad_chain(Validity);
50 private:
51         void update_ends(Track &);
52 public:
53         const TrackSet &get_tracks() const { return tracks; }
54         bool has_track(Track &) const;
55
56 private:
57         void object_removed(Object &);
58 };
59
60 } // namespace R2C2
61
62 #endif