From eda50ef6a58056f14e32dfcd8bd27ba8a8ae8d67 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Wed, 19 Jun 2024 20:03:42 +0100 Subject: [PATCH] Use std::vector for extra station name strings --- src/gfxinit.cpp | 7 ++----- src/newgrf.cpp | 8 ++++---- src/station.cpp | 11 +++++++++-- src/station_base.h | 3 +-- src/station_cmd.cpp | 6 +++--- src/strings.cpp | 2 +- 6 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/gfxinit.cpp b/src/gfxinit.cpp index 05d9cfe751..0edf237f15 100644 --- a/src/gfxinit.cpp +++ b/src/gfxinit.cpp @@ -154,11 +154,8 @@ void CheckExternalFiles() void InitGRFGlobalVars() { - extern uint _extra_station_names_used; - _extra_station_names_used = 0; - - extern uint8_t _extra_station_names_probability; - _extra_station_names_probability = 0; + extern void ClearExtraStationNames(); + ClearExtraStationNames(); extern bool _allow_rocks_desert; _allow_rocks_desert = false; diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 9ebe372d9b..a43bb4097a 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -2925,11 +2925,11 @@ static ChangeInfoResult GlobalVarChangeInfo(uint gvid, int numinfo, int prop, co if (MappedPropertyLengthMismatch(buf, 4, mapping_entry)) break; uint16_t str = buf->ReadWord(); uint16_t flags = buf->ReadWord(); - if (_extra_station_names_used < MAX_EXTRA_STATION_NAMES) { - ExtraStationNameInfo &info = _extra_station_names[_extra_station_names_used]; - AddStringForMapping(str, &info.str); + if (_extra_station_names.size() < MAX_EXTRA_STATION_NAMES) { + size_t idx = _extra_station_names.size(); + ExtraStationNameInfo &info = _extra_station_names.emplace_back(); + AddStringForMapping(str, idx, [](StringID str, size_t idx) { _extra_station_names[idx].str = str; }); info.flags = flags; - _extra_station_names_used++; } break; } diff --git a/src/station.cpp b/src/station.cpp index a416ba258c..9003d327cf 100644 --- a/src/station.cpp +++ b/src/station.cpp @@ -39,8 +39,7 @@ StationPool _station_pool("Station"); INSTANTIATE_POOL_METHODS(Station) -std::array _extra_station_names; -uint _extra_station_names_used; +std::vector _extra_station_names; uint8_t _extra_station_names_probability; const StationCargoList _empty_cargo_list{}; @@ -769,3 +768,11 @@ bool StationCompare::operator() (const Station *lhs, const Station *rhs) const { return lhs->index < rhs->index; } + +void ClearExtraStationNames() +{ + _extra_station_names.clear(); + _extra_station_names.shrink_to_fit(); + + _extra_station_names_probability = 0; +} diff --git a/src/station_base.h b/src/station_base.h index 630c84fe87..e5b6c456b2 100644 --- a/src/station_base.h +++ b/src/station_base.h @@ -50,8 +50,7 @@ struct ExtraStationNameInfo { uint16_t flags; }; -extern std::array _extra_station_names; -extern uint _extra_station_names_used; +extern std::vector _extra_station_names; extern uint8_t _extra_station_names_probability; class FlowStatMap; diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index dccf3bfb25..8e9781dfad 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -319,13 +319,13 @@ static StringID GenerateStationName(Station *st, TileIndex tile, StationNaming n return STR_SV_STNAME; } - bool use_extra_names = _extra_station_names_used > 0; + bool use_extra_names = !_extra_station_names.empty(); auto check_extra_names = [&]() -> bool { if (use_extra_names) { use_extra_names = false; const bool near_water = CountMapSquareAround(tile, CMSAWater) >= 5; std::vector candidates; - for (uint i = 0; i < _extra_station_names_used; i++) { + for (size_t i = 0; i < _extra_station_names.size(); i++) { const ExtraStationNameInfo &info = _extra_station_names[i]; if (extra_names[i]) continue; if (!HasBit(info.flags, name_class)) continue; @@ -333,7 +333,7 @@ static StringID GenerateStationName(Station *st, TileIndex tile, StationNaming n if (HasBit(info.flags, ESNIF_NOT_CENTRAL) && is_central) continue; if (HasBit(info.flags, ESNIF_NEAR_WATER) && !near_water) continue; if (HasBit(info.flags, ESNIF_NOT_NEAR_WATER) && near_water) continue; - candidates.push_back(i); + candidates.push_back(static_cast(i)); } if (!candidates.empty()) { diff --git a/src/strings.cpp b/src/strings.cpp index fb4641b4f2..178fb7a09f 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -1957,7 +1957,7 @@ static void FormatString(StringBuilder builder, const char *str_arg, StringParam string_id = indsp->station_name; } } - if (st->extra_name_index != UINT16_MAX && st->extra_name_index < _extra_station_names_used) { + if (st->extra_name_index != UINT16_MAX && st->extra_name_index < _extra_station_names.size()) { string_id = _extra_station_names[st->extra_name_index].str; }