feat: Adds cliloc support and fixes valuestringbuilder ctor (#1013)

- [X] Adds cliloc support using the following API:
```cs
public static class Localization
{
    string GetText(int number);
    string GetText(int number, string lang);
    string Format(int number, params object[] args);
    string Format(int number, string lang, params object[] args);

    string Format(int number, $"{arg1}{arg2}{arg3}");
    string Format(int number, lang, $"{arg1}{arg2}{arg3}");

    bool TryGetLocalization(int number, out LocalizationEntry entry);
    bool TryGetLocalization(int number, string lang, out LocalizationEntry entry);
}

public class LocalizationEntry
{
    string Language { get; }
    string Number { get; }
    string Text { get; }
    string?[] TextSlices { get; } // Used for string building
    string StringFormatter { get; }

    string Format(params object[] args);
    string Format($"{arg1}{arg2}{arg3}");
}
```

- [X] Fixes a bug with ValueStringBuilder and default initialization size
- [X] Optimizes ValueStringBuilder to use `ISpanFormattable`
- [X] Adds `Append<T>(T value);` support ValueStringBuilder
- [X] Adds `Append($"");` string interpolation support to ValueStringBuider
This commit is contained in:
Kamron Batman 2022-05-08 21:24:32 -07:00 committed by GitHub
parent 790cb5d733
commit be7da3a3dc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 1046 additions and 156 deletions

View file

@ -1284,96 +1284,6 @@ namespace Server
return (value + mask) ^ mask;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static long Abs(this long value)
{
long mask = value >> 63;
return (value + mask) ^ mask;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int CountDigits(this uint value)
{
int digits = 1;
if (value >= 100000)
{
value /= 100000;
digits += 5;
}
if (value < 10)
{
// no-op
}
else if (value < 100)
{
digits++;
}
else if (value < 1000)
{
digits += 2;
}
else if (value < 10000)
{
digits += 3;
}
else
{
digits += 4;
}
return digits;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int CountDigits(this int value)
{
int absValue = Abs(value);
int digits = 1;
if (absValue >= 100000)
{
absValue /= 100000;
digits += 5;
}
if (absValue < 10)
{
// no-op
}
else if (absValue < 100)
{
digits++;
}
else if (absValue < 1000)
{
digits += 2;
}
else if (absValue < 10000)
{
digits += 3;
}
else
{
digits += 4;
}
if (value < 0)
{
digits += 1; // negative
}
return digits;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static uint DivRem(uint a, uint b, out uint result)
{
uint div = a / b;
result = a - div * b;
return div;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static string GetTimeStamp() => Core.Now.ToTimeStamp();