X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Froute.cpp;h=5ee30e033161030fa31a8f558f50e7f4a3b9aaea;hb=f7ab597d035a053311c1a8c5baa51b090262f045;hp=c8f1ed3539881856a7026f30324de456c334dc2c;hpb=e802ad7de31cc23bce2c0a3533a7ccd6635a30c1;p=r2c2.git diff --git a/source/libr2c2/route.cpp b/source/libr2c2/route.cpp index c8f1ed3..5ee30e0 100644 --- a/source/libr2c2/route.cpp +++ b/source/libr2c2/route.cpp @@ -140,12 +140,6 @@ Route::~Route() layout.remove(*this); } -void Route::set_name(const string &n) -{ - name = n; - signal_name_changed.emit(name); -} - void Route::set_temporary(bool t) { temporary = t; @@ -157,7 +151,7 @@ void Route::update_turnouts() for(set::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) if((*i)->get_type().is_turnout()) { - found.insert((*i)->get_turnout_id()); + found.insert((*i)->get_turnout_address()); update_turnout(**i); } @@ -173,6 +167,9 @@ void Route::update_turnouts() void Route::update_turnout(Track &track) { + if(!track.get_type().is_turnout()) + return; + // Build a combined path mask from linked endpoints unsigned nls = track.get_n_link_slots(); unsigned mask = track.get_type().get_paths(); @@ -186,7 +183,7 @@ void Route::update_turnout(Track &track) if(link->get_type().is_turnout()) { const TrackType::Endpoint &link_ep = link->get_type().get_endpoint(link->get_link_slot(track)); - int p = get_turnout(link->get_turnout_id()); + int p = get_turnout(link->get_turnout_address()); if(p>=0 && !link_ep.has_path(p)) // The linked track is a turnout and has a path which is incompatible with this endpoint ep_mask = ~ep_mask; @@ -195,17 +192,17 @@ void Route::update_turnout(Track &track) mask &= ep_mask; } - unsigned tid = track.get_turnout_id(); + unsigned taddr = track.get_turnout_address(); if(mask && !(mask&(mask-1))) { // Exactly one possible choice, set the path accordingly unsigned path = 0; for(; (mask && !(mask&1)); mask>>=1, ++path) ; - turnouts[tid] = path; + turnouts[taddr] = path; } - else if(!turnouts.count(tid)) + else if(!turnouts.count(taddr)) // More than one possible choice, and no existing entry - set as undecided - turnouts[tid] = -1; + turnouts[taddr] = -1; } int Route::get_turnout(unsigned id) const @@ -218,10 +215,10 @@ int Route::get_turnout(unsigned id) const unsigned Route::get_path(Track &trk) const { - if(unsigned tid = trk.get_turnout_id()) + if(trk.get_type().is_turnout()) { - map::const_iterator i = turnouts.find(tid); - if(i!=turnouts.end()) + map::const_iterator i = turnouts.find(trk.get_turnout_address()); + if(i!=turnouts.end() && i->second>=0) return i->second; } return trk.get_active_path(); @@ -260,6 +257,11 @@ void Route::save(list &st) const st.push_back((DataFile::Statement("turnout"), i->first, i->second)); } +DataFile::Statement Route::save_reference() const +{ + return (DataFile::Statement("route"), name); +} + Route *Route::find(const TrackIter &from, Track &to) { return create_route(from, TrackMatch(to)); @@ -284,7 +286,7 @@ Route *Route::find(const TrackIter &from, const set &to) Route::Loader::Loader(Route &r): DataFile::ObjectLoader(r) { - add("name", &Route::name); + add("name", &Loader::name); add("turnout", &Loader::turnout); } @@ -295,7 +297,7 @@ void Route::Loader::finish() for(set::const_iterator i=ltracks.begin(); i!=ltracks.end(); ++i) if((*i)->get_type().is_turnout()) { - TurnoutMap::iterator j = turnouts.find((*i)->get_turnout_id()); + TurnoutMap::iterator j = turnouts.find((*i)->get_turnout_address()); if(j!=turnouts.end()) turnout_tracks[*i] = j->second; } @@ -313,6 +315,11 @@ void Route::Loader::finish() } } +void Route::Loader::name(const string &n) +{ + obj.name = n; +} + void Route::Loader::turnout(unsigned id, unsigned path) { turnouts[id] = path;