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.
This commit is contained in:
PeterN 2021-04-30 12:03:07 +01:00 committed by GitHub
parent 665a3928e2
commit 3dbd6475fe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 13 additions and 55 deletions

View File

@ -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]; 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) Engine::Engine(VehicleType type, EngineID base)
{ {
this->type = type; 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. * Checks whether the engine is a valid (non-articulated part of an) engine.
* @return true if enabled * @return true if enabled

View File

@ -15,6 +15,12 @@
#include "core/pool_type.hpp" #include "core/pool_type.hpp"
#include "newgrf_commons.h" #include "newgrf_commons.h"
struct WagonOverride {
std::vector<EngineID> engines;
CargoID cargo;
const SpriteGroup *group;
};
typedef Pool<Engine, EngineID, 64, 64000> EnginePool; typedef Pool<Engine, EngineID, 64, 64000> EnginePool;
extern EnginePool _engine_pool; extern EnginePool _engine_pool;
@ -56,13 +62,11 @@ struct Engine : EnginePool::PoolItem<&_engine_pool> {
* evaluating callbacks. * evaluating callbacks.
*/ */
GRFFilePropsBase<NUM_CARGO + 2> grf_prop; GRFFilePropsBase<NUM_CARGO + 2> grf_prop;
uint16 overrides_count; std::vector<WagonOverride> overrides;
struct WagonOverride *overrides;
uint16 list_position; uint16 list_position;
Engine(); Engine() {}
Engine(VehicleType type, EngineID base); Engine(VehicleType type, EngineID base);
~Engine();
bool IsEnabled() const; bool IsEnabled() const;
/** /**

View File

@ -26,62 +26,29 @@
#include "safeguards.h" #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) void SetWagonOverrideSprites(EngineID engine, CargoID cargo, const SpriteGroup *group, EngineID *train_id, uint trains)
{ {
Engine *e = Engine::Get(engine); Engine *e = Engine::Get(engine);
WagonOverride *wo;
assert(cargo < NUM_CARGO + 2); // Include CT_DEFAULT and CT_PURCHASE pseudo cargoes. assert(cargo < NUM_CARGO + 2); // Include CT_DEFAULT and CT_PURCHASE pseudo cargoes.
e->overrides_count++; WagonOverride *wo = &e->overrides.emplace_back();
e->overrides = ReallocT(e->overrides, e->overrides_count);
wo = &e->overrides[e->overrides_count - 1];
wo->group = group; wo->group = group;
wo->cargo = cargo; wo->cargo = cargo;
wo->trains = trains; wo->engines.assign(train_id, train_id + trains);
wo->train_id = MallocT<EngineID>(trains);
memcpy(wo->train_id, train_id, trains * sizeof *train_id);
} }
const SpriteGroup *GetWagonOverrideSpriteSet(EngineID engine, CargoID cargo, EngineID overriding_engine) const SpriteGroup *GetWagonOverrideSpriteSet(EngineID engine, CargoID cargo, EngineID overriding_engine)
{ {
const Engine *e = Engine::Get(engine); const Engine *e = Engine::Get(engine);
for (uint i = 0; i < e->overrides_count; i++) { for (const WagonOverride &wo : e->overrides) {
const WagonOverride *wo = &e->overrides[i]; 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;
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;
}
} }
return nullptr; 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) void SetCustomEngineSprites(EngineID engine, byte cargo, const SpriteGroup *group)
{ {
Engine *e = Engine::Get(engine); Engine *e = Engine::Get(engine);

View File

@ -116,8 +116,6 @@ enum VehicleTrigger {
}; };
void TriggerVehicle(Vehicle *veh, VehicleTrigger trigger); void TriggerVehicle(Vehicle *veh, VehicleTrigger trigger);
void UnloadWagonOverrides(Engine *e);
void AlterVehicleListOrder(EngineID engine, uint target); void AlterVehicleListOrder(EngineID engine, uint target);
void CommitVehicleListOrderChanges(); void CommitVehicleListOrderChanges();