X-Git-Url: http://git.tdb.fi/?p=r2c2.git;a=blobdiff_plain;f=source%2Flibr2c2%2Fzone.cpp;h=de774431b971605f4298f2dd12b78116061bc70c;hp=52e3c281d8175254474cef140ea4217774c3c3e9;hb=9a2fd67cec715e371e293be638b126e0d1b2148d;hpb=3907520897611cb1b5f2f938c60d3eaff34477a5 diff --git a/source/libr2c2/zone.cpp b/source/libr2c2/zone.cpp index 52e3c28..de77443 100644 --- a/source/libr2c2/zone.cpp +++ b/source/libr2c2/zone.cpp @@ -13,7 +13,8 @@ namespace R2C2 { Zone::Zone(Layout &l): TrackChain(l), number(0), - up_end(-1) + up_end(-1), + preferred_dir(UNSPECIFIED) { layout.add(*this); } @@ -55,6 +56,15 @@ void Zone::update_name() TrackChain::set_name(full_name); } +void Zone::on_track_added(Track &track) +{ + if(preferred_dir) + { + TrackIter iter = iter_for(track, preferred_dir==UP ? DOWN : UP); + track.set_preferred_exit(iter.entry()); + } +} + void Zone::set_direction_towards(Track &track, Direction dir) { if(dir==UNSPECIFIED) @@ -78,9 +88,33 @@ void Zone::set_direction_towards(Track &track, Direction dir) throw logic_error("internal error (valid track not linked to ends)"); } +void Zone::set_preferred_direction(Direction d) +{ + if(up_end<0) + throw logic_error("no direction"); + + preferred_dir = d; + + if(preferred_dir) + { + TrackIter iter = get_end(preferred_dir).reverse(); + while(iter && tracks.count(iter.track())) + { + iter->set_preferred_exit(iter.entry()); + iter = next_iter(iter); + } + } + else + { + for(TrackSet::iterator i=tracks.begin(); i!=tracks.end(); ++i) + (*i)->set_preferred_exit(-1); + } +} + void Zone::clear_direction() { up_end = -1; + preferred_dir = UNSPECIFIED; } TrackIter Zone::iter_for(Track &track, Direction dir) const @@ -173,6 +207,9 @@ void Zone::save(list &st) const break; } } + + if(preferred_dir) + st.push_back((DataFile::Statement("preferred_direction"), preferred_dir)); } } @@ -189,6 +226,7 @@ Zone::Loader::Loader(Zone &z): add("direction_hint", &Loader::direction_hint); add("group", &Zone::group); add("number", &Zone::number); + add("preferred_direction", &Loader::preferred_direction); add("qualifier", &Zone::qualifier); } @@ -217,4 +255,9 @@ void Zone::Loader::direction_hint(unsigned b, Direction d) throw invalid_argument("Zone::Loader::direction_hint"); } +void Zone::Loader::preferred_direction(Direction d) +{ + obj.set_preferred_direction(d); +} + } // namespace R2C2