From: Mikko Rasa Date: Fri, 29 Oct 2010 17:57:01 +0000 (+0000) Subject: Make the pathfinder use TrackIter X-Git-Url: https://git.tdb.fi/?a=commitdiff_plain;h=6bc2957656507e09f08206ae9b1111a694a4b891;p=r2c2.git Make the pathfinder use TrackIter --- diff --git a/source/libmarklin/route.cpp b/source/libmarklin/route.cpp index daa044f..556cbf4 100644 --- a/source/libmarklin/route.cpp +++ b/source/libmarklin/route.cpp @@ -24,21 +24,20 @@ typedef std::pair Key; struct Node { - Track *track; - unsigned ep; + TrackIter track; Node *prev; float dist; Node(): - track(0), ep(0), prev(0), dist(0) + prev(0), dist(0) { } - Node(Track &t, unsigned e): - track(&t), ep(e), prev(0), dist(0) + Node(const TrackIter &t): + track(t), prev(0), dist(0) { } - Node(Track &t, unsigned e, Node &r, float d): - track(&t), ep(e), prev(&r), dist(prev->dist+d) + Node(const TrackIter &t, Node &r, float d): + track(t), prev(&r), dist(prev->dist+d) { } bool operator<(const Node &other) const @@ -64,20 +63,20 @@ struct TrackInSet }; template -list dijkstra(Track &from, unsigned ep, const Pred &goal) +list dijkstra(const TrackIter &from, const Pred &goal) { map track_nodes; priority_queue nodes; Node *final = 0; - nodes.push(Node(from, ep)); + nodes.push(from); while(!nodes.empty()) { Node lowest = nodes.top(); nodes.pop(); - Key key(lowest.track, lowest.ep); + Key key(lowest.track.track(), lowest.track.entry()); if(track_nodes.count(key)) continue; @@ -88,44 +87,37 @@ list dijkstra(Track &from, unsigned ep, const Pred &goal) break; } - const TrackType &type = lowest.track->get_type(); - const vector &eps = type.get_endpoints(); - const vector &links = lowest.track->get_links(); - for(unsigned i=0; iget_endpoint_by_link(*lowest.track); - if(track_nodes.count(Key(links[i], link_ep))) - continue; + unsigned paths = lowest.track->get_type().get_endpoints()[lowest.track.entry()].paths; + for(unsigned i=0; paths>>i; ++i) + if(paths&(1<>=1) ; - nodes.push(Node(*links[i], links[i]->get_endpoint_by_link(*lowest.track), ref, type.get_path_length(path))); - } + nodes.push(Node(next, ref, lowest.track->get_type().get_path_length(i))); + } } list result; for(Node *node=final; node; node=node->prev) - result.push_front(node->track); + result.push_front(&*node->track); return result; } template -Route *create_route(Track &from, unsigned ep, const Pred &goal) +Route *create_route(const TrackIter &from, const Pred &goal) { - list tracks = dijkstra(from, ep, goal); + list tracks = dijkstra(from, goal); if(tracks.empty()) return 0; - Route *route = new Route(from.get_layout()); + Route *route = new Route(from->get_layout()); for(list::iterator i=tracks.begin(); i!=tracks.end(); ++i) route->add_track(**i); @@ -380,19 +372,19 @@ void Route::track_removed(Track &t) tracks.erase(&t); } -Route *Route::find(Track &from, unsigned ep, Track &to) +Route *Route::find(const TrackIter &from, Track &to) { - return create_route(from, ep, TrackMatch(to)); + return create_route(from, TrackMatch(to)); } -Route *Route::find(Track &from, unsigned ep, const Route &to) +Route *Route::find(const TrackIter &from, const Route &to) { - return create_route(from, ep, TrackInSet(to.get_tracks())); + return create_route(from, TrackInSet(to.get_tracks())); } -Route *Route::find(Track &from, unsigned ep, const set &to) +Route *Route::find(const TrackIter &from, const set &to) { - return create_route(from, ep, TrackInSet(to)); + return create_route(from, TrackInSet(to)); } diff --git a/source/libmarklin/route.h b/source/libmarklin/route.h index 75241d8..f8cf726 100644 --- a/source/libmarklin/route.h +++ b/source/libmarklin/route.h @@ -18,6 +18,7 @@ namespace Marklin { class Layout; class Track; +class TrackIter; class Route: public sigc::trackable { @@ -68,9 +69,9 @@ private: void track_removed(Track &); public: - static Route *find(Track &, unsigned, Track &); - static Route *find(Track &, unsigned, const Route &); - static Route *find(Track &, unsigned, const std::set &); + static Route *find(const TrackIter &, Track &); + static Route *find(const TrackIter &, const Route &); + static Route *find(const TrackIter &, const std::set &); }; } // namespace Marklin diff --git a/source/libmarklin/train.cpp b/source/libmarklin/train.cpp index 6ab617e..b87447f 100644 --- a/source/libmarklin/train.cpp +++ b/source/libmarklin/train.cpp @@ -215,7 +215,7 @@ bool Train::set_route(const Route *r) TrackIter next = (rsv_blocks.empty() ? cur_blocks : rsv_blocks).back().next().track_iter(); if(!r->has_track(*next)) { - lead = Route::find(*next, next.entry(), *r); + lead = Route::find(next, *r); if(!lead) return false; create_lead_route(lead, lead); @@ -252,7 +252,7 @@ bool Train::go_to(Track &to) TrackIter next = (rsv_blocks.empty() ? cur_blocks : rsv_blocks).back().next().track_iter(); - Route *route = Route::find(*next, next.entry(), to); + Route *route = Route::find(next, to); if(!route) return false; create_lead_route(route, route); @@ -314,12 +314,10 @@ bool Train::divert(Track &from) if(!track) return false; - unsigned ep = track->get_endpoint_by_link(from); - set tracks; for(list::iterator i=routes.begin(); i!=routes.end(); ++i) tracks.insert(i->route->get_tracks().begin(), i->route->get_tracks().end()); - RefPtr diversion = Route::find(*track, ep, tracks); + RefPtr diversion = Route::find(track, tracks); if(!diversion) return false;