~ruther/NosSmooth

df16102986626af92dedd0cd9ad214f201ce963a — František Boháček 2 years ago 5931dd4
feat(packets): make NullableWrapper a struct for less allocations
M Packets/NosSmooth.PacketSerializer.Abstractions/NullableWrapper.cs => Packets/NosSmooth.PacketSerializer.Abstractions/NullableWrapper.cs +1 -1
@@ 17,7 17,7 @@ namespace NosSmooth.PacketSerializer.Abstractions;
/// <param name="Value">The value.</param>
/// <typeparam name="T">The underlying type.</typeparam>
[SuppressMessage("StyleCop.CSharp.NamingRules", "SA1313:Parameter names should begin with lower-case letter", Justification = "Fix this, this should not happen.")]
public record NullableWrapper<T>(T? Value)
public record struct NullableWrapper<T>(T? Value)
{
    /// <summary>
    /// Unwrap the underlying value.

M Packets/NosSmooth.PacketSerializer/Converters/Common/NullableWrapperConverter.cs => Packets/NosSmooth.PacketSerializer/Converters/Common/NullableWrapperConverter.cs +7 -7
@@ 28,9 28,9 @@ public class NullableWrapperConverter<T> : BaseStringConverter<NullableWrapper<T
    }

    /// <inheritdoc />
    public override Result Serialize(NullableWrapper<T>? obj, PacketStringBuilder builder)
    public override Result Serialize(NullableWrapper<T> obj, PacketStringBuilder builder)
    {
        if (obj is null || obj.Value is null)
        if (obj.Value is null)
        {
            builder.Append("-1");
        }


@@ 49,29 49,29 @@ public class NullableWrapperConverter<T> : BaseStringConverter<NullableWrapper<T
    }

    /// <inheritdoc />
    public override Result<NullableWrapper<T>?> Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options)
    public override Result<NullableWrapper<T>> Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options)
    {
        var tokenResult = stringEnumerator.GetNextToken(out var packetToken, false);
        if (!tokenResult.IsSuccess)
        {
            return Result<NullableWrapper<T>?>.FromError(tokenResult);
            return Result<NullableWrapper<T>>.FromError(tokenResult);
        }

        if (packetToken.Token.Length == 2 && packetToken.Token.StartsWith("-1"))
        {
            return Result<NullableWrapper<T>?>.FromSuccess(new NullableWrapper<T>(default));
            return Result<NullableWrapper<T>>.FromSuccess(new NullableWrapper<T>(default));
        }

        var converterResult = _converterRepository.GetTypeConverter<T>();
        if (!converterResult.IsDefined(out var converter))
        {
            return Result<NullableWrapper<T>?>.FromError(converterResult);
            return Result<NullableWrapper<T>>.FromError(converterResult);
        }

        var deserializationResult = converter.Deserialize(ref stringEnumerator, new DeserializeOptions(true));
        if (!deserializationResult.IsDefined(out var deserialization))
        {
            return Result<NullableWrapper<T>?>.FromError(deserializationResult);
            return Result<NullableWrapper<T>>.FromError(deserializationResult);
        }

        return new NullableWrapper<T>(deserialization);

Do not follow this link