59 lines
1.1 KiB
C#
59 lines
1.1 KiB
C#
namespace SoulstormReplayReader.Core.Utils;
|
|
|
|
public ref struct SpanReader
|
|
{
|
|
public Span<byte> bytes;
|
|
public int offset = 0;
|
|
|
|
public SpanReader(Span<byte> bytes)
|
|
{
|
|
this.bytes = bytes;
|
|
}
|
|
|
|
public SpanReader SliceToOffset()
|
|
{
|
|
bytes = bytes[offset..];
|
|
offset = 0;
|
|
return this;
|
|
}
|
|
|
|
public SpanReader Skip(uint count)
|
|
{
|
|
offset += (int)count;
|
|
return this;
|
|
}
|
|
|
|
public byte ReadByte()
|
|
{
|
|
var value = bytes[offset];
|
|
offset++;
|
|
return value;
|
|
}
|
|
|
|
public short ReadInt16()
|
|
{
|
|
var value = BitConverter.ToInt16(bytes[offset..]);
|
|
offset += sizeof(short);
|
|
return value;
|
|
}
|
|
|
|
public int ReadInt32()
|
|
{
|
|
var value = BitConverter.ToInt32(bytes[offset..]);
|
|
offset += sizeof(int);
|
|
return value;
|
|
}
|
|
|
|
public long ReadInt64()
|
|
{
|
|
var value = BitConverter.ToInt64(bytes[offset..]);
|
|
offset += sizeof(long);
|
|
return value;
|
|
}
|
|
|
|
public readonly void RequireInRange()
|
|
{
|
|
if (offset >= bytes.Length)
|
|
throw new ArgumentOutOfRangeException(nameof(offset));
|
|
}
|
|
} |