X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Ftrackchain.cpp;h=f354c6eac7054fb0d9f6c4c59f30578981e33acf;hb=1c15570729bbce44f0518373ca5bf8bf41cfa3b3;hp=b256b705f95aa5bc21dceca556b767f3d962c676;hpb=1124a98ce5e1edee1904eeec089976d446601afd;p=r2c2.git diff --git a/source/libr2c2/trackchain.cpp b/source/libr2c2/trackchain.cpp index b256b70..f354c6e 100644 --- a/source/libr2c2/trackchain.cpp +++ b/source/libr2c2/trackchain.cpp @@ -1,9 +1,11 @@ +#include #include #include "layout.h" #include "track.h" #include "trackchain.h" using namespace std; +using namespace Msp; namespace R2C2 { @@ -135,6 +137,34 @@ bool TrackChain::has_track(Track &t) const return tracks.count(&t); } +TrackIter TrackChain::iter_for(Track &t, Direction d) const +{ + if(!tracks.count(&t)) + return TrackIter(); + else if(d==UNSPECIFIED) + return TrackIter(&t, 0); + else + return TrackIter(); +} + +TrackIter TrackChain::get_end(unsigned i) const +{ + if(i>=2) + throw invalid_argument("TrackChain::get_end"); + + if(!ends[0]) + return TrackIter(); + else if(i==1 && !ends[1]) + return ends[0].reverse(); + else + return ends[i]; +} + +bool TrackChain::is_loop() const +{ + return !tracks.empty() && !ends[0] && !ends[1]; +} + void TrackChain::object_removed(Object &obj) { if(Track *track = dynamic_cast(&obj)) @@ -146,4 +176,29 @@ void TrackChain::object_removed(Object &obj) } } + +void operator<<(LexicalConverter &conv, TrackChain::Direction dir) +{ + switch(dir) + { + case TrackChain::UNSPECIFIED: conv.result("UNSPECIFIED"); return; + case TrackChain::UP: conv.result("UP"); return; + case TrackChain::DOWN: conv.result("DOWN"); return; + default: throw lexical_error(format("conversion of Direction(%d) to string", dir)); + } +} + +void operator>>(const LexicalConverter &conv, TrackChain::Direction &dir) +{ + const string &str = conv.get(); + if(str=="UNSPECIFIED") + dir = TrackChain::UNSPECIFIED; + else if(str=="UP") + dir = TrackChain::UP; + else if(str=="DOWN") + dir = TrackChain::DOWN; + else + throw lexical_error(format("conversion of '%s' to Direction", str)); +} + } // namespace R2C2