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 }