SpanHelpers.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. using System;
  2. using System.Runtime.CompilerServices;
  3. using System.Runtime.InteropServices;
  4. namespace Ryujinx.Common.Utilities
  5. {
  6. public static class SpanHelpers
  7. {
  8. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  9. public static Span<T> CreateSpan<T>(ref T reference, int length)
  10. {
  11. return MemoryMarshal.CreateSpan(ref reference, length);
  12. }
  13. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  14. public static Span<T> AsSpan<T>(ref T reference) where T : unmanaged
  15. {
  16. return CreateSpan(ref reference, 1);
  17. }
  18. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  19. public static Span<TSpan> AsSpan<TStruct, TSpan>(ref TStruct reference)
  20. where TStruct : unmanaged where TSpan : unmanaged
  21. {
  22. return CreateSpan(ref Unsafe.As<TStruct, TSpan>(ref reference),
  23. Unsafe.SizeOf<TStruct>() / Unsafe.SizeOf<TSpan>());
  24. }
  25. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  26. public static Span<byte> AsByteSpan<T>(ref T reference) where T : unmanaged
  27. {
  28. return CreateSpan(ref Unsafe.As<T, byte>(ref reference), Unsafe.SizeOf<T>());
  29. }
  30. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  31. public static ReadOnlySpan<T> CreateReadOnlySpan<T>(ref T reference, int length)
  32. {
  33. return MemoryMarshal.CreateReadOnlySpan(ref reference, length);
  34. }
  35. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  36. public static ReadOnlySpan<T> AsReadOnlySpan<T>(ref T reference) where T : unmanaged
  37. {
  38. return CreateReadOnlySpan(ref reference, 1);
  39. }
  40. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  41. public static ReadOnlySpan<TSpan> AsReadOnlySpan<TStruct, TSpan>(ref TStruct reference)
  42. where TStruct : unmanaged where TSpan : unmanaged
  43. {
  44. return CreateReadOnlySpan(ref Unsafe.As<TStruct, TSpan>(ref reference),
  45. Unsafe.SizeOf<TStruct>() / Unsafe.SizeOf<TSpan>());
  46. }
  47. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  48. public static ReadOnlySpan<byte> AsReadOnlyByteSpan<T>(ref T reference) where T : unmanaged
  49. {
  50. return CreateReadOnlySpan(ref Unsafe.As<T, byte>(ref reference), Unsafe.SizeOf<T>());
  51. }
  52. }
  53. }