From 1424a184d8eff1ae78bd5c299386d6bac3e8640b Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 1 May 2024 18:23:27 +0100 Subject: [PATCH] Codechange: Use vector/span when loading wagon overrides. (#12604) Replaces manual memory allocation and passing pointer with size. --- src/newgrf.cpp | 18 +++++++----------- src/newgrf_engine.cpp | 4 ++-- src/newgrf_engine.h | 2 +- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 0b8628f370..2444e82121 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -5611,8 +5611,7 @@ static bool IsValidGroupID(uint16_t groupid, const char *function) static void VehicleMapSpriteGroup(ByteReader *buf, uint8_t feature, uint8_t idcount) { - static EngineID *last_engines; - static uint last_engines_count; + static std::vector last_engines; // Engine IDs are remembered in case the next action is a wagon override. bool wagover = false; /* Test for 'wagon override' flag */ @@ -5621,21 +5620,18 @@ static void VehicleMapSpriteGroup(ByteReader *buf, uint8_t feature, uint8_t idco /* Strip off the flag */ idcount = GB(idcount, 0, 7); - if (last_engines_count == 0) { + if (last_engines.empty()) { GrfMsg(0, "VehicleMapSpriteGroup: WagonOverride: No engine to do override with"); return; } - GrfMsg(6, "VehicleMapSpriteGroup: WagonOverride: {} engines, {} wagons", - last_engines_count, idcount); + GrfMsg(6, "VehicleMapSpriteGroup: WagonOverride: {} engines, {} wagons", last_engines.size(), idcount); } else { - if (last_engines_count != idcount) { - last_engines = ReallocT(last_engines, idcount); - last_engines_count = idcount; - } + last_engines.resize(idcount); } std::vector engines; + engines.reserve(idcount); for (uint i = 0; i < idcount; i++) { Engine *e = GetNewEngine(_cur.grffile, (VehicleType)feature, buf->ReadExtendedByte()); if (e == nullptr) { @@ -5667,7 +5663,7 @@ static void VehicleMapSpriteGroup(ByteReader *buf, uint8_t feature, uint8_t idco GrfMsg(7, "VehicleMapSpriteGroup: [{}] Engine {}...", i, engine); if (wagover) { - SetWagonOverrideSprites(engine, cid, _cur.spritegroups[groupid], last_engines, last_engines_count); + SetWagonOverrideSprites(engine, cid, _cur.spritegroups[groupid], last_engines); } else { SetCustomEngineSprites(engine, cid, _cur.spritegroups[groupid]); } @@ -5683,7 +5679,7 @@ static void VehicleMapSpriteGroup(ByteReader *buf, uint8_t feature, uint8_t idco EngineID engine = engines[i]; if (wagover) { - SetWagonOverrideSprites(engine, SpriteGroupCargo::SG_DEFAULT, _cur.spritegroups[groupid], last_engines, last_engines_count); + SetWagonOverrideSprites(engine, SpriteGroupCargo::SG_DEFAULT, _cur.spritegroups[groupid], last_engines); } else { SetCustomEngineSprites(engine, SpriteGroupCargo::SG_DEFAULT, _cur.spritegroups[groupid]); SetEngineGRF(engine, _cur.grffile); diff --git a/src/newgrf_engine.cpp b/src/newgrf_engine.cpp index 0b7e6e08e7..4a5abcdce0 100644 --- a/src/newgrf_engine.cpp +++ b/src/newgrf_engine.cpp @@ -27,7 +27,7 @@ #include "safeguards.h" -void SetWagonOverrideSprites(EngineID engine, CargoID cargo, const SpriteGroup *group, EngineID *train_id, uint trains) +void SetWagonOverrideSprites(EngineID engine, CargoID cargo, const SpriteGroup *group, std::span engine_ids) { Engine *e = Engine::Get(engine); @@ -36,7 +36,7 @@ void SetWagonOverrideSprites(EngineID engine, CargoID cargo, const SpriteGroup * WagonOverride *wo = &e->overrides.emplace_back(); wo->group = group; wo->cargo = cargo; - wo->engines.assign(train_id, train_id + trains); + wo->engines.assign(engine_ids.begin(), engine_ids.end()); } const SpriteGroup *GetWagonOverrideSpriteSet(EngineID engine, CargoID cargo, EngineID overriding_engine) diff --git a/src/newgrf_engine.h b/src/newgrf_engine.h index 527942a0a3..a2795a8d2c 100644 --- a/src/newgrf_engine.h +++ b/src/newgrf_engine.h @@ -76,7 +76,7 @@ static const uint VEHICLEINFO_FULL_VEHICLE_WIDTH = 32; struct VehicleSpriteSeq; -void SetWagonOverrideSprites(EngineID engine, CargoID cargo, const struct SpriteGroup *group, EngineID *train_id, uint trains); +void SetWagonOverrideSprites(EngineID engine, CargoID cargo, const struct SpriteGroup *group, std::span engine_ids); const SpriteGroup *GetWagonOverrideSpriteSet(EngineID engine, CargoID cargo, EngineID overriding_engine); void SetCustomEngineSprites(EngineID engine, uint8_t cargo, const struct SpriteGroup *group);