summaryrefslogtreecommitdiff
path: root/src
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
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')
-rw-r--r--src/engine.cpp11
-rw-r--r--src/engine_base.h12
-rw-r--r--src/newgrf_engine.cpp43
-rw-r--r--src/newgrf_engine.h2
4 files changed, 13 insertions, 55 deletions
diff --git a/src/engine.cpp b/src/engine.cpp
index 60b0d4222..41cd9dba8 100644
--- a/src/engine.cpp
+++ b/src/engine.cpp
@@ -66,12 +66,6 @@ static_assert(lengthof(_orig_rail_vehicle_info) + lengthof(_orig_road_vehicle_in
const uint EngineOverrideManager::NUM_DEFAULT_ENGINES = _engine_counts[VEH_TRAIN] + _engine_counts[VEH_ROAD] + _engine_counts[VEH_SHIP] + _engine_counts[VEH_AIRCRAFT];
-Engine::Engine() :
- overrides_count(0),
- overrides(nullptr)
-{
-}
-
Engine::Engine(VehicleType type, EngineID base)
{
this->type = type;
@@ -136,11 +130,6 @@ Engine::Engine(VehicleType type, EngineID base)
}
}
-Engine::~Engine()
-{
- UnloadWagonOverrides(this);
-}
-
/**
* Checks whether the engine is a valid (non-articulated part of an) engine.
* @return true if enabled
diff --git a/src/engine_base.h b/src/engine_base.h
index 2e434b589..7822111e7 100644
--- a/src/engine_base.h
+++ b/src/engine_base.h
@@ -15,6 +15,12 @@
#include "core/pool_type.hpp"
#include "newgrf_commons.h"
+struct WagonOverride {
+ std::vector<EngineID> engines;
+ CargoID cargo;
+ const SpriteGroup *group;
+};
+
typedef Pool<Engine, EngineID, 64, 64000> EnginePool;
extern EnginePool _engine_pool;
@@ -56,13 +62,11 @@ struct Engine : EnginePool::PoolItem<&_engine_pool> {
* evaluating callbacks.
*/
GRFFilePropsBase<NUM_CARGO + 2> grf_prop;
- uint16 overrides_count;
- struct WagonOverride *overrides;
+ std::vector<WagonOverride> overrides;
uint16 list_position;
- Engine();
+ Engine() {}
Engine(VehicleType type, EngineID base);
- ~Engine();
bool IsEnabled() const;
/**
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);
diff --git a/src/newgrf_engine.h b/src/newgrf_engine.h
index f830ff499..90d755d3c 100644
--- a/src/newgrf_engine.h
+++ b/src/newgrf_engine.h
@@ -116,8 +116,6 @@ enum VehicleTrigger {
};
void TriggerVehicle(Vehicle *veh, VehicleTrigger trigger);
-void UnloadWagonOverrides(Engine *e);
-
void AlterVehicleListOrder(EngineID engine, uint target);
void CommitVehicleListOrderChanges();