java-topology/defects/pcsx2-0001/patch/pcsx2-0001-patch-reloadenabledlists-set.patch

61 lines
2.7 KiB
Diff

# UNDF: UNDF-2026-000000884
--- a/pcsx2/Patch.cpp
+++ b/pcsx2/Patch.cpp
@@ -583,6 +583,8 @@
void Patch::ReloadEnabledLists()
{
+ // Convert lookup targets to sets for O(1) membership testing instead of
+ // O(N) linear scans on std::vector, eliminating four O(N^2) loops below.
const std::vector<std::string> prev_enabled_cheats = std::move(s_enabled_cheats);
if (EmuConfig.EnableCheats && !Achievements::IsHardcoreModeActive())
s_enabled_cheats = Host::GetStringListSetting(CHEATS_CONFIG_SECTION, PATCH_ENABLE_CONFIG_KEY);
@@ -591,6 +593,10 @@
const std::vector<std::string> prev_enabled_patches = std::exchange(s_enabled_patches, Host::GetStringListSetting(PATCHES_CONFIG_SECTION, PATCH_ENABLE_CONFIG_KEY));
const std::vector<std::string> disabled_patches = Host::GetStringListSetting(PATCHES_CONFIG_SECTION, PATCH_DISABLE_CONFIG_KEY);
+ const std::unordered_set<std::string> disabled_patches_set(disabled_patches.begin(), disabled_patches.end());
+ const std::unordered_set<std::string> prev_enabled_cheats_set(prev_enabled_cheats.begin(), prev_enabled_cheats.end());
+ const std::unordered_set<std::string> prev_enabled_patches_set(prev_enabled_patches.begin(), prev_enabled_patches.end());
+
// Name based matching for widescreen/NI settings.
if (EmuConfig.EnableWideScreenPatches)
@@ -612,7 +618,7 @@
for (auto it = s_enabled_patches.begin(); it != s_enabled_patches.end();)
{
- if (std::find(disabled_patches.begin(), disabled_patches.end(), *it) != disabled_patches.end())
+ if (disabled_patches_set.count(*it))
{
it = s_enabled_patches.erase(it);
}
@@ -626,13 +632,13 @@
s_just_enabled_patches.clear();
for (const auto& p : s_enabled_cheats)
{
- if (std::find(prev_enabled_cheats.begin(), prev_enabled_cheats.end(), p) == prev_enabled_cheats.end())
+ if (!prev_enabled_cheats_set.count(p))
{
s_just_enabled_cheats.emplace_back(p);
}
}
for (const auto& p : s_enabled_patches)
{
- if (std::find(prev_enabled_patches.begin(), prev_enabled_patches.end(), p) == prev_enabled_patches.end())
+ if (!prev_enabled_patches_set.count(p))
{
s_just_enabled_patches.emplace_back(p);
}
@@ -644,10 +650,11 @@
u32 Patch::EnablePatches(const std::vector<PatchGroup>* patches, const std::vector<std::string>& enable_list, const std::vector<std::string>* enable_immediately_list)
{
+ const std::unordered_set<std::string> enable_set(enable_list.begin(), enable_list.end());
u32 count = 0;
for (const PatchGroup& p : *patches)
{
// For compatibility, we auto enable anything that's not labelled.
// Also for gamedb patches.
- if (!p.name.empty() && std::find(enable_list.begin(), enable_list.end(), p.name) == enable_list.end())
+ if (!p.name.empty() && !enable_set.count(p.name))
continue;