diff --git a/src/BizHawk.Bizware.DirectX/IGL_SlimDX9.cs b/src/BizHawk.Bizware.DirectX/IGL_SlimDX9.cs index 3049536252..f82081d145 100644 --- a/src/BizHawk.Bizware.DirectX/IGL_SlimDX9.cs +++ b/src/BizHawk.Bizware.DirectX/IGL_SlimDX9.cs @@ -7,6 +7,7 @@ using System.Threading; using BizHawk.Bizware.BizwareGL; using BizHawk.Bizware.OpenTK3; using BizHawk.Common; +using BizHawk.Common.StringExtensions; using SlimDX.Direct3D9; @@ -448,8 +449,7 @@ namespace BizHawk.Bizware.DirectX string name = prefix + descr.Name; //uniforms done through the entry point signature have $ in their names which isn't helpful, so get rid of that - if (name.StartsWith("$")) - name = name.Substring(1); + name = name.RemovePrefix('$'); ui.Name = name; uw.Description = descr; diff --git a/src/BizHawk.Client.Common/DisplayManager/Filters/Retro.cs b/src/BizHawk.Client.Common/DisplayManager/Filters/Retro.cs index 7430d589b3..75a5ab8541 100644 --- a/src/BizHawk.Client.Common/DisplayManager/Filters/Retro.cs +++ b/src/BizHawk.Client.Common/DisplayManager/Filters/Retro.cs @@ -11,6 +11,7 @@ using BizHawk.Client.Common.FilterManager; using BizHawk.Bizware.BizwareGL; using BizHawk.Common; +using BizHawk.Common.StringExtensions; namespace BizHawk.Client.Common.Filters { @@ -126,8 +127,8 @@ namespace BizHawk.Client.Common.Filters foreach (var splitLine in content.Split('\n')) { var line = splitLine.Trim(); - if (line.StartsWith("#")) continue; //lines that are solely comments - if (line == "") continue; //empty line + if (line.Length is 0) continue; + if (line.StartsWith('#')) continue; // comments int eq = line.IndexOf('='); var key = line.Substring(0, eq).Trim(); var value = line.Substring(eq + 1).Trim(); diff --git a/src/BizHawk.Client.Common/OpenAdvanced.cs b/src/BizHawk.Client.Common/OpenAdvanced.cs index f68dd4a76d..394a100fd1 100644 --- a/src/BizHawk.Client.Common/OpenAdvanced.cs +++ b/src/BizHawk.Client.Common/OpenAdvanced.cs @@ -1,5 +1,8 @@ using System; using System.IO; + +using BizHawk.Common.StringExtensions; + using Newtonsoft.Json; //this file contains some cumbersome self-"serialization" in order to gain a modicum of control over what the serialized output looks like @@ -39,7 +42,7 @@ namespace BizHawk.Client.Common { public static IOpenAdvanced ParseWithLegacy(string text) { - return text.StartsWith("*") + return text.StartsWith('*') ? Deserialize(text.Substring(1)) : new OpenAdvanced_OpenRom { Path = text }; } diff --git a/src/BizHawk.Client.Common/config/PathEntryCollectionExtensions.cs b/src/BizHawk.Client.Common/config/PathEntryCollectionExtensions.cs index 81de98b526..0ed3dba0e9 100644 --- a/src/BizHawk.Client.Common/config/PathEntryCollectionExtensions.cs +++ b/src/BizHawk.Client.Common/config/PathEntryCollectionExtensions.cs @@ -2,6 +2,7 @@ using System.IO; using BizHawk.Common; using BizHawk.Common.PathExtensions; +using BizHawk.Common.StringExtensions; using BizHawk.Emulation.Common; namespace BizHawk.Client.Common @@ -316,10 +317,7 @@ namespace BizHawk.Client.Common private static string ResolveToolsPath(this PathEntryCollection collection, string subPath) { - if (Path.IsPathRooted(subPath) || subPath.StartsWith("%")) - { - return subPath; - } + if (Path.IsPathRooted(subPath) || subPath.StartsWith('%')) return subPath; var toolsPath = collection[PathEntryCollection.GLOBAL, "Tools"].Path; diff --git a/src/BizHawk.Client.Common/movie/BasicMovieInfo.cs b/src/BizHawk.Client.Common/movie/BasicMovieInfo.cs index 12ffd8f59e..0fef228bc5 100644 --- a/src/BizHawk.Client.Common/movie/BasicMovieInfo.cs +++ b/src/BizHawk.Client.Common/movie/BasicMovieInfo.cs @@ -2,6 +2,8 @@ using System.Collections.Generic; using System.Globalization; using System.IO; + +using BizHawk.Common.StringExtensions; using BizHawk.Emulation.Common; namespace BizHawk.Client.Common @@ -247,13 +249,7 @@ namespace BizHawk.Client.Common { // just skim through the input log and count input lines // FIXME: this is potentially expensive and shouldn't be necessary for something as simple as frame count - while (tr.ReadLine() is string line) - { - if (line.Length > 0 && line[0] == '|') - { - FrameCount++; - } - } + while (tr.ReadLine() is string line) if (line.StartsWith('|')) FrameCount++; }); } } diff --git a/src/BizHawk.Client.Common/movie/bk2/Bk2MnemonicLookup.cs b/src/BizHawk.Client.Common/movie/bk2/Bk2MnemonicLookup.cs index 14c3e410da..7f7ba3e03b 100644 --- a/src/BizHawk.Client.Common/movie/bk2/Bk2MnemonicLookup.cs +++ b/src/BizHawk.Client.Common/movie/bk2/Bk2MnemonicLookup.cs @@ -12,7 +12,7 @@ namespace BizHawk.Client.Common public static char Lookup(string button, string systemId) { var key = button.Replace("Key ", ""); - if (key.StartsWith("P")) + if (key.StartsWith('P')) { if (key.Length > 2 && key[1] == '1' && key[2] >= '0' && key[2] <= '9') // Hack to support 10-20 controllers, TODO: regex this thing instead { diff --git a/src/BizHawk.Client.Common/movie/bk2/Bk2Movie.InputLog.cs b/src/BizHawk.Client.Common/movie/bk2/Bk2Movie.InputLog.cs index 9ca7f73d37..d8c89c32f7 100644 --- a/src/BizHawk.Client.Common/movie/bk2/Bk2Movie.InputLog.cs +++ b/src/BizHawk.Client.Common/movie/bk2/Bk2Movie.InputLog.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.IO; using BizHawk.Common; +using BizHawk.Common.StringExtensions; namespace BizHawk.Client.Common { @@ -53,7 +54,7 @@ namespace BizHawk.Client.Common string line; while ((line = reader.ReadLine()) != null) { - if (line[0] == '|') + if (line.StartsWith('|')) { Log.Add(line); } @@ -117,7 +118,7 @@ namespace BizHawk.Client.Common string line; while ((line = reader.ReadLine()) != null) { - if (line[0] == '|') + if (line.StartsWith('|')) { newLog.Add(line); } diff --git a/src/BizHawk.Client.Common/movie/import/bkm/BkmHeader.cs b/src/BizHawk.Client.Common/movie/import/bkm/BkmHeader.cs index f82c4412a9..24e8a4945b 100644 --- a/src/BizHawk.Client.Common/movie/import/bkm/BkmHeader.cs +++ b/src/BizHawk.Client.Common/movie/import/bkm/BkmHeader.cs @@ -1,5 +1,7 @@ using System.Collections.Generic; +using BizHawk.Common.StringExtensions; + namespace BizHawk.Client.Common { internal class BkmHeader : Dictionary @@ -62,7 +64,7 @@ namespace BizHawk.Client.Common { Comments.Add(line.Substring(8, line.Length - 8)); } - else if (line[0] == '|') + else if (line.StartsWith('|')) { return false; } diff --git a/src/BizHawk.Client.Common/movie/import/bkm/BkmMovie.cs b/src/BizHawk.Client.Common/movie/import/bkm/BkmMovie.cs index 49c0cae048..b70c152c26 100644 --- a/src/BizHawk.Client.Common/movie/import/bkm/BkmMovie.cs +++ b/src/BizHawk.Client.Common/movie/import/bkm/BkmMovie.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; +using BizHawk.Common.StringExtensions; using BizHawk.Emulation.Common; namespace BizHawk.Client.Common @@ -63,7 +64,7 @@ namespace BizHawk.Client.Common else if (Header.ParseLineFromFile(line)) { } - else if (line.StartsWith("|")) + else if (line.StartsWith('|')) { _log.Add(line); } diff --git a/src/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs b/src/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs index 62eb5e0950..ee1dc396f3 100644 --- a/src/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs +++ b/src/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs @@ -1,6 +1,9 @@ using System; using System.IO; using System.Linq; + +using BizHawk.Common.StringExtensions; + using Newtonsoft.Json; namespace BizHawk.Client.Common @@ -124,7 +127,7 @@ namespace BizHawk.Client.Common break; } - if (line[0] == '|') + if (line.StartsWith('|')) { VerificationLog.Add(line); } diff --git a/src/BizHawk.Client.Common/movie/tasproj/TasMovie.cs b/src/BizHawk.Client.Common/movie/tasproj/TasMovie.cs index 4589351de0..8f591884ed 100644 --- a/src/BizHawk.Client.Common/movie/tasproj/TasMovie.cs +++ b/src/BizHawk.Client.Common/movie/tasproj/TasMovie.cs @@ -4,6 +4,8 @@ using System.ComponentModel; using System.Globalization; using System.IO; using System.Linq; + +using BizHawk.Common.StringExtensions; using BizHawk.Emulation.Common; namespace BizHawk.Client.Common @@ -226,7 +228,7 @@ namespace BizHawk.Client.Common string line; while ((line = reader.ReadLine()) != null) { - if (line[0] == '|') + if (line.StartsWith('|')) { newLog.Add(line); if (!timelineBranchFrame.HasValue && counter < Log.Count && line != Log[counter]) diff --git a/src/BizHawk.Client.EmuHawk/Extensions/ToolExtensions.cs b/src/BizHawk.Client.EmuHawk/Extensions/ToolExtensions.cs index eda8a0dddb..9a68609e8f 100644 --- a/src/BizHawk.Client.EmuHawk/Extensions/ToolExtensions.cs +++ b/src/BizHawk.Client.EmuHawk/Extensions/ToolExtensions.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Windows.Forms; using BizHawk.Common; +using BizHawk.Common.StringExtensions; using BizHawk.Emulation.Common; using BizHawk.Client.Common; @@ -40,7 +41,7 @@ namespace BizHawk.Client.EmuHawk.ToolExtensions //sentinel for newer format OpenAdvanced type code if (romLoading) { - if (filename.StartsWith("*")) + if (filename.StartsWith('*')) { var oa = OpenAdvancedSerializer.ParseWithLegacy(filename); caption = oa.DisplayName; diff --git a/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs b/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs index d39bfb6a7c..9f455c0c38 100644 --- a/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs +++ b/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs @@ -9,6 +9,7 @@ using BizHawk.Common.NumberExtensions; using BizHawk.Client.Common; using BizHawk.Common; using BizHawk.Common.CollectionExtensions; +using BizHawk.Common.StringExtensions; namespace BizHawk.Client.EmuHawk { @@ -1283,7 +1284,7 @@ namespace BizHawk.Client.EmuHawk int maxDigits = range.MaxDigits; int curDigits = _axisTypedValue.Length; string curMinus; - if (_axisTypedValue.StartsWith("-")) + if (_axisTypedValue.StartsWith('-')) { curDigits -= 1; curMinus = "-"; @@ -1323,7 +1324,7 @@ namespace BizHawk.Client.EmuHawk } else if (e.KeyCode == Keys.OemMinus || e.KeyCode == Keys.Subtract) { - _axisTypedValue = _axisTypedValue.StartsWith("-") + _axisTypedValue = _axisTypedValue.StartsWith('-') ? _axisTypedValue.Substring(1) : $"-{_axisTypedValue}"; } diff --git a/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs b/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs index 1c26c66469..94db383cd9 100644 --- a/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs +++ b/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs @@ -8,6 +8,7 @@ using BizHawk.Client.Common; using BizHawk.Client.EmuHawk.ToolExtensions; using BizHawk.Common; using BizHawk.Common.CollectionExtensions; +using BizHawk.Common.StringExtensions; using BizHawk.Emulation.Common; namespace BizHawk.Client.EmuHawk @@ -1258,7 +1259,7 @@ namespace BizHawk.Client.EmuHawk { int player; - if (column.Name.StartsWith("P") && column.Name.Length > 1 && char.IsNumber(column.Name, 1)) + if (column.Name.Length >= 2 && column.Name.StartsWith('P') && char.IsNumber(column.Name, 1)) { player = int.Parse(column.Name[1].ToString()); } diff --git a/src/BizHawk.Common/Extensions/StringExtensions.cs b/src/BizHawk.Common/Extensions/StringExtensions.cs index dbed3436d5..fdfdd9ccbb 100644 --- a/src/BizHawk.Common/Extensions/StringExtensions.cs +++ b/src/BizHawk.Common/Extensions/StringExtensions.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Runtime.CompilerServices; namespace BizHawk.Common.StringExtensions { @@ -31,7 +32,8 @@ namespace BizHawk.Common.StringExtensions /// with the first char removed, or /// if the first char of is not /// - public static string RemovePrefix(this string str, char prefix, string notFoundValue) => str.Length != 0 && str[0] == prefix ? str.Substring(1, str.Length - 1) : notFoundValue; + public static string RemovePrefix(this string str, char prefix, string notFoundValue) + => str.StartsWith(prefix) ? str.Substring(1) : notFoundValue; /// /// with the leading substring removed, or @@ -66,6 +68,14 @@ namespace BizHawk.Common.StringExtensions /// public static string RemoveSuffix(this string str, string suffix, string notFoundValue) => str.EndsWith(suffix) ? str.Substring(0, str.Length - suffix.Length) : notFoundValue; + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool StartsWith(this ReadOnlySpan str, char c) + => str.Length >= 1 && str[0] == c; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool StartsWith(this string str, char c) + => str.Length >= 1 && str[0] == c; + /// /// the substring of after the first occurrence of , or /// the original if not found diff --git a/src/BizHawk.Emulation.Common/Database/Database.cs b/src/BizHawk.Emulation.Common/Database/Database.cs index 5dbe97029c..55ede880b3 100644 --- a/src/BizHawk.Emulation.Common/Database/Database.cs +++ b/src/BizHawk.Emulation.Common/Database/Database.cs @@ -9,6 +9,7 @@ using System.Text; using System.Threading; using BizHawk.Common; +using BizHawk.Common.StringExtensions; namespace BizHawk.Emulation.Common { @@ -104,12 +105,9 @@ namespace BizHawk.Emulation.Common var line = reader.ReadLine() ?? ""; try { - if (line.StartsWith(";")) - { - continue; // comment - } + if (line.StartsWith(';')) continue; // comment - if (line.StartsWith("#")) + if (line.StartsWith('#')) { LoadDatabase_Escape(line, inUser: inUser, silent: silent); continue; diff --git a/src/BizHawk.Emulation.Cores/Consoles/Atari/jaguar/VirtualJaguar.IDebuggable.cs b/src/BizHawk.Emulation.Cores/Consoles/Atari/jaguar/VirtualJaguar.IDebuggable.cs index e7ab377025..663a169136 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Atari/jaguar/VirtualJaguar.IDebuggable.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Atari/jaguar/VirtualJaguar.IDebuggable.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; +using BizHawk.Common.StringExtensions; using BizHawk.Emulation.Common; namespace BizHawk.Emulation.Cores.Atari.Jaguar @@ -58,7 +59,7 @@ namespace BizHawk.Emulation.Cores.Atari.Jaguar { _core.SetRegister(gpu ? 146 : 147, value); } - else if (regName.StartsWith("R")) + else if (regName.StartsWith('R')) { var offset = gpu ? 18 : 82; var reg = int.Parse(regName.Remove(0, 1)); diff --git a/src/BizHawk.Emulation.DiscSystem/DiscFormats/CCD_format.cs b/src/BizHawk.Emulation.DiscSystem/DiscFormats/CCD_format.cs index e85dfd7946..dd578e34a1 100644 --- a/src/BizHawk.Emulation.DiscSystem/DiscFormats/CCD_format.cs +++ b/src/BizHawk.Emulation.DiscSystem/DiscFormats/CCD_format.cs @@ -4,6 +4,7 @@ using System.Globalization; using System.Collections.Generic; using System.Linq; using BizHawk.Common; +using BizHawk.Common.StringExtensions; //check out ccd2iso linux program? //https://wiki.archlinux.org/index.php/CD_Burning#TOC.2FCUE.2FBIN_for_mixed-mode_disks advice here @@ -189,7 +190,7 @@ namespace BizHawk.Emulation.DiscSystem var line = sr.ReadLine(); if (line is null) break; if (line == string.Empty) continue; - if (line.StartsWith("[")) + if (line.StartsWith('[')) { currSection = new() { diff --git a/src/BizHawk.Emulation.DiscSystem/DiscFormats/CUE/CUE_Parse.cs b/src/BizHawk.Emulation.DiscSystem/DiscFormats/CUE/CUE_Parse.cs index fc6ddb3fca..39cab23779 100644 --- a/src/BizHawk.Emulation.DiscSystem/DiscFormats/CUE/CUE_Parse.cs +++ b/src/BizHawk.Emulation.DiscSystem/DiscFormats/CUE/CUE_Parse.cs @@ -3,6 +3,8 @@ using System.Text.RegularExpressions; using System.IO; +using BizHawk.Common.StringExtensions; + //http://digitalx.org/cue-sheet/index.html "all cue sheet information is a straight 1:1 copy from the cdrwin helpfile" //http://www.gnu.org/software/libcdio/libcdio.html#Sectors //this is actually a great reference. they use LSN instead of LBA.. maybe a good idea for us @@ -155,9 +157,7 @@ namespace BizHawk.Emulation.DiscSystem.CUE } } - bool startsWithSemicolon = key.StartsWith(";"); - - if (startsWithSemicolon) + if (key.StartsWith(';')) { clp.EOF = true; OUT_CueFile.Commands.Add(new CUE_File.Command.COMMENT(line)); @@ -374,7 +374,7 @@ namespace BizHawk.Emulation.DiscSystem.CUE if (!clp.EOF) { var remainder = clp.ReadLine(); - if (remainder.TrimStart().StartsWith(";")) + if (remainder.TrimStart().StartsWith(';')) { //add a comment OUT_CueFile.Commands.Add(new CUE_File.Command.COMMENT(remainder)); diff --git a/src/BizHawk.Emulation.DiscSystem/DiscFormats/M3U_file.cs b/src/BizHawk.Emulation.DiscSystem/DiscFormats/M3U_file.cs index f10980b099..3c003a906c 100644 --- a/src/BizHawk.Emulation.DiscSystem/DiscFormats/M3U_file.cs +++ b/src/BizHawk.Emulation.DiscSystem/DiscFormats/M3U_file.cs @@ -1,6 +1,8 @@ using System.IO; using System.Collections.Generic; +using BizHawk.Common.StringExtensions; + namespace BizHawk.Emulation.DiscSystem { public class M3U_File @@ -21,7 +23,7 @@ namespace BizHawk.Emulation.DiscSystem var line = sr.ReadLine(); if (line == null) break; - if (line.StartsWith("#")) + if (line.StartsWith('#')) { if (line == "#EXTM3U") {