]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/trainrouter.cpp
Improve the interface and algorithms of BlockAllocator
[r2c2.git] / source / libr2c2 / trainrouter.cpp
index 77d6f71c8a082f9108921b3d3051b58b4fada51f..d29438fef588b1107a70bddc620b7aa4a9bfb56e 100644 (file)
@@ -35,8 +35,9 @@ bool TrainRouter::set_route(const Route *r)
        Route *lead = 0;
        if(r && train.is_placed())
        {
-               TrackIter first = train.get_tail_block().track_iter();
-               TrackIter next = train.get_head_block().next().track_iter();
+               const BlockAllocator &allocator = train.get_block_allocator();
+               TrackIter first = allocator.first().track_iter();
+               TrackIter next = allocator.last().next().track_iter();
                if(!r->has_track(*next))
                {
                        lead = Route::find(next, *r);
@@ -175,7 +176,7 @@ void TrainRouter::block_reserved(Block &block, Train *t)
                return;
        }
 
-       BlockIter b_iter(&block, t->get_entry_to_block(block));
+       BlockIter b_iter = t->get_block_allocator().iter_for(block);
 
        RouteList::iterator route = routes.begin();
        if(advance_route(route, block))
@@ -205,13 +206,13 @@ void TrainRouter::block_reserved(Block &block, Train *t)
 
 void TrainRouter::train_advanced(Block &block)
 {
+       BlockIter b_iter = train.get_block_allocator().iter_for(block);
+
        // Check if we've reached the next route
        if(routes.size()>1)
        {
-               unsigned entry = train.get_entry_to_block(block);
-               Track &track = *block.get_endpoint(entry).track;
                const Route &route = **++routes.begin();
-               if(route.has_track(track))
+               if(route.has_track(*b_iter.endpoint().track))
                {
                        routes.pop_front();
                        // XXX Exceptions?
@@ -221,9 +222,8 @@ void TrainRouter::train_advanced(Block &block)
 
        if(!routes.empty())
        {
-               BlockIter iter(&block, train.get_entry_to_block(block));
-               iter = iter.next();
-               if(iter && !is_on_route(*iter))
+               b_iter = b_iter.next();
+               if(b_iter && !is_on_route(*b_iter))
                        arriving = true;
        }
 }
@@ -249,7 +249,7 @@ Route *TrainRouter::create_lead_route(Route *lead, const Route *target)
        }
 
        set<Track *> tracks;
-       for(BlockIter i=train.get_tail_block(); (i && i->get_train()==&train); i=i.next())
+       for(BlockIter i=train.get_block_allocator().first(); (i && i->get_train()==&train); i=i.next())
        {
                const set<Track *> &btracks = i->get_tracks();
                for(set<Track *>::const_iterator j=btracks.begin(); j!=btracks.end(); ++j)