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