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];
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

View File

@ -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;
/**

View File

@ -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);

View File

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