SpanReader.cs 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. using System;
  2. using System.Runtime.CompilerServices;
  3. using System.Runtime.InteropServices;
  4. namespace Ryujinx.Common.Memory
  5. {
  6. public ref struct SpanReader
  7. {
  8. private ReadOnlySpan<byte> _input;
  9. public int Length => _input.Length;
  10. public SpanReader(ReadOnlySpan<byte> input)
  11. {
  12. _input = input;
  13. }
  14. public T Read<T>() where T : unmanaged
  15. {
  16. T value = MemoryMarshal.Cast<byte, T>(_input)[0];
  17. _input = _input.Slice(Unsafe.SizeOf<T>());
  18. return value;
  19. }
  20. public ReadOnlySpan<byte> GetSpan(int size)
  21. {
  22. ReadOnlySpan<byte> data = _input.Slice(0, size);
  23. _input = _input.Slice(size);
  24. return data;
  25. }
  26. public T ReadAt<T>(int offset) where T : unmanaged
  27. {
  28. return MemoryMarshal.Cast<byte, T>(_input.Slice(offset))[0];
  29. }
  30. public ReadOnlySpan<byte> GetSpanAt(int offset, int size)
  31. {
  32. return _input.Slice(offset, size);
  33. }
  34. public void Skip(int size)
  35. {
  36. _input = _input.Slice(size);
  37. }
  38. }
  39. }