From dbf56751b7ebf2ba00b4c282c1881ae958d8a5c1 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 2 Jun 2026 19:19:40 +0100 Subject: [PATCH] Codechange: simplify iteration of track bits (#15668) --- src/economy.cpp | 8 +++----- src/rail_cmd.cpp | 13 ++++--------- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/src/economy.cpp b/src/economy.cpp index 8a72596e42..a5161490c0 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -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); } diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index b8ce36b8ce..576a90b6df 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -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::Do(flags, tile, track); if (ret.Failed()) return ret; cost.AddCost(ret.GetCost());