X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Ftrainrouteplanner.cpp;h=7ee655a1d435acff22ff55cf3ac19bbd38fa0830;hb=3de7ae761b9a1fd1c1cd40457cc7067f4cf57c36;hp=8126ec5a48270ab65f224cd4f7fb2ee91869e034;hpb=df72b71642bbc5b9a4e5010ebca8643fbeea3ca8;p=r2c2.git diff --git a/source/libr2c2/trainrouteplanner.cpp b/source/libr2c2/trainrouteplanner.cpp index 8126ec5..7ee655a 100644 --- a/source/libr2c2/trainrouteplanner.cpp +++ b/source/libr2c2/trainrouteplanner.cpp @@ -1,3 +1,4 @@ +#include #include "catalogue.h" #include "layout.h" #include "route.h" @@ -12,7 +13,8 @@ using namespace Msp; namespace R2C2 { -TrainRoutePlanner::TrainRoutePlanner(Layout &layout) +TrainRoutePlanner::TrainRoutePlanner(Layout &layout): + result(PENDING) { const map &trains = layout.get_trains(); for(map::const_iterator i=trains.begin(); i!=trains.end(); ++i) @@ -27,6 +29,7 @@ void TrainRoutePlanner::plan() { steps.clear(); queue.clear(); + result = PENDING; queue.push_back(RoutingStep()); RoutingStep &start = queue.back(); @@ -48,7 +51,31 @@ void TrainRoutePlanner::plan() } if(goal) + { create_routes(*goal); + result = COMPLETE; + } + else + result = FAILED; +} + +const list &TrainRoutePlanner::get_routes_for(const Train &train) const +{ + return get_train_info(train).routes; +} + +const list &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::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() @@ -75,7 +102,7 @@ void TrainRoutePlanner::create_routes(const RoutingStep &goal) i->track_history[j] = 0; } - map sequenced_tracks; + map sequenced_tracks; unsigned sequence = steps.size(); for(const RoutingStep *i=&goal; i; i=i->prev) for(vector::const_iterator j=i->trains.begin(); j!=i->trains.end(); ++j) @@ -119,56 +146,29 @@ void TrainRoutePlanner::create_routes(const RoutingStep &goal) history[0] = j->track.track(); bool waitable = j->track.endpoint().paths!=j->track->get_type().get_paths(); - map::iterator k = sequenced_tracks.find(j->track.track()); + map::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::iterator i=routed_trains.begin(); i!=routed_trains.end(); ++i) - { - for(list::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::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()),