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