/* Add it to the list first to present a consistent state in block_reserved
signal. */
blocks.push_back(block);
+
+ bool first_reserve = (cur_blocks_end==blocks.end());
+ if(first_reserve)
+ --cur_blocks_end;
+
try
{
if(!block->reserve(&train))
{
+ if(first_reserve)
+ cur_blocks_end = blocks.end();
blocks.pop_back();
return false;
}
}
catch(...)
{
+ if(first_reserve)
+ cur_blocks_end = blocks.end();
blocks.pop_back();
throw;
}
void BlockAllocator::advance_back()
{
- const Vehicle &veh = train.get_vehicle(train.get_controller().get_reverse() ? 0 : train.get_n_vehicles()-1);
- const Block &veh_block = veh.get_track()->get_block();
+ bool rev = train.get_controller().get_reverse();
+ const Vehicle &veh = train.get_vehicle(rev ? 0 : train.get_n_vehicles()-1);
+ const Block &veh_block = veh.get_placement().get_position(rev ? VehiclePlacement::FRONT_AXLE : VehiclePlacement::BACK_AXLE)->get_block();
/* Sensors aren't guaranteed to be detriggered in order. Go through the
block list and locate the first sensor that's still active. */
void BlockAllocator::turnout_path_changing(Track &track)
{
- BlockList::iterator i = find_if(blocks.begin(), blocks.end(), BlockMatch(track.get_block()));
+ BlockList::iterator i = find_if(cur_blocks_end, blocks.end(), BlockMatch(track.get_block()));
if(i!=blocks.end())
{
++i;