mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-09 23:50:25 +00:00
Codechange: Cache resolved town, station and industry name strings
This commit is contained in:
parent
f1734e7815
commit
c3223903ed
@ -56,6 +56,7 @@ struct BaseStation : StationPool::PoolItem<&_station_pool> {
|
||||
|
||||
char *name; ///< Custom name
|
||||
StringID string_id; ///< Default name (town area) of station
|
||||
mutable std::string cached_name; ///< NOSAVE: Cache of the resolved name of the station, if not using a custom name
|
||||
|
||||
Town *town; ///< The town this station is associated with
|
||||
Owner owner; ///< The owner of this station
|
||||
@ -108,6 +109,13 @@ struct BaseStation : StationPool::PoolItem<&_station_pool> {
|
||||
*/
|
||||
virtual void UpdateVirtCoord() = 0;
|
||||
|
||||
inline const char *GetCachedName() const
|
||||
{
|
||||
if (this->name != nullptr) return this->name;
|
||||
if (this->cached_name.empty()) this->FillCachedName();
|
||||
return this->cached_name.c_str();
|
||||
}
|
||||
|
||||
virtual void MoveSign(TileIndex new_xy)
|
||||
{
|
||||
this->xy = new_xy;
|
||||
@ -161,6 +169,9 @@ struct BaseStation : StationPool::PoolItem<&_station_pool> {
|
||||
}
|
||||
|
||||
static void PostDestructor(size_t index);
|
||||
|
||||
private:
|
||||
void FillCachedName() const;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -62,6 +62,7 @@ struct Industry : IndustryPool::PoolItem<&_industry_pool> {
|
||||
|
||||
PartOfSubsidy part_of_subsidy; ///< NOSAVE: is this industry a source/destination of a subsidy?
|
||||
StationList stations_near; ///< NOSAVE: List of nearby stations.
|
||||
mutable std::string cached_name; ///< NOSAVE: Cache of the resolved name of the industry
|
||||
|
||||
Owner founder; ///< Founder of the industry
|
||||
Date construction_date; ///< Date of the construction of the industry
|
||||
@ -157,10 +158,21 @@ struct Industry : IndustryPool::PoolItem<&_industry_pool> {
|
||||
memset(&counts, 0, sizeof(counts));
|
||||
}
|
||||
|
||||
inline const char *GetCachedName() const
|
||||
{
|
||||
if (this->cached_name.empty()) this->FillCachedName();
|
||||
return this->cached_name.c_str();
|
||||
}
|
||||
|
||||
private:
|
||||
void FillCachedName() const;
|
||||
|
||||
protected:
|
||||
static uint16 counts[NUM_INDUSTRYTYPES]; ///< Number of industries per type ingame
|
||||
};
|
||||
|
||||
void ClearAllIndustryCachedNames();
|
||||
|
||||
void PlantRandomFarmField(const Industry *i);
|
||||
|
||||
void ReleaseDisastersTargetingIndustry(IndustryID);
|
||||
|
@ -2319,6 +2319,21 @@ void Industry::RecomputeProductionMultipliers()
|
||||
}
|
||||
}
|
||||
|
||||
void Industry::FillCachedName() const
|
||||
{
|
||||
char buf[256];
|
||||
int64 args_array[] = { this->index };
|
||||
StringParameters tmp_params(args_array);
|
||||
char *end = GetStringWithArgs(buf, STR_INDUSTRY_NAME, &tmp_params, lastof(buf));
|
||||
this->cached_name.assign(buf, end);
|
||||
}
|
||||
|
||||
void ClearAllIndustryCachedNames()
|
||||
{
|
||||
for (Industry *ind : Industry::Iterate()) {
|
||||
ind->cached_name.clear();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the #probability and #min_number fields for the industry type \a it for a running game.
|
||||
|
@ -222,6 +222,13 @@ void UpdateAllVirtCoords()
|
||||
RebuildViewportKdtree();
|
||||
}
|
||||
|
||||
void ClearAllCachedNames()
|
||||
{
|
||||
ClearAllStationCachedNames();
|
||||
ClearAllTownCachedNames();
|
||||
ClearAllIndustryCachedNames();
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialization of the windows and several kinds of caches.
|
||||
* This is not done directly in AfterLoadGame because these
|
||||
@ -238,6 +245,7 @@ static void InitializeWindowsAndCaches()
|
||||
SetupColoursAndInitialWindow();
|
||||
|
||||
/* Update coordinates of the signs. */
|
||||
ClearAllCachedNames();
|
||||
UpdateAllVirtCoords();
|
||||
ResetViewportAfterLoadGame();
|
||||
|
||||
|
@ -526,6 +526,7 @@ struct GameOptionsWindow : Window {
|
||||
ReadLanguagePack(&_languages[index]);
|
||||
DeleteWindowByClass(WC_QUERY_STRING);
|
||||
CheckForMissingGlyphs();
|
||||
ClearAllCachedNames();
|
||||
UpdateAllVirtCoords();
|
||||
ReInitAllWindows();
|
||||
break;
|
||||
|
@ -453,6 +453,22 @@ void UpdateAllStationVirtCoords()
|
||||
}
|
||||
}
|
||||
|
||||
void BaseStation::FillCachedName() const
|
||||
{
|
||||
char buf[MAX_LENGTH_STATION_NAME_CHARS * MAX_CHAR_LENGTH];
|
||||
int64 args_array[] = { this->index };
|
||||
StringParameters tmp_params(args_array);
|
||||
char *end = GetStringWithArgs(buf, Waypoint::IsExpected(this) ? STR_WAYPOINT_NAME : STR_STATION_NAME, &tmp_params, lastof(buf));
|
||||
this->cached_name.assign(buf, end);
|
||||
}
|
||||
|
||||
void ClearAllStationCachedNames()
|
||||
{
|
||||
for (BaseStation *st : BaseStation::Iterate()) {
|
||||
st->cached_name.clear();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a mask of the cargo types that the station accepts.
|
||||
* @param st Station to query
|
||||
@ -3933,6 +3949,7 @@ CommandCost CmdRenameStation(TileIndex tile, DoCommandFlag flags, uint32 p1, uin
|
||||
}
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
st->cached_name.clear();
|
||||
free(st->name);
|
||||
st->name = reset ? nullptr : stredup(text);
|
||||
|
||||
|
@ -26,6 +26,7 @@ void FindStationsAroundTiles(const TileArea &location, StationList *stations, bo
|
||||
|
||||
void ShowStationViewWindow(StationID station);
|
||||
void UpdateAllStationVirtCoords();
|
||||
void ClearAllStationCachedNames();
|
||||
|
||||
CargoArray GetProductionAroundTiles(TileIndex tile, int w, int h, int rad);
|
||||
CargoArray GetAcceptanceAroundTiles(TileIndex tile, int w, int h, int rad, CargoTypes *always_accepted = nullptr);
|
||||
|
12
src/town.h
12
src/town.h
@ -60,6 +60,7 @@ struct Town : TownPool::PoolItem<&_town_pool> {
|
||||
uint16 townnametype;
|
||||
uint32 townnameparts;
|
||||
char *name; ///< Custom town name. If nullptr, the town was not renamed and uses the generated name.
|
||||
mutable std::string cached_name; ///< NOSAVE: Cache of the resolved name of the town, if not using a custom town name
|
||||
|
||||
byte flags; ///< See #TownFlags.
|
||||
|
||||
@ -130,6 +131,13 @@ struct Town : TownPool::PoolItem<&_town_pool> {
|
||||
|
||||
void UpdateVirtCoord();
|
||||
|
||||
inline const char *GetCachedName() const
|
||||
{
|
||||
if (this->name != nullptr) return this->name;
|
||||
if (this->cached_name.empty()) this->FillCachedName();
|
||||
return this->cached_name.c_str();
|
||||
}
|
||||
|
||||
static inline Town *GetByTile(TileIndex tile)
|
||||
{
|
||||
return Town::Get(GetTownIndex(tile));
|
||||
@ -137,11 +145,15 @@ struct Town : TownPool::PoolItem<&_town_pool> {
|
||||
|
||||
static Town *GetRandom();
|
||||
static void PostDestructor(size_t index);
|
||||
|
||||
private:
|
||||
void FillCachedName() const;
|
||||
};
|
||||
|
||||
uint32 GetWorldPopulation();
|
||||
|
||||
void UpdateAllTownVirtCoords();
|
||||
void ClearAllTownCachedNames();
|
||||
void ShowTownViewWindow(TownID town);
|
||||
void ExpandTown(Town *t);
|
||||
|
||||
|
@ -199,6 +199,13 @@ void Town::InitializeLayout(TownLayout layout)
|
||||
return Town::Get(index);
|
||||
}
|
||||
|
||||
void Town::FillCachedName() const
|
||||
{
|
||||
char buf[MAX_LENGTH_TOWN_NAME_CHARS * MAX_CHAR_LENGTH];
|
||||
char *end = GetTownName(buf, this, lastof(buf));
|
||||
this->cached_name.assign(buf, end);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the cost for removing this house
|
||||
* @return the cost (inflation corrected etc)
|
||||
@ -412,6 +419,13 @@ void UpdateAllTownVirtCoords()
|
||||
}
|
||||
}
|
||||
|
||||
void ClearAllTownCachedNames()
|
||||
{
|
||||
for (Town *t : Town::Iterate()) {
|
||||
t->cached_name.clear();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Change the towns population
|
||||
* @param t Town which population has changed
|
||||
@ -2681,11 +2695,14 @@ CommandCost CmdRenameTown(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
|
||||
}
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
t->cached_name.clear();
|
||||
free(t->name);
|
||||
t->name = reset ? nullptr : stredup(text);
|
||||
|
||||
t->UpdateVirtCoord();
|
||||
InvalidateWindowData(WC_TOWN_DIRECTORY, 0, TDIWD_FORCE_RESORT);
|
||||
ClearAllStationCachedNames();
|
||||
ClearAllIndustryCachedNames();
|
||||
UpdateAllStationVirtCoords();
|
||||
}
|
||||
return CommandCost();
|
||||
|
@ -74,6 +74,7 @@ bool ScrollMainWindowToTile(TileIndex tile, bool instant = false);
|
||||
bool ScrollMainWindowTo(int x, int y, int z = -1, bool instant = false);
|
||||
|
||||
void UpdateAllVirtCoords();
|
||||
void ClearAllCachedNames();
|
||||
|
||||
extern Point _tile_fract_coords;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user