📄 src/Internal/SpanReader.cs
using System.Buffers.Binary;

namespace SharpDlt.Internal;

/// <summary>Endian aware primitive readers used by the DLT payload parser.</summary>
internal static class SpanReader
{
    public static ushort ReadUInt16(ReadOnlySpan<byte> data, bool msbFirst) =>
        msbFirst ? BinaryPrimitives.ReadUInt16BigEndian(data) : BinaryPrimitives.ReadUInt16LittleEndian(data);

    public static uint ReadUInt32(ReadOnlySpan<byte> data, bool msbFirst) =>
        msbFirst ? BinaryPrimitives.ReadUInt32BigEndian(data) : BinaryPrimitives.ReadUInt32LittleEndian(data);

    public static ulong ReadUInt64(ReadOnlySpan<byte> data, bool msbFirst) =>
        msbFirst ? BinaryPrimitives.ReadUInt64BigEndian(data) : BinaryPrimitives.ReadUInt64LittleEndian(data);

    public static short ReadInt16(ReadOnlySpan<byte> data, bool msbFirst) =>
        msbFirst ? BinaryPrimitives.ReadInt16BigEndian(data) : BinaryPrimitives.ReadInt16LittleEndian(data);

    public static int ReadInt32(ReadOnlySpan<byte> data, bool msbFirst) =>
        msbFirst ? BinaryPrimitives.ReadInt32BigEndian(data) : BinaryPrimitives.ReadInt32LittleEndian(data);

    public static long ReadInt64(ReadOnlySpan<byte> data, bool msbFirst) =>
        msbFirst ? BinaryPrimitives.ReadInt64BigEndian(data) : BinaryPrimitives.ReadInt64LittleEndian(data);

    public static float ReadSingle(ReadOnlySpan<byte> data, bool msbFirst) =>
        msbFirst ? BinaryPrimitives.ReadSingleBigEndian(data) : BinaryPrimitives.ReadSingleLittleEndian(data);

    public static double ReadDouble(ReadOnlySpan<byte> data, bool msbFirst) =>
        msbFirst ? BinaryPrimitives.ReadDoubleBigEndian(data) : BinaryPrimitives.ReadDoubleLittleEndian(data);
}