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:
parent
92aae8d482
commit
77ce2e1980
117 changed files with 2000 additions and 1226 deletions
|
|
@ -788,7 +788,7 @@ namespace Server.Commands.Generic
|
|||
var result = Properties.GetValue(e.Mobile, obj, e.GetString(i));
|
||||
|
||||
if (result == "Property not found." || result == "Property is write only." ||
|
||||
result.StartsWith("Getting this property", StringComparison.Ordinal))
|
||||
result.StartsWithOrdinal("Getting this property"))
|
||||
{
|
||||
LogFailure(result);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ namespace Server.Commands.Generic
|
|||
{
|
||||
var offset = 0;
|
||||
|
||||
if (Insensitive.Equals(e.GetString(0), "view"))
|
||||
if (e.GetString(0).InsensitiveEquals("view"))
|
||||
{
|
||||
++offset;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ namespace Server.Commands.Generic
|
|||
throw new Exception("Invalid ordering syntax.");
|
||||
}
|
||||
|
||||
if (Insensitive.Equals(arguments[offset], "by"))
|
||||
if (arguments[offset].InsensitiveEquals("by"))
|
||||
{
|
||||
++offset;
|
||||
--size;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using Server.Buffers;
|
||||
|
||||
namespace Server.Commands.Generic
|
||||
{
|
||||
|
|
@ -185,7 +186,7 @@ namespace Server.Commands.Generic
|
|||
|
||||
// NOTE: this does not preserve the case where quotation marks are used on a single word
|
||||
|
||||
var sb = new StringBuilder();
|
||||
using var sb = new ValueStringBuilder(stackalloc char[64]);
|
||||
|
||||
for (var i = 0; i < args.Length; ++i)
|
||||
{
|
||||
|
|
@ -194,7 +195,7 @@ namespace Server.Commands.Generic
|
|||
sb.Append(' ');
|
||||
}
|
||||
|
||||
if (args[i].Contains(' ', StringComparison.Ordinal))
|
||||
if (args[i].ContainsOrdinal(' '))
|
||||
{
|
||||
sb.Append('"');
|
||||
sb.Append(args[i]);
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ namespace Server.Commands.Generic
|
|||
|
||||
for (var i = 0; i < args.Length; ++i)
|
||||
{
|
||||
if (Insensitive.Equals(args[i], "where"))
|
||||
if (args[i].InsensitiveEquals("where"))
|
||||
{
|
||||
var origArgs = args;
|
||||
|
||||
|
|
@ -111,9 +111,7 @@ namespace Server.Commands.Generic
|
|||
}
|
||||
|
||||
var conditions = new List<ICondition[]>();
|
||||
var current = new List<ICondition>();
|
||||
|
||||
current.Add(TypeCondition.Default);
|
||||
var current = new List<ICondition> { TypeCondition.Default };
|
||||
|
||||
var index = 1;
|
||||
|
||||
|
|
@ -123,7 +121,7 @@ namespace Server.Commands.Generic
|
|||
|
||||
var inverse = false;
|
||||
|
||||
if (Insensitive.Equals(cur, "not") || cur == "!")
|
||||
if (cur.InsensitiveEquals("not") || cur == "!")
|
||||
{
|
||||
inverse = true;
|
||||
++index;
|
||||
|
|
@ -133,7 +131,7 @@ namespace Server.Commands.Generic
|
|||
throw new Exception("Improperly formatted object conditional.");
|
||||
}
|
||||
}
|
||||
else if (Insensitive.Equals(cur, "or") || cur == "||")
|
||||
else if (cur.InsensitiveEquals("or") || cur == "||")
|
||||
{
|
||||
if (current.Count > 1)
|
||||
{
|
||||
|
|
@ -199,7 +197,7 @@ namespace Server.Commands.Generic
|
|||
"contains" => new StringCondition(prop, inverse, StringOperator.Contains, val, false),
|
||||
"contains~" => new StringCondition(prop, inverse, StringOperator.Contains, val, true),
|
||||
"~contains" => new StringCondition(prop, inverse, StringOperator.Contains, val, true),
|
||||
_ => null
|
||||
_ => null
|
||||
};
|
||||
|
||||
if (condition == null)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue