mirror of https://github.com/OpenTTD/OpenTTD.git
Codechange: Replace GroupStatistics' num_engines with std::map. (#11849)
This removes manual memory management with calloc/free calls, and prevents potentially large arrays being allocated for each group.
This commit is contained in:
parent
c0ab436077
commit
8797cc7ef2
|
@ -24,15 +24,12 @@ extern GroupPool _group_pool; ///< Pool of groups.
|
||||||
struct GroupStatistics {
|
struct GroupStatistics {
|
||||||
Money profit_last_year; ///< Sum of profits for all vehicles.
|
Money profit_last_year; ///< Sum of profits for all vehicles.
|
||||||
Money profit_last_year_min_age; ///< Sum of profits for vehicles considered for profit statistics.
|
Money profit_last_year_min_age; ///< Sum of profits for vehicles considered for profit statistics.
|
||||||
uint16_t *num_engines; ///< Caches the number of engines of each type the company owns.
|
std::map<EngineID, uint16_t> num_engines; ///< Caches the number of engines of each type the company owns.
|
||||||
uint16_t num_vehicle; ///< Number of vehicles.
|
uint16_t num_vehicle; ///< Number of vehicles.
|
||||||
uint16_t num_vehicle_min_age; ///< Number of vehicles considered for profit statistics;
|
uint16_t num_vehicle_min_age; ///< Number of vehicles considered for profit statistics;
|
||||||
bool autoreplace_defined; ///< Are any autoreplace rules set?
|
bool autoreplace_defined; ///< Are any autoreplace rules set?
|
||||||
bool autoreplace_finished; ///< Have all autoreplacement finished?
|
bool autoreplace_finished; ///< Have all autoreplacement finished?
|
||||||
|
|
||||||
GroupStatistics();
|
|
||||||
~GroupStatistics();
|
|
||||||
|
|
||||||
void Clear();
|
void Clear();
|
||||||
|
|
||||||
void ClearProfits()
|
void ClearProfits()
|
||||||
|
@ -49,6 +46,8 @@ struct GroupStatistics {
|
||||||
this->autoreplace_finished = false;
|
this->autoreplace_finished = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint16_t GetNumEngines(EngineID engine) const;
|
||||||
|
|
||||||
static GroupStatistics &Get(CompanyID company, GroupID id_g, VehicleType type);
|
static GroupStatistics &Get(CompanyID company, GroupID id_g, VehicleType type);
|
||||||
static GroupStatistics &Get(const Vehicle *v);
|
static GroupStatistics &Get(const Vehicle *v);
|
||||||
static GroupStatistics &GetAllGroup(const Vehicle *v);
|
static GroupStatistics &GetAllGroup(const Vehicle *v);
|
||||||
|
|
|
@ -27,16 +27,6 @@
|
||||||
GroupPool _group_pool("Group");
|
GroupPool _group_pool("Group");
|
||||||
INSTANTIATE_POOL_METHODS(Group)
|
INSTANTIATE_POOL_METHODS(Group)
|
||||||
|
|
||||||
GroupStatistics::GroupStatistics()
|
|
||||||
{
|
|
||||||
this->num_engines = CallocT<uint16_t>(Engine::GetPoolSize());
|
|
||||||
}
|
|
||||||
|
|
||||||
GroupStatistics::~GroupStatistics()
|
|
||||||
{
|
|
||||||
free(this->num_engines);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clear all caches.
|
* Clear all caches.
|
||||||
*/
|
*/
|
||||||
|
@ -47,9 +37,20 @@ void GroupStatistics::Clear()
|
||||||
this->num_vehicle_min_age = 0;
|
this->num_vehicle_min_age = 0;
|
||||||
this->profit_last_year_min_age = 0;
|
this->profit_last_year_min_age = 0;
|
||||||
|
|
||||||
/* This is also called when NewGRF change. So the number of engines might have changed. Reallocate. */
|
/* This is also called when NewGRF change. So the number of engines might have changed. Reset. */
|
||||||
free(this->num_engines);
|
this->num_engines.clear();
|
||||||
this->num_engines = CallocT<uint16_t>(Engine::GetPoolSize());
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get number of vehicles of a specific engine ID.
|
||||||
|
* @param engine Engine ID.
|
||||||
|
* @returns number of vehicles of this engine ID.
|
||||||
|
*/
|
||||||
|
uint16_t GroupStatistics::GetNumEngines(EngineID engine) const
|
||||||
|
{
|
||||||
|
auto found = this->num_engines.find(engine);
|
||||||
|
if (found != std::end(this->num_engines)) return found->second;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -800,7 +801,7 @@ uint GetGroupNumEngines(CompanyID company, GroupID id_g, EngineID id_e)
|
||||||
for (const Group *g : Group::Iterate()) {
|
for (const Group *g : Group::Iterate()) {
|
||||||
if (g->parent == id_g) count += GetGroupNumEngines(company, g->index, id_e);
|
if (g->parent == id_g) count += GetGroupNumEngines(company, g->index, id_e);
|
||||||
}
|
}
|
||||||
return count + GroupStatistics::Get(company, id_g, e->type).num_engines[id_e];
|
return count + GroupStatistics::Get(company, id_g, e->type).GetNumEngines(id_e);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
/* AIs have only access to engines they can purchase or still have in use.
|
/* AIs have only access to engines they can purchase or still have in use.
|
||||||
* Deity has access to all engined that will be or were available ever. */
|
* Deity has access to all engined that will be or were available ever. */
|
||||||
CompanyID company = ScriptObject::GetCompany();
|
CompanyID company = ScriptObject::GetCompany();
|
||||||
return ScriptCompanyMode::IsDeity() || ::IsEngineBuildable(engine_id, e->type, company) || ::Company::Get(company)->group_all[e->type].num_engines[engine_id] > 0;
|
return ScriptCompanyMode::IsDeity() || ::IsEngineBuildable(engine_id, e->type, company) || ::Company::Get(company)->group_all[e->type].GetNumEngines(engine_id) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* static */ bool ScriptEngine::IsBuildable(EngineID engine_id)
|
/* static */ bool ScriptEngine::IsBuildable(EngineID engine_id)
|
||||||
|
|
Loading…
Reference in New Issue