using System; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; namespace Ryujinx.Common.Memory { public ref struct SpanWriter { private Span _output; public readonly int Length => _output.Length; public SpanWriter(Span output) { _output = output; } public void Write(T value) where T : unmanaged { MemoryMarshal.Cast(_output)[0] = value; _output = _output[Unsafe.SizeOf()..]; } public void Write(ReadOnlySpan data) { data.CopyTo(_output[..data.Length]); _output = _output[data.Length..]; } public readonly void WriteAt(int offset, T value) where T : unmanaged { MemoryMarshal.Cast(_output[offset..])[0] = value; } public readonly void WriteAt(int offset, ReadOnlySpan data) { data.CopyTo(_output.Slice(offset, data.Length)); } public void Skip(int size) { _output = _output[size..]; } } }