+#include <msp/core/maputils.h>
#include "catalogue.h"
#include "layout.h"
#include "route.h"
namespace R2C2 {
-TrainRoutePlanner::TrainRoutePlanner(Layout &layout)
+TrainRoutePlanner::TrainRoutePlanner(Layout &layout):
+ result(PENDING)
{
const map<unsigned, Train *> &trains = layout.get_trains();
for(map<unsigned, Train *>::const_iterator i=trains.begin(); i!=trains.end(); ++i)
{
steps.clear();
queue.clear();
+ result = PENDING;
queue.push_back(RoutingStep());
RoutingStep &start = queue.back();
}
if(goal)
+ {
create_routes(*goal);
+ result = COMPLETE;
+ }
+ else
+ result = FAILED;
+}
+
+const list<Route *> &TrainRoutePlanner::get_routes_for(const Train &train) const
+{
+ return get_train_info(train).routes;
+}
+
+const list<TrainRouter::SequencePoint> &TrainRoutePlanner::get_sequence_for(const Train &train) const
+{
+ return get_train_info(train).sequence;
+}
+
+const TrainRoutePlanner::TrainRoutingInfo &TrainRoutePlanner::get_train_info(const Train &train) const
+{
+ for(vector<TrainRoutingInfo>::const_iterator i=routed_trains.begin(); i!=routed_trains.end(); ++i)
+ if(i->train==&train)
+ return *i;
+
+ throw key_error(train.get_name());
}
const TrainRoutePlanner::RoutingStep &TrainRoutePlanner::get_step()
i->track_history[j] = 0;
}
- map<Track *, SequencingInfo *> sequenced_tracks;
+ map<Track *, TrainRouter::SequencePoint *> sequenced_tracks;
unsigned sequence = steps.size();
for(const RoutingStep *i=&goal; i; i=i->prev)
for(vector<TrainRoutingState>::const_iterator j=i->trains.begin(); j!=i->trains.end(); ++j)
history[0] = j->track.track();
bool waitable = j->track.endpoint().paths!=j->track->get_type().get_paths();
- map<Track *, SequencingInfo *>::iterator k = sequenced_tracks.find(j->track.track());
+ map<Track *, TrainRouter::SequencePoint *>::iterator k = sequenced_tracks.find(j->track.track());
if(k!=sequenced_tracks.end())
{
- if(!k->second->preceding)
+ if(!k->second->preceding_train)
{
- k->second->preceding = j->info;
+ k->second->preceding_train = j->info->train;
k->second->sequence_in = sequence;
}
- j->info->sequence.push_front(SequencingInfo(j->track.track(), sequence));
+ j->info->sequence.push_front(TrainRouter::SequencePoint(j->track->get_block(), sequence));
if(waitable)
k->second = &j->info->sequence.front();
--sequence;
}
else if(waitable)
{
- j->info->sequence.push_front(SequencingInfo(j->track.track(), sequence));
+ j->info->sequence.push_front(TrainRouter::SequencePoint(j->track->get_block(), sequence));
sequenced_tracks[j->track.track()] = &j->info->sequence.front();
--sequence;
}
}
-
- for(vector<TrainRoutingInfo>::iterator i=routed_trains.begin(); i!=routed_trains.end(); ++i)
- {
- for(list<Route *>::iterator j=i->routes.begin(); j!=i->routes.end(); ++j)
- {
- if(j==i->routes.begin())
- i->router->set_route(*j);
- else
- i->router->add_route(**j);
- }
-
- for(list<SequencingInfo>::iterator j=i->sequence.begin(); j!=i->sequence.end(); ++j)
- {
- if(j->preceding && j->preceding!=&*i)
- i->router->add_sequence_point(j->track->get_block(), *j->preceding->train, j->sequence_in, j->sequence_out);
- else
- i->router->add_sequence_point(j->track->get_block(), j->sequence_out);
- }
- }
}
-TrainRoutePlanner::SequencingInfo::SequencingInfo(Track *t, unsigned o):
- track(t),
- preceding(0),
- sequence_in(0),
- sequence_out(o)
-{ }
-
-
TrainRoutePlanner::TrainRoutingInfo::TrainRoutingInfo(Train &t):
train(&t),
speed(train->get_maximum_speed()),