fix(core): Optimizes strings / .NET 5 compatibility changes (#354)

- [X] Removes some string allocations (e.g. split)
- [X] Optimizes some collections
- [X] Converts insensitive to extension methods of built-ins.
- [X] Adds ordinal (case sensitive) string helpers
- [X] Fixes conditionals for in-game commands so they use Ordinal comparisons.
- [X] Replaces ToLower.Contains with InsensitiveContains
- [X] Adds ValueStringBuilder
- [X] Implements ValueStringBuilder in a few places where it makes sense
- [X] Removes the redundant Wrap function and replaces it with an optimized version
- [X] Fixes list conversions in Utility

Closes #351

Bumps release version
This commit is contained in:
Kamron Batman 2020-12-20 23:21:55 -08:00 • committed by GitHub
parent 92aae8d482
commit 77ce2e1980
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
117 changed files with 2000 additions and 1226 deletions

View file

@ -148,7 +148,7 @@ namespace Server.Commands.Generic
{
var style = NumberStyles.Integer;
if (Insensitive.StartsWith(toParse, "0x"))
if (toParse.InsensitiveStartsWith("0x"))
{
style = NumberStyles.HexNumber;
toParse = toParse.Substring(2);
@ -231,7 +231,6 @@ namespace Server.Commands.Generic
NotEqual,
Contains,
StartsWith,
EndsWith
}
@ -260,39 +259,74 @@ namespace Server.Commands.Generic
{
var inverse = false;
Type type = m_IgnoreCase ? typeof(InsensitiveStringHelpers) : typeof(OrdinalStringHelpers);
string methodName;
switch (m_Operator)
{
case StringOperator.Equal:
methodName = "Equals";
break;
case StringOperator.NotEqual:
methodName = "Equals";
inverse = true;
break;
{
inverse = true;
goto case StringOperator.Equal;
}
case StringOperator.Equal:
{
if (m_IgnoreCase)
{
methodName = "InsensitiveEquals";
}
else
{
methodName = "EqualsOrdinal";
}
break;
}
case StringOperator.Contains:
methodName = "Contains";
break;
{
if (m_IgnoreCase)
{
methodName = "InsensitiveContains";
}
else
{
methodName = "ContainsOrdinal";
}
break;
}
case StringOperator.StartsWith:
methodName = "StartsWith";
break;
{
if (m_IgnoreCase)
{
methodName = "InsensitiveStartsWith";
}
else
{
methodName = "StartsWithOrdinal";
}
break;
}
case StringOperator.EndsWith:
methodName = "EndsWith";
break;
{
if (m_IgnoreCase)
{
methodName = "InsensitiveEndsWith";
}
else
{
methodName = "EndsWithOrdinal";
}
break;
}
default:
throw new InvalidOperationException("Invalid string comparison operator.");
}
if (m_IgnoreCase || methodName == "Equals")
if (m_Operator == StringOperator.Equal || m_Operator == StringOperator.NotEqual)
{
var type = m_IgnoreCase ? typeof(Insensitive) : typeof(string);
emitter.BeginCall(
type.GetMethod(
methodName,
@ -334,7 +368,7 @@ namespace Server.Commands.Generic
emitter.LoadLocal(temp);
emitter.BeginCall(
typeof(string).GetMethod(
type.GetMethod(
methodName,
BindingFlags.Public | BindingFlags.Instance,
null,