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;
for(set<Track *>::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);
}
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();
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;
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
unsigned Route::get_path(Track &trk) const
{
- if(unsigned tid = trk.get_turnout_id())
+ if(trk.get_type().is_turnout())
{
- map<unsigned, int>::const_iterator i = turnouts.find(tid);
+ map<unsigned, int>::const_iterator i = turnouts.find(trk.get_turnout_address());
if(i!=turnouts.end())
return i->second;
}
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));
Route::Loader::Loader(Route &r):
DataFile::ObjectLoader<Route>(r)
{
- add("name", &Route::name);
+ add("name", &Loader::name);
add("turnout", &Loader::turnout);
}
for(set<Track *>::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;
}
}
}
+void Route::Loader::name(const string &n)
+{
+ obj.name = n;
+}
+
void Route::Loader::turnout(unsigned id, unsigned path)
{
turnouts[id] = path;