diff --git a/src/saveload/linkgraph_sl.cpp b/src/saveload/linkgraph_sl.cpp index af28902445..7d4fe56712 100644 --- a/src/saveload/linkgraph_sl.cpp +++ b/src/saveload/linkgraph_sl.cpp @@ -20,8 +20,6 @@ typedef LinkGraph::BaseNode Node; typedef LinkGraph::BaseEdge Edge; -const SettingDesc *GetSettingDescription(uint index); - static uint16 _num_nodes; /** @@ -70,17 +68,10 @@ const SaveLoad *GetLinkGraphJobDesc() /* Build the SaveLoad array on first call and don't touch it later on */ if (saveloads.size() == 0) { - size_t prefixlen = strlen(prefix); - - int setting = 0; - const SettingDesc *desc = GetSettingDescription(setting); - while (desc != nullptr) { - if (desc->name != nullptr && strncmp(desc->name, prefix, prefixlen) == 0) { - SaveLoad sl = desc->save; - sl.address_proc = proc; - saveloads.push_back(sl); - } - desc = GetSettingDescription(++setting); + GetSettingSaveLoadByPrefix(prefix, saveloads); + + for (auto &sl : saveloads) { + sl.address_proc = proc; } int i = 0; diff --git a/src/settings.cpp b/src/settings.cpp index d39c045938..f7a4ff5dec 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -93,17 +93,6 @@ typedef void SettingDescProcList(IniFile *ini, const char *grpname, StringList & static bool IsSignedVarMemType(VarType vt); -/** - * Get the setting at the given index into the settings table. - * @param index The index to look for. - * @return The setting at the given index, or nullptr when the index is invalid. - */ -const SettingDesc *GetSettingDescription(uint index) -{ - if (index >= _settings.size()) return nullptr; - return _settings.begin()[index].get(); -} - /** * Groups in openttd.cfg that are actually lists. */ @@ -1739,6 +1728,21 @@ static const SettingDesc *GetSettingFromName(const char *name, const SettingTabl return nullptr; } +/** + * Get the SaveLoad from all settings matching the prefix. + * @param prefix The prefix to look for. + * @param saveloads A vector to store the result in. + */ +void GetSettingSaveLoadByPrefix(const char *prefix, std::vector &saveloads) +{ + size_t prefixlen = strlen(prefix); + + for (auto &sd : _settings) { + if (!SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to)) continue; + if (strncmp(sd->name, prefix, prefixlen) == 0) saveloads.push_back(sd->save); + } +} + /** * Given a name of setting, return a company setting description of it. * @param name Name of the company setting to return a setting description of. diff --git a/src/settings_internal.h b/src/settings_internal.h index ba5331288c..632d4081d9 100644 --- a/src/settings_internal.h +++ b/src/settings_internal.h @@ -300,6 +300,7 @@ struct NullSettingDesc : SettingDesc { typedef std::initializer_list> SettingTable; const SettingDesc *GetSettingFromName(const char *name); +void GetSettingSaveLoadByPrefix(const char *prefix, std::vector &saveloads); bool SetSettingValue(const IntSettingDesc *sd, int32 value, bool force_newgame = false); bool SetSettingValue(const StringSettingDesc *sd, const std::string value, bool force_newgame = false);