]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/trackchain.h
Create a base class to handle common operations in Block, Route and Zone
[r2c2.git] / source / libr2c2 / trackchain.h
diff --git a/source/libr2c2/trackchain.h b/source/libr2c2/trackchain.h
new file mode 100644 (file)
index 0000000..e73e23b
--- /dev/null
@@ -0,0 +1,62 @@
+#ifndef LIBR2C2_TRACKCHAIN_H_
+#define LIBR2C2_TRACKCHAIN_H_
+
+#include <set>
+#include <stdexcept>
+#include <sigc++/trackable.h>
+#include "trackiter.h"
+
+namespace R2C2 {
+
+class Layout;
+class Object;
+
+class bad_chain: public std::logic_error
+{
+public:
+       bad_chain(const std::string &w): std::logic_error(w) { }
+       virtual ~bad_chain() throw() { }
+};
+
+
+class TrackChain: public sigc::trackable
+{
+public:
+       typedef std::set<Track *> TrackSet;
+
+protected:
+       enum Validity
+       {
+               VALID,
+               UNLINKED,
+               BAD_PATH,
+               INCOMPATIBLE
+       };
+
+       Layout &layout;
+       TrackSet tracks;
+       TrackIter ends[2];
+
+       TrackChain(Layout &);
+public:
+       virtual ~TrackChain() { }
+
+       void add_track(Track &);
+       void add_tracks(const TrackSet &);
+protected:
+       virtual void on_track_added(Track &) { }
+       virtual Validity check_validity(Track &) const;
+       static void throw_bad_chain(Validity);
+private:
+       void update_ends(Track &);
+public:
+       const TrackSet &get_tracks() const { return tracks; }
+       bool has_track(Track &) const;
+
+private:
+       void object_removed(Object &);
+};
+
+} // namespace R2C2
+
+#endif