using System; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; namespace Ryujinx.Common.Utilities { public static class SpanHelpers { [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Span CreateSpan(ref T reference, int length) { return MemoryMarshal.CreateSpan(ref reference, length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Span AsSpan(ref T reference) where T : unmanaged { return CreateSpan(ref reference, 1); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Span AsSpan(ref TStruct reference) where TStruct : unmanaged where TSpan : unmanaged { return CreateSpan(ref Unsafe.As(ref reference), Unsafe.SizeOf() / Unsafe.SizeOf()); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Span AsByteSpan(ref T reference) where T : unmanaged { return CreateSpan(ref Unsafe.As(ref reference), Unsafe.SizeOf()); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ReadOnlySpan CreateReadOnlySpan(ref T reference, int length) { return MemoryMarshal.CreateReadOnlySpan(ref reference, length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ReadOnlySpan AsReadOnlySpan(ref T reference) where T : unmanaged { return CreateReadOnlySpan(ref reference, 1); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ReadOnlySpan AsReadOnlySpan(ref TStruct reference) where TStruct : unmanaged where TSpan : unmanaged { return CreateReadOnlySpan(ref Unsafe.As(ref reference), Unsafe.SizeOf() / Unsafe.SizeOf()); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ReadOnlySpan AsReadOnlyByteSpan(ref T reference) where T : unmanaged { return CreateReadOnlySpan(ref Unsafe.As(ref reference), Unsafe.SizeOf()); } } }