--- /dev/null
+#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