summaryrefslogtreecommitdiff
path: root/src/newgrf_engine.cpp
diff options
context:
space:
mode:
authorPeterN <peter1138@openttd.org>2021-04-30 12:03:07 +0100
committerGitHub <noreply@github.com>2021-04-30 12:03:07 +0100
commit3dbd6475fec5ebd63b18004bb94048460c4fb4a3 (patch)
tree2b9d79e0aeb4839526b30d4bc171e1715608e3f6 /src/newgrf_engine.cpp
parent665a3928e2f07e6ee1faed1c8b08fe3a68fbc37a (diff)
downloadopenttd-3dbd6475fec5ebd63b18004bb94048460c4fb4a3.tar.xz
Codechange: Use C++ features for train wagon overrides. (#9141)
This removes the need for C-style array management and allows use of iterators to perform wagon override lookups.
Diffstat (limited to 'src/newgrf_engine.cpp')
-rw-r--r--src/newgrf_engine.cpp43
1 files changed, 5 insertions, 38 deletions
diff --git a/src/newgrf_engine.cpp b/src/newgrf_engine.cpp
index ee14098c2..cd1214855 100644
--- a/src/newgrf_engine.cpp
+++ b/src/newgrf_engine.cpp
@@ -26,62 +26,29 @@
#include "safeguards.h"
-struct WagonOverride {
- EngineID *train_id;
- uint trains;
- CargoID cargo;
- const SpriteGroup *group;
-};
-
void SetWagonOverrideSprites(EngineID engine, CargoID cargo, const SpriteGroup *group, EngineID *train_id, uint trains)
{
Engine *e = Engine::Get(engine);
- WagonOverride *wo;
assert(cargo < NUM_CARGO + 2); // Include CT_DEFAULT and CT_PURCHASE pseudo cargoes.
- e->overrides_count++;
- e->overrides = ReallocT(e->overrides, e->overrides_count);
-
- wo = &e->overrides[e->overrides_count - 1];
+ WagonOverride *wo = &e->overrides.emplace_back();
wo->group = group;
wo->cargo = cargo;
- wo->trains = trains;
- wo->train_id = MallocT<EngineID>(trains);
- memcpy(wo->train_id, train_id, trains * sizeof *train_id);
+ wo->engines.assign(train_id, train_id + trains);
}
const SpriteGroup *GetWagonOverrideSpriteSet(EngineID engine, CargoID cargo, EngineID overriding_engine)
{
const Engine *e = Engine::Get(engine);
- for (uint i = 0; i < e->overrides_count; i++) {
- const WagonOverride *wo = &e->overrides[i];
-
- if (wo->cargo != cargo && wo->cargo != CT_DEFAULT) continue;
-
- for (uint j = 0; j < wo->trains; j++) {
- if (wo->train_id[j] == overriding_engine) return wo->group;
- }
+ for (const WagonOverride &wo : e->overrides) {
+ if (wo.cargo != cargo && wo.cargo != CT_DEFAULT) continue;
+ if (std::find(wo.engines.begin(), wo.engines.end(), overriding_engine) != wo.engines.end()) return wo.group;
}
return nullptr;
}
-/**
- * Unload all wagon override sprite groups.
- */
-void UnloadWagonOverrides(Engine *e)
-{
- for (uint i = 0; i < e->overrides_count; i++) {
- WagonOverride *wo = &e->overrides[i];
- free(wo->train_id);
- }
- free(e->overrides);
- e->overrides_count = 0;
- e->overrides = nullptr;
-}
-
-
void SetCustomEngineSprites(EngineID engine, byte cargo, const SpriteGroup *group)
{
Engine *e = Engine::Get(engine);