# HG changeset patch # User Peter Nelson # Date 2023-09-03 19:33:24 # Node ID 6bcc242489a34f194ab893f4ec3400479f0db6af # Parent edf5285fc0ed01aa96a68621b3f9f1f9ebdd1440 Change: Replace fixed length _grf_text array with vector. Additionally reshuffle GRFTextEntry for better alignment. This removes a mostly-unused static 20MB allocation. diff --git a/src/newgrf_text.cpp b/src/newgrf_text.cpp --- a/src/newgrf_text.cpp +++ b/src/newgrf_text.cpp @@ -64,15 +64,14 @@ enum GRFExtendedLanguages { * since it is NOT SUPPOSED to happen. */ struct GRFTextEntry { + GRFTextList textholder; + StringID def_string; uint32_t grfid; uint16_t stringid; - StringID def_string; - GRFTextList textholder; }; -static uint _num_grf_texts = 0; -static GRFTextEntry _grf_text[TAB_SIZE_NEWGRF]; +static std::vector _grf_text; static byte _currentLangID = GRFLX_ENGLISH; ///< by default, english is used. /** @@ -561,27 +560,21 @@ StringID AddGRFString(uint32_t grfid, ui } } - uint id; - for (id = 0; id < _num_grf_texts; id++) { - if (_grf_text[id].grfid == grfid && _grf_text[id].stringid == stringid) { - break; - } + auto it = std::find_if(std::begin(_grf_text), std::end(_grf_text), [&grfid, &stringid](const GRFTextEntry &grf_text) { return grf_text.grfid == grfid && grf_text.stringid == stringid; }); + if (it == std::end(_grf_text)) { + /* Too many strings allocated, return empty. */ + if (_grf_text.size() == TAB_SIZE_NEWGRF) return STR_EMPTY; + + /* We didn't find our stringid and grfid in the list, allocate a new id. */ + it = _grf_text.emplace(std::end(_grf_text)); + it->grfid = grfid; + it->stringid = stringid; + it->def_string = def_string; } - - /* Too many strings allocated, return empty */ - if (id == lengthof(_grf_text)) return STR_EMPTY; + uint id = static_cast(it - std::begin(_grf_text)); std::string newtext = TranslateTTDPatchCodes(grfid, langid_to_add, allow_newlines, text_to_add); - - /* If we didn't find our stringid and grfid in the list, allocate a new id */ - if (id == _num_grf_texts) _num_grf_texts++; - - if (_grf_text[id].textholder.empty()) { - _grf_text[id].grfid = grfid; - _grf_text[id].stringid = stringid; - _grf_text[id].def_string = def_string; - } - AddGRFTextToList(_grf_text[id].textholder, langid_to_add, newtext); + AddGRFTextToList(it->textholder, langid_to_add, newtext); GrfMsg(3, "Added 0x{:X} grfid {:08X} string 0x{:X} lang 0x{:X} string '{}' ({:X})", id, grfid, stringid, langid_to_add, newtext, MakeStringID(TEXT_TAB_NEWGRF_START, id)); @@ -593,10 +586,10 @@ StringID AddGRFString(uint32_t grfid, ui */ StringID GetGRFStringID(uint32_t grfid, StringID stringid) { - for (uint id = 0; id < _num_grf_texts; id++) { - if (_grf_text[id].grfid == grfid && _grf_text[id].stringid == stringid) { - return MakeStringID(TEXT_TAB_NEWGRF_START, id); - } + auto it = std::find_if(std::begin(_grf_text), std::end(_grf_text), [&grfid, &stringid](const GRFTextEntry &grf_text) { return grf_text.grfid == grfid && grf_text.stringid == stringid; }); + if (it != std::end(_grf_text)) { + uint id = static_cast(it - std::begin(_grf_text)); + return MakeStringID(TEXT_TAB_NEWGRF_START, id); } return STR_UNDEFINED; @@ -645,6 +638,7 @@ const char *GetGRFStringFromGRFText(cons */ const char *GetGRFStringPtr(uint16_t stringid) { + assert(stringid < _grf_text.size()); assert(_grf_text[stringid].grfid != 0); const char *str = GetGRFStringFromGRFText(_grf_text[stringid].textholder); @@ -683,19 +677,11 @@ bool CheckGrfLangID(byte lang_id, byte g /** * House cleaning. - * Remove all strings and reset the text counter. + * Remove all strings. */ void CleanUpStrings() { - uint id; - - for (id = 0; id < _num_grf_texts; id++) { - _grf_text[id].grfid = 0; - _grf_text[id].stringid = 0; - _grf_text[id].textholder.clear(); - } - - _num_grf_texts = 0; + _grf_text.clear(); } struct TextRefStack {