using namespace Marklin;
-typedef std::pair<const Track *, unsigned> Key;
+typedef std::pair<Track *, unsigned> Key;
struct Node
{
- const Track *track;
+ Track *track;
unsigned ep;
Node *prev;
float dist;
track(0), ep(0), prev(0), dist(0)
{ }
- Node(const Track &t, unsigned e):
+ Node(Track &t, unsigned e):
track(&t), ep(e), prev(0), dist(0)
{ }
- Node(const Track &t, unsigned e, Node &r, float d):
+ Node(Track &t, unsigned e, Node &r, float d):
track(&t), ep(e), prev(&r), dist(prev->dist+d)
{ }
struct TrackMatch
{
- const Track &track;
+ Track &track;
- TrackMatch(const Track &t): track(t) { }
+ TrackMatch(Track &t): track(t) { }
- bool operator()(const Track &t) const { return &t==&track; }
+ bool operator()(Track &t) const { return &t==&track; }
};
struct TrackInSet
{
- const set<const Track *> &tracks;
+ const set<Track *> &tracks;
- TrackInSet(const set<const Track *> &t): tracks(t) { }
+ TrackInSet(const set<Track *> &t): tracks(t) { }
- bool operator()(const Track &t) const { return tracks.count(&t); }
+ bool operator()(Track &t) const { return tracks.count(&t); }
};
template<typename Pred>
-list<const Track *> dijkstra(const Track &from, unsigned ep, const Pred &goal)
+list<Track *> dijkstra(Track &from, unsigned ep, const Pred &goal)
{
map<Key, Node> track_nodes;
priority_queue<Node> nodes;
if(!final)
throw InvalidParameterValue("Could not find a route");
- list<const Track *> result;
+ list<Track *> result;
for(Node *node=final; node; node=node->prev)
result.push_front(node->track);
}
template<typename Pred>
-Route *create_route(const Track &from, unsigned ep, const Pred &goal)
+Route *create_route(Track &from, unsigned ep, const Pred &goal)
{
- list<const Track *> tracks = dijkstra(from, ep, goal);
+ list<Track *> tracks = dijkstra(from, ep, goal);
Route *route = new Route(from.get_layout());
- for(list<const Track *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
+ for(list<Track *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
route->add_track(**i);
route->set_name("Pathfinder");
void Route::update_turnouts()
{
set<unsigned> found;
- for(set<const Track *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
+ for(set<Track *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
if(unsigned tid = (*i)->get_turnout_id())
{
found.insert(tid);
return -1;
}
-void Route::add_track(const Track &trk)
+void Route::add_track(Track &trk)
{
if(tracks.count(&trk))
return;
update_turnouts();
}
-void Route::add_tracks(const set<const Track *> &trks)
+void Route::add_tracks(const set<Track *> &trks)
{
- set<const Track *> pending;
- for(set<const Track *>::const_iterator i=trks.begin(); i!=trks.end(); ++i)
+ set<Track *> pending;
+ for(set<Track *>::const_iterator i=trks.begin(); i!=trks.end(); ++i)
if(!tracks.count(*i))
pending.insert(*i);
while(!pending.empty())
{
bool found = false;
- for(set<const Track *>::const_iterator i=pending.begin(); i!=pending.end(); ++i)
+ for(set<Track *>::const_iterator i=pending.begin(); i!=pending.end(); ++i)
if(tracks.empty() || check_validity(**i)==7)
{
tracks.insert(*i);
update_turnouts();
}
-void Route::add_track_chain(const Track &start, unsigned ep, const TurnoutMap &trnts)
+void Route::add_track_chain(Track &start, unsigned ep, const TurnoutMap &trnts)
{
- const Track *track = &start;
+ Track *track = &start;
while(1)
{
if(track->get_type().is_dead_end())
st.push_back((DataFile::Statement("turnout"), i->first, i->second));
}
-unsigned Route::check_validity(const Track &trk) const
+unsigned Route::check_validity(Track &trk) const
{
unsigned result = 4;
- for(set<const Track *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
+ for(set<Track *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
{
int epi=(*i)->get_endpoint_by_link(trk);
if(epi>=0)
tracks.erase(&t);
}
-Route *Route::find(const Track &from, unsigned ep, const Track &to)
+Route *Route::find(Track &from, unsigned ep, Track &to)
{
return create_route(from, ep, TrackMatch(to));
}
-Route *Route::find(const Track &from, unsigned ep, const Route &to)
+Route *Route::find(Track &from, unsigned ep, const Route &to)
{
return create_route(from, ep, TrackInSet(to.get_tracks()));
}
-Route *Route::find(const Track &from, unsigned ep, const set<const Track *> &to)
+Route *Route::find(Track &from, unsigned ep, const set<Track *> &to)
{
return create_route(from, ep, TrackInSet(to));
}