X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibmarklin%2Flayout.cpp;h=25568d6e6fb23d51e86ad003cf36d12c466314b9;hb=e392d397f6b86a49a05e9738357ccbfc2a922f01;hp=a495a21968b62ade01645c3e733939d101c1feea;hpb=f409cd39a687900724d987c9db629cbff0dd49be;p=r2c2.git diff --git a/source/libmarklin/layout.cpp b/source/libmarklin/layout.cpp index a495a21..25568d6 100644 --- a/source/libmarklin/layout.cpp +++ b/source/libmarklin/layout.cpp @@ -41,7 +41,7 @@ Layout::~Layout() while(!trains.empty()) delete trains.begin()->second; while(!routes.empty()) - delete routes.begin()->second; + delete *routes.begin(); while(!tracks.empty()) delete *tracks.begin(); while(!blocks.empty()) @@ -73,9 +73,19 @@ void Layout::remove_track(Track &t) } } -unsigned Layout::allocate_turnout_id() +unsigned Layout::allocate_turnout_id(bool dbl) { - return next_turnout_id++; + set used_ids; + for(set::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) + if((*i)->get_turnout_id()) + used_ids.insert((*i)->get_turnout_id()); + + unsigned result = next_turnout_id; + while(used_ids.count(result) || (dbl && used_ids.count(result+1))) + ++result; + next_turnout_id = result+1+dbl; + + return result; } void Layout::add_block(Block &b) @@ -92,15 +102,6 @@ Block &Layout::get_block(unsigned id) const throw KeyError("Unknown block", lexical_cast(id)); } -Block &Layout::get_block_by_track(const Track &t) const -{ - for(set::const_iterator i=blocks.begin(); i!=blocks.end(); ++i) - if((*i)->get_tracks().count(const_cast(&t))) - return **i; - - throw InvalidParameterValue("No block found for track"); -} - void Layout::create_blocks() { set used_tracks; @@ -123,20 +124,21 @@ void Layout::create_blocks() (*i)->check_link(**j); } -void Layout::create_blocks(const Track &track) +void Layout::create_blocks(Track &track) { + /* Must collect the blocks in a set first while all tracks are still + guaranteed to have blocks and to avoid duplicate deletes */ + set del_blocks; + + del_blocks.insert(&track.get_block()); + const vector &links = track.get_links(); - for(set::iterator i=blocks.begin(); i!=blocks.end();) - { - bool del = (*i)->get_tracks().count(const_cast(&track)); - for(vector::const_iterator j=links.begin(); (!del && j!=links.end()); ++j) - del = (*i)->get_tracks().count(*j); - - if(del) - delete *i++; - else - ++i; - } + for(vector::const_iterator i=links.begin(); i!=links.end(); ++i) + if(*i) + del_blocks.insert(&(*i)->get_block()); + + for(set::iterator i=del_blocks.begin(); i!=del_blocks.end(); ++i) + delete *i; create_blocks(); } @@ -148,30 +150,27 @@ void Layout::remove_block(Block &b) void Layout::add_route(Route &r) { - if(routes.count(r.get_name())) - throw KeyError("Duplicate route name", r.get_name()); - - routes[r.get_name()] = &r; - signal_route_added.emit(r); + if(routes.insert(&r).second) + signal_route_added.emit(r); } Route &Layout::get_route(const string &name) const { - map::const_iterator i = routes.find(name); - if(i==routes.end()) - throw KeyError("Unknown route", name); - return *i->second; + for(set::const_iterator i=routes.begin(); i!=routes.end(); ++i) + if((*i)->get_name()==name) + return **i; + throw KeyError("Unknown route", name); } void Layout::update_routes() { - for(map::iterator i=routes.begin(); i!=routes.end(); ++i) - i->second->update_turnouts(); + for(set::iterator i=routes.begin(); i!=routes.end(); ++i) + (*i)->update_turnouts(); } void Layout::remove_route(Route &r) { - if(routes.erase(r.get_name())) + if(routes.erase(&r)) signal_route_removed.emit(r); } @@ -249,14 +248,13 @@ void Layout::save(const string &fn) writer.write(st); } - for(map::iterator i=routes.begin(); i!=routes.end(); ++i) + for(set::iterator i=routes.begin(); i!=routes.end(); ++i) { - if(i->second->is_temporary()) + if((*i)->is_temporary()) continue; DataFile::Statement st("route"); - st.append(i->first); - i->second->save(st.sub); + (*i)->save(st.sub); writer.write(st); } } @@ -296,9 +294,12 @@ Layout::Loader::Loader(Layout &l): new_tracks(false) { add("base", &Layout::base); - add("route", &Loader::route); - add("track", &Loader::track); - add("train", &Loader::train); + add("route", static_cast(&Loader::route)); + add("route", static_cast(&Loader::route)); + add("track", static_cast(&Loader::track)); + add("track", static_cast(&Loader::track)); + add("train", static_cast(&Loader::train)); + add("train", static_cast(&Loader::train)); } void Layout::Loader::finish() @@ -307,13 +308,25 @@ void Layout::Loader::finish() (*i)->check_slope(); } +void Layout::Loader::route() +{ + Route *rte = new Route(obj); + load_sub(*rte); +} + void Layout::Loader::route(const string &n) { - Route *rte = new Route(obj, n); + Route *rte = new Route(obj); + rte->set_name(n); load_sub(*rte); } void Layout::Loader::track(unsigned art_nr) +{ + track(ArticleNumber(art_nr)); +} + +void Layout::Loader::track(ArticleNumber art_nr) { Track *trk = new Track(obj, obj.catalogue.get_track(art_nr)); load_sub(*trk); @@ -324,6 +337,11 @@ void Layout::Loader::track(unsigned art_nr) } void Layout::Loader::train(unsigned art_nr, unsigned addr) +{ + train(ArticleNumber(art_nr), addr); +} + +void Layout::Loader::train(ArticleNumber art_nr, unsigned addr) { Train *trn = new Train(obj, obj.catalogue.get_vehicle(art_nr), addr); load_sub(*trn);