From 795055076c5aedd621bc249a598e4cbf67e552d9 Mon Sep 17 00:00:00 2001 From: YoshiRulz Date: Thu, 31 Jul 2025 00:26:29 +1000 Subject: [PATCH] Fix memoisation in `FilesystemFilterSet` fixes 1232157cc, 0743a1f8e --- .../FilesystemFilterSet.cs | 40 ++++++++++--------- src/BizHawk.Client.Common/RomLoader.cs | 6 +-- .../movie/import/MovieImport.cs | 8 ++-- src/BizHawk.Client.EmuHawk/MainForm.Events.cs | 14 +++---- .../MainForm.VSystem.cs | 14 +++---- src/BizHawk.Client.EmuHawk/MainForm.cs | 14 +++---- .../config/DisplayConfig.cs | 7 ++-- .../tools/NES/NESMusicRipper.cs | 7 ++-- 8 files changed, 51 insertions(+), 59 deletions(-) diff --git a/src/BizHawk.Client.Common/FilesystemFilterSet.cs b/src/BizHawk.Client.Common/FilesystemFilterSet.cs index 09bb9b4898..899abd295c 100644 --- a/src/BizHawk.Client.Common/FilesystemFilterSet.cs +++ b/src/BizHawk.Client.Common/FilesystemFilterSet.cs @@ -5,33 +5,37 @@ using System.Linq; namespace BizHawk.Client.Common { - public sealed class FilesystemFilterSet + public sealed class FilesystemFilterSet( + string? combinedEntryDesc, + bool appendAllFilesEntry, + params FilesystemFilter[] filters) { - private string? _ser = null; + private const bool DEFAULT_USE_ALL_FILES_ENTRY = true; - public bool AppendAllFilesEntry { get; set; } = true; + private readonly Lazy _ser = new(() => + { + var entries = filters.Select(static filter => filter.ToString()).ToList(); + if (combinedEntryDesc is not null) entries.Insert(0, FilesystemFilter.SerializeEntry( + combinedEntryDesc, + filters.SelectMany(static filter => filter.Extensions).Distinct().Order().ToList())); + if (appendAllFilesEntry) entries.Add(FilesystemFilter.AllFilesEntry); + return string.Join("|", entries); + }); - public string? CombinedEntryDesc { get; set; } = null; + public IReadOnlyList Filters + => filters; - private IReadOnlyCollection CombinedExts - => Filters.SelectMany(static filter => filter.Extensions).Distinct().Order().ToList(); + public FilesystemFilterSet(string combinedEntryDesc, params FilesystemFilter[] filters) + : this(combinedEntryDesc, appendAllFilesEntry: DEFAULT_USE_ALL_FILES_ENTRY, filters) {} - public readonly IReadOnlyList Filters; + public FilesystemFilterSet(bool appendAllFilesEntry, params FilesystemFilter[] filters) + : this(combinedEntryDesc: null, appendAllFilesEntry: appendAllFilesEntry, filters) {} public FilesystemFilterSet(params FilesystemFilter[] filters) - => Filters = filters; + : this(appendAllFilesEntry: DEFAULT_USE_ALL_FILES_ENTRY, filters) {} public override string ToString() - { - if (_ser is null) - { - var entries = Filters.Select(static filter => filter.ToString()).ToList(); - if (CombinedEntryDesc is not null) entries.Insert(0, FilesystemFilter.SerializeEntry(CombinedEntryDesc, CombinedExts)); - if (AppendAllFilesEntry) entries.Add(FilesystemFilter.AllFilesEntry); - _ser = string.Join("|", entries); - } - return _ser; - } + => _ser.Value; public static readonly FilesystemFilterSet Palettes = new(new FilesystemFilter("Palette Files", new[] { "pal" })); diff --git a/src/BizHawk.Client.Common/RomLoader.cs b/src/BizHawk.Client.Common/RomLoader.cs index 2bf8e238a9..ccb14d42ea 100644 --- a/src/BizHawk.Client.Common/RomLoader.cs +++ b/src/BizHawk.Client.Common/RomLoader.cs @@ -1124,6 +1124,7 @@ namespace BizHawk.Client.Common /// TODO add and handle (you can drag-and-drop scripts and there are already non-rom things in this list, so why not?) public static readonly FilesystemFilterSet RomFilter = new( + combinedEntryDesc: "Everything", FilesystemFilter.Archives, new FilesystemFilter("Disc Images", FilesystemFilter.DiscExtensions), new FilesystemFilter("Rom Bundles", new[] { "xml" }), @@ -1165,10 +1166,7 @@ namespace BizHawk.Client.Common new FilesystemFilter(/*VSystemID.Raw.WSWAN*/"WonderSwan", RomFileExtensions.WSWAN, addArchiveExts: true), new FilesystemFilter(/*VSystemID.Raw.ZXSpectrum*/"Sinclair ZX Spectrum", RomFileExtensions.ZXSpectrum.Concat(new[] { "csw", "wav" }).ToList(), addArchiveExts: true), new FilesystemFilter("Music Files", Array.Empty(), devBuildExtraExts: new[] { "psf", "minipsf", "sid", "nsf", "gbs" }), - FilesystemFilter.EmuHawkSaveStates) - { - CombinedEntryDesc = "Everything", - }; + FilesystemFilter.EmuHawkSaveStates); public static readonly IReadOnlyCollection KnownRomExtensions = RomFilter.Filters .SelectMany(f => f.Extensions) diff --git a/src/BizHawk.Client.Common/movie/import/MovieImport.cs b/src/BizHawk.Client.Common/movie/import/MovieImport.cs index e291575947..05076528e0 100644 --- a/src/BizHawk.Client.Common/movie/import/MovieImport.cs +++ b/src/BizHawk.Client.Common/movie/import/MovieImport.cs @@ -22,12 +22,10 @@ namespace BizHawk.Client.Common => Importers.Any(kvp => kvp.Value.Extension.EqualsIgnoreCase(extension)); public static readonly FilesystemFilterSet AvailableImporters = new FilesystemFilterSet( - Importers.Values.OrderBy(attr => attr.Emulator) + combinedEntryDesc: "Movie Files", + filters: Importers.Values.OrderBy(static attr => attr.Emulator) .Select(attr => new FilesystemFilter(attr.Emulator, new[] { attr.Extension.Substring(1) })) // substring removes initial '.' - .ToArray()) - { - CombinedEntryDesc = "Movie Files", - }; + .ToArray()); // Attempt to import another type of movie file into a movie object. public static ImportResult ImportFile( diff --git a/src/BizHawk.Client.EmuHawk/MainForm.Events.cs b/src/BizHawk.Client.EmuHawk/MainForm.Events.cs index 357d804218..b9298a23ef 100644 --- a/src/BizHawk.Client.EmuHawk/MainForm.Events.cs +++ b/src/BizHawk.Client.EmuHawk/MainForm.Events.cs @@ -18,15 +18,13 @@ namespace BizHawk.Client.EmuHawk { public partial class MainForm { - private static readonly FilesystemFilterSet MAMERomsFSFilterSet = new(new FilesystemFilter("MAME Arcade ROMs", new[] { "zip" })) - { - AppendAllFilesEntry = false, - }; + private static readonly FilesystemFilterSet MAMERomsFSFilterSet = new( + appendAllFilesEntry: false, + new FilesystemFilter("MAME Arcade ROMs", extensions: [ "zip" ])); - private static readonly FilesystemFilterSet ScreenshotsFSFilterSet = new(FilesystemFilter.PNGs) - { - AppendAllFilesEntry = false, - }; + private static readonly FilesystemFilterSet ScreenshotsFSFilterSet = new( + appendAllFilesEntry: false, + FilesystemFilter.PNGs); private void FileSubMenu_DropDownOpened(object sender, EventArgs e) { diff --git a/src/BizHawk.Client.EmuHawk/MainForm.VSystem.cs b/src/BizHawk.Client.EmuHawk/MainForm.VSystem.cs index 73499821f3..f943093e02 100644 --- a/src/BizHawk.Client.EmuHawk/MainForm.VSystem.cs +++ b/src/BizHawk.Client.EmuHawk/MainForm.VSystem.cs @@ -981,15 +981,13 @@ namespace BizHawk.Client.EmuHawk if (result.IsOk()) AddOnScreenMessage("Palette settings saved"); } - private static readonly FilesystemFilterSet DOSBoxHDDImageFilterSet = new(new FilesystemFilter("DOSBox HDD Images", new[] { "hdd" })) - { - AppendAllFilesEntry = false, - }; + private static readonly FilesystemFilterSet DOSBoxHDDImageFilterSet = new( + appendAllFilesEntry: false, + new FilesystemFilter("DOSBox HDD Images", extensions: [ "hdd" ])); - private static readonly FilesystemFilterSet ZXStateFilesFSFilterSet = new(new FilesystemFilter("ZX-State files", new[] { "szx" })) - { - AppendAllFilesEntry = false, - }; + private static readonly FilesystemFilterSet ZXStateFilesFSFilterSet = new( + appendAllFilesEntry: false, + new FilesystemFilter("ZX-State files", extensions: [ "szx" ])); private DialogResult OpenZXHawkSyncSettingsDialog(ISettingsAdapter settable) { diff --git a/src/BizHawk.Client.EmuHawk/MainForm.cs b/src/BizHawk.Client.EmuHawk/MainForm.cs index 6a8555ef85..1db122b8cb 100644 --- a/src/BizHawk.Client.EmuHawk/MainForm.cs +++ b/src/BizHawk.Client.EmuHawk/MainForm.cs @@ -47,10 +47,9 @@ namespace BizHawk.Client.EmuHawk { private static readonly FilesystemFilterSet EmuHawkSaveStatesFSFilterSet = new(FilesystemFilter.EmuHawkSaveStates); - private static readonly FilesystemFilterSet LibretroCoresFSFilterSet = new(new FilesystemFilter("Libretro Cores", new[] { OSTailoredCode.IsUnixHost ? "so" : "dll" })) - { - AppendAllFilesEntry = false, - }; + private static readonly FilesystemFilterSet LibretroCoresFSFilterSet = new( + appendAllFilesEntry: false, + new FilesystemFilter("Libretro Cores", extensions: [ (OSTailoredCode.IsUnixHost ? "so" : "dll") ])); private const int WINDOW_SCALE_MAX = 10; @@ -2497,10 +2496,9 @@ namespace BizHawk.Client.EmuHawk new object/*?*/[] { c }, CultureInfo.InvariantCulture); - public static readonly FilesystemFilterSet ConfigFileFSFilterSet = new(new FilesystemFilter("Config File", new[] { "ini" })) - { - AppendAllFilesEntry = false, - }; + public static readonly FilesystemFilterSet ConfigFileFSFilterSet = new( + appendAllFilesEntry: false, + new FilesystemFilter("Config File", extensions: [ "ini" ])); private void OpenRom() { diff --git a/src/BizHawk.Client.EmuHawk/config/DisplayConfig.cs b/src/BizHawk.Client.EmuHawk/config/DisplayConfig.cs index 8c244c89d6..ef035aeb00 100755 --- a/src/BizHawk.Client.EmuHawk/config/DisplayConfig.cs +++ b/src/BizHawk.Client.EmuHawk/config/DisplayConfig.cs @@ -11,10 +11,9 @@ namespace BizHawk.Client.EmuHawk { public partial class DisplayConfig : Form, IDialogParent { - private static readonly FilesystemFilterSet CgShaderPresetsFSFilterSet = new(new FilesystemFilter(".CGP Files", [ "cgp", "glslp" ])) - { - AppendAllFilesEntry = false, - }; + private static readonly FilesystemFilterSet CgShaderPresetsFSFilterSet = new( + appendAllFilesEntry: false, + new FilesystemFilter(".CGP Files", extensions: [ "cgp", "glslp" ])); private readonly Config _config; diff --git a/src/BizHawk.Client.EmuHawk/tools/NES/NESMusicRipper.cs b/src/BizHawk.Client.EmuHawk/tools/NES/NESMusicRipper.cs index ed1014fef1..a9488cc7f4 100644 --- a/src/BizHawk.Client.EmuHawk/tools/NES/NESMusicRipper.cs +++ b/src/BizHawk.Client.EmuHawk/tools/NES/NESMusicRipper.cs @@ -16,10 +16,9 @@ namespace BizHawk.Client.EmuHawk { public partial class NESMusicRipper : ToolFormBase, IToolFormAutoConfig { - private static readonly FilesystemFilterSet RenoiseFilesFSFilterSet = new(new FilesystemFilter("Renoise Song Files", new[] { "xrns" })) - { - AppendAllFilesEntry = false, - }; + private static readonly FilesystemFilterSet RenoiseFilesFSFilterSet = new( + appendAllFilesEntry: false, + new FilesystemFilter("Renoise Song Files", extensions: [ "xrns" ])); public static Icon ToolIcon => Properties.Resources.NesControllerIcon;