Add hash table index to EngineOverrideManager

Use for EngineOverrideManager::GetID lookups
This commit is contained in:
Jonathan G Rennison
2024-05-31 21:18:53 +01:00
parent 556722399a
commit f09f412c43
4 changed files with 53 additions and 1 deletions

View File

@@ -579,6 +579,7 @@ void EngineOverrideManager::ResetToDefaultMapping()
eid.substitute_id = internal_id; eid.substitute_id = internal_id;
} }
} }
this->ReIndex();
} }
/** /**
@@ -592,14 +593,21 @@ void EngineOverrideManager::ResetToDefaultMapping()
*/ */
EngineID EngineOverrideManager::GetID(VehicleType type, uint16_t grf_local_id, uint32_t grfid) EngineID EngineOverrideManager::GetID(VehicleType type, uint16_t grf_local_id, uint32_t grfid)
{ {
auto iter = this->mapping_index.find(HashKey(type, grf_local_id, grfid));
EngineID id = (iter != this->mapping_index.end()) ? iter->second : INVALID_ENGINE;
#ifdef _DEBUG
EngineID index = 0; EngineID index = 0;
for (const EngineIDMapping &eid : *this) { for (const EngineIDMapping &eid : *this) {
if (eid.type == type && eid.grfid == grfid && eid.internal_id == grf_local_id) { if (eid.type == type && eid.grfid == grfid && eid.internal_id == grf_local_id) {
assert(id == index);
return index; return index;
} }
index++; index++;
} }
return INVALID_ENGINE; assert(id == INVALID_ENGINE);
#endif
return id;
} }
/** /**
@@ -620,6 +628,26 @@ bool EngineOverrideManager::ResetToCurrentNewGRFConfig()
return true; return true;
} }
void EngineOverrideManager::AddToIndex(EngineID id)
{
this->mapping_index.insert({ HashKey((*this)[id]), id });
}
void EngineOverrideManager::RemoveFromIndex(EngineID id)
{
this->mapping_index.erase(HashKey((*this)[id]));
}
void EngineOverrideManager::ReIndex()
{
this->mapping_index.clear();
EngineID index = 0;
for (const EngineIDMapping &eid : *this) {
this->mapping_index.insert({ HashKey(eid), index });
index++;
}
}
/** /**
* Initialise the engine pool with the data from the original vehicles. * Initialise the engine pool with the data from the original vehicles.
*/ */

View File

@@ -13,6 +13,7 @@
#include "engine_type.h" #include "engine_type.h"
#include "vehicle_type.h" #include "vehicle_type.h"
#include "3rdparty/robin_hood/robin_hood.h"
#include <vector> #include <vector>
struct EngineIDMapping { struct EngineIDMapping {
@@ -29,9 +30,27 @@ struct EngineIDMapping {
struct EngineOverrideManager : std::vector<EngineIDMapping> { struct EngineOverrideManager : std::vector<EngineIDMapping> {
static const uint NUM_DEFAULT_ENGINES; ///< Number of default entries static const uint NUM_DEFAULT_ENGINES; ///< Number of default entries
private:
static uint64_t HashKey(VehicleType type, uint16_t grf_local_id, uint32_t grfid)
{
return grfid | (static_cast<uint64_t>(grf_local_id) << 32) | (static_cast<uint64_t>(type) << 48);
}
static uint64_t HashKey(const EngineIDMapping &eid)
{
return HashKey(eid.type, eid.internal_id, eid.grfid);
}
robin_hood::unordered_map<uint64_t, EngineID> mapping_index;
public:
void ResetToDefaultMapping(); void ResetToDefaultMapping();
EngineID GetID(VehicleType type, uint16_t grf_local_id, uint32_t grfid); EngineID GetID(VehicleType type, uint16_t grf_local_id, uint32_t grfid);
void AddToIndex(EngineID id);
void RemoveFromIndex(EngineID id);
void ReIndex();
static bool ResetToCurrentNewGRFConfig(); static bool ResetToCurrentNewGRFConfig();
}; };

View File

@@ -569,8 +569,10 @@ static Engine *GetNewEngine(const GRFFile *file, VehicleType type, uint16_t inte
/* Reserve the engine slot */ /* Reserve the engine slot */
if (!static_access) { if (!static_access) {
_engine_mngr.RemoveFromIndex(engine);
EngineIDMapping *eid = _engine_mngr.data() + engine; EngineIDMapping *eid = _engine_mngr.data() + engine;
eid->grfid = scope_grfid; // Note: this is INVALID_GRFID if dynamic_engines is disabled, so no reservation eid->grfid = scope_grfid; // Note: this is INVALID_GRFID if dynamic_engines is disabled, so no reservation
_engine_mngr.AddToIndex(engine);
} }
return e; return e;
@@ -597,6 +599,7 @@ static Engine *GetNewEngine(const GRFFile *file, VehicleType type, uint16_t inte
type, type,
std::min<uint8_t>(internal_id, _engine_counts[type]) // substitute_id == _engine_counts[subtype] means "no substitute" std::min<uint8_t>(internal_id, _engine_counts[type]) // substitute_id == _engine_counts[subtype] means "no substitute"
}); });
_engine_mngr.AddToIndex(e->index);
if (engine_pool_size != Engine::GetPoolSize()) { if (engine_pool_size != Engine::GetPoolSize()) {
/* Resize temporary engine data ... */ /* Resize temporary engine data ... */

View File

@@ -115,6 +115,8 @@ struct EIDSChunkHandler : ChunkHandler {
EngineIDMapping *eid = &_engine_mngr.emplace_back(); EngineIDMapping *eid = &_engine_mngr.emplace_back();
SlObject(eid, slt); SlObject(eid, slt);
} }
_engine_mngr.ReIndex();
} }
}; };