Codechange: simplify iteration of track bits (#15668)

This commit is contained in:
Peter Nelson
2026-06-02 19:19:40 +01:00
committed by GitHub
parent 3314f4955b
commit dbf56751b7
2 changed files with 7 additions and 14 deletions
+3 -5
View File
@@ -485,11 +485,9 @@ void ChangeOwnershipOfCompanyItems(Owner old_owner, Owner new_owner)
* because of different owner of crossing and approaching train */
for (const auto tile : Map::Iterate()) {
if (IsTileType(tile, TileType::Railway) && IsTileOwner(tile, new_owner) && HasSignals(tile)) {
TrackBits tracks = GetTrackBits(tile);
do { // there may be two tracks with signals for TRACK_BIT_HORZ and TRACK_BIT_VERT
Track track = RemoveFirstTrack(&tracks);
if (HasSignalOnTrack(tile, track)) AddTrackToSignalBuffer(tile, track, new_owner);
} while (tracks != TRACK_BIT_NONE);
for (Track track : SetTrackBitIterator(GetTrackBits(tile))) {
if (IsSignalPresent(tile, SignalOnTrack(track))) AddTrackToSignalBuffer(tile, track, new_owner);
}
} else if (IsLevelCrossingTile(tile) && IsTileOwner(tile, new_owner)) {
UpdateLevelCrossing(tile);
}
+4 -9
View File
@@ -1608,9 +1608,7 @@ CommandCost CmdConvertRail(DoCommandFlags flags, TileIndex tile, TileIndex area_
}
}
if (flags.Test(DoCommandFlag::Execute)) { // we can safely convert, too
TrackBits reserved = GetReservedTrackbits(tile);
Track track;
while ((track = RemoveFirstTrack(&reserved)) != INVALID_TRACK) {
for (Track track : SetTrackBitIterator(GetReservedTrackbits(tile))) {
Train *v = GetTrainForReservation(tile, track);
if (v != nullptr && !HasPowerOnRail(v->railtypes, totype)) {
/* No power on new rail type, reroute. */
@@ -1662,9 +1660,8 @@ CommandCost CmdConvertRail(DoCommandFlags flags, TileIndex tile, TileIndex area_
default: // RailTileType::Normal, RailTileType::Signals
if (flags.Test(DoCommandFlag::Execute)) {
/* notify YAPF about the track layout change */
TrackBits tracks = GetTrackBits(tile);
while (tracks != TRACK_BIT_NONE) {
YapfNotifyTrackLayoutChange(tile, RemoveFirstTrack(&tracks));
for (Track track : SetTrackBitIterator(GetTrackBits(tile))) {
YapfNotifyTrackLayoutChange(tile, track);
}
}
found_convertible_track = true;
@@ -1824,9 +1821,7 @@ static CommandCost ClearTile_Rail(TileIndex tile, DoCommandFlags flags)
/* Is there flat water on the lower halftile that gets cleared expensively? */
bool water_ground = (GetRailGroundType(tile) == RailGroundType::HalfTileWater && IsSlopeWithOneCornerRaised(tileh));
TrackBits tracks = GetTrackBits(tile);
while (tracks != TRACK_BIT_NONE) {
Track track = RemoveFirstTrack(&tracks);
for (Track track : SetTrackBitIterator(GetTrackBits(tile))) {
CommandCost ret = Command<Commands::RemoveRail>::Do(flags, tile, track);
if (ret.Failed()) return ret;
cost.AddCost(ret.GetCost());