From cee712105850ac3385cd0091a923438167433f9f Mon Sep 17 00:00:00 2001
From: TSR Berry <20988865+TSRBerry@users.noreply.github.com>
Date: Sat, 8 Apr 2023 01:22:00 +0200
Subject: Move solution and projects to src
---
src/Ryujinx.Audio/Renderer/Utils/SpanIOHelper.cs | 171 +++++++++++++++++++++++
1 file changed, 171 insertions(+)
create mode 100644 src/Ryujinx.Audio/Renderer/Utils/SpanIOHelper.cs
(limited to 'src/Ryujinx.Audio/Renderer/Utils/SpanIOHelper.cs')
diff --git a/src/Ryujinx.Audio/Renderer/Utils/SpanIOHelper.cs b/src/Ryujinx.Audio/Renderer/Utils/SpanIOHelper.cs
new file mode 100644
index 00000000..103fb6a0
--- /dev/null
+++ b/src/Ryujinx.Audio/Renderer/Utils/SpanIOHelper.cs
@@ -0,0 +1,171 @@
+using System;
+using System.Diagnostics;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+namespace Ryujinx.Audio.Renderer.Utils
+{
+ ///
+ /// Helper for IO operations on and .
+ ///
+ public static class SpanIOHelper
+ {
+ ///
+ /// Write the given data to the given backing and move cursor after the written data.
+ ///
+ /// The data type.
+ /// The backing to store the data.
+ /// The data to write to the backing .
+ public static void Write(ref Memory backingMemory, ref T data) where T : unmanaged
+ {
+ int size = Unsafe.SizeOf();
+
+ if (size > backingMemory.Length)
+ {
+ throw new ArgumentOutOfRangeException();
+ }
+
+ MemoryMarshal.Write(backingMemory.Span.Slice(0, size), ref data);
+
+ backingMemory = backingMemory.Slice(size);
+ }
+
+ ///
+ /// Write the given data to the given backing and move cursor after the written data.
+ ///
+ /// The data type.
+ /// The backing to store the data.
+ /// The data to write to the backing .
+ public static void Write(ref Span backingMemory, ref T data) where T : unmanaged
+ {
+ int size = Unsafe.SizeOf();
+
+ if (size > backingMemory.Length)
+ {
+ throw new ArgumentOutOfRangeException();
+ }
+
+ MemoryMarshal.Write(backingMemory.Slice(0, size), ref data);
+
+ backingMemory = backingMemory.Slice(size);
+ }
+
+ ///
+ /// Get a out of a and move cursor after T size.
+ ///
+ /// The data type.
+ /// The backing to get a from.
+ /// A from backing .
+ public static Span GetWriteRef(ref Memory backingMemory) where T : unmanaged
+ {
+ int size = Unsafe.SizeOf();
+
+ if (size > backingMemory.Length)
+ {
+ throw new ArgumentOutOfRangeException();
+ }
+
+ Span result = MemoryMarshal.Cast(backingMemory.Span.Slice(0, size));
+
+ backingMemory = backingMemory.Slice(size);
+
+ return result;
+ }
+
+ ///
+ /// Get a out of a backingMemory and move cursor after T size.
+ ///
+ /// The data type.
+ /// The backing to get a from.
+ /// A from backing .
+ public static Span GetWriteRef(ref Span backingMemory) where T : unmanaged
+ {
+ int size = Unsafe.SizeOf();
+
+ if (size > backingMemory.Length)
+ {
+ throw new ArgumentOutOfRangeException();
+ }
+
+ Span result = MemoryMarshal.Cast(backingMemory.Slice(0, size));
+
+ backingMemory = backingMemory.Slice(size);
+
+ return result;
+ }
+
+ ///
+ /// Read data from the given backing and move cursor after the read data.
+ ///
+ /// The data type.
+ /// The backing to read data from.
+ /// Return the read data.
+ public static T Read(ref ReadOnlyMemory backingMemory) where T : unmanaged
+ {
+ int size = Unsafe.SizeOf();
+
+ if (size > backingMemory.Length)
+ {
+ throw new ArgumentOutOfRangeException();
+ }
+
+ T result = MemoryMarshal.Read(backingMemory.Span.Slice(0, size));
+
+ backingMemory = backingMemory.Slice(size);
+
+ return result;
+ }
+
+ ///
+ /// Read data from the given backing and move cursor after the read data.
+ ///
+ /// The data type.
+ /// The backing to read data from.
+ /// Return the read data.
+ public static T Read(ref ReadOnlySpan backingMemory) where T : unmanaged
+ {
+ int size = Unsafe.SizeOf();
+
+ if (size > backingMemory.Length)
+ {
+ throw new ArgumentOutOfRangeException();
+ }
+
+ T result = MemoryMarshal.Read(backingMemory.Slice(0, size));
+
+ backingMemory = backingMemory.Slice(size);
+
+ return result;
+ }
+
+ ///
+ /// Extract a at the given index.
+ ///
+ /// The data type.
+ /// The to extract the data from.
+ /// The id in the provided memory.
+ /// The max allowed count. (for bound checking of the id in debug mode)
+ /// a at the given id.
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static Memory GetMemory(Memory memory, int id, uint count) where T : unmanaged
+ {
+ Debug.Assert(id >= 0 && id < count);
+
+ return memory.Slice(id, 1);
+ }
+
+ ///
+ /// Extract a ref T at the given index.
+ ///
+ /// The data type.
+ /// The to extract the data from.
+ /// The id in the provided memory.
+ /// The max allowed count. (for bound checking of the id in debug mode)
+ /// a ref T at the given id.
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static ref T GetFromMemory(Memory memory, int id, uint count) where T : unmanaged
+ {
+ return ref GetMemory(memory, id, count).Span[0];
+ }
+ }
+}
\ No newline at end of file
--
cgit v1.2.3