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.Common/Memory/SpanOrArray.cs | 89 ++++++++++++++++++++++++++++++++
1 file changed, 89 insertions(+)
create mode 100644 src/Ryujinx.Common/Memory/SpanOrArray.cs
(limited to 'src/Ryujinx.Common/Memory/SpanOrArray.cs')
diff --git a/src/Ryujinx.Common/Memory/SpanOrArray.cs b/src/Ryujinx.Common/Memory/SpanOrArray.cs
new file mode 100644
index 00000000..a9798d27
--- /dev/null
+++ b/src/Ryujinx.Common/Memory/SpanOrArray.cs
@@ -0,0 +1,89 @@
+using System;
+
+namespace Ryujinx.Common.Memory
+{
+ ///
+ /// A struct that can represent both a Span and Array.
+ /// This is useful to keep the Array representation when possible to avoid copies.
+ ///
+ /// Element Type
+ public readonly ref struct SpanOrArray where T : unmanaged
+ {
+ public readonly T[] Array;
+ public readonly ReadOnlySpan Span;
+
+ ///
+ /// Create a new SpanOrArray from an array.
+ ///
+ /// Array to store
+ public SpanOrArray(T[] array)
+ {
+ Array = array;
+ Span = ReadOnlySpan.Empty;
+ }
+
+ ///
+ /// Create a new SpanOrArray from a readonly span.
+ ///
+ /// Span to store
+ public SpanOrArray(ReadOnlySpan span)
+ {
+ Array = null;
+ Span = span;
+ }
+
+ ///
+ /// Return the contained array, or convert the span if necessary.
+ ///
+ /// An array containing the data
+ public T[] ToArray()
+ {
+ return Array ?? Span.ToArray();
+ }
+
+ ///
+ /// Return a ReadOnlySpan from either the array or ReadOnlySpan.
+ ///
+ /// A ReadOnlySpan containing the data
+ public ReadOnlySpan AsSpan()
+ {
+ return Array ?? Span;
+ }
+
+ ///
+ /// Cast an array to a SpanOrArray.
+ ///
+ /// Source array
+ public static implicit operator SpanOrArray(T[] array)
+ {
+ return new SpanOrArray(array);
+ }
+
+ ///
+ /// Cast a ReadOnlySpan to a SpanOrArray.
+ ///
+ /// Source ReadOnlySpan
+ public static implicit operator SpanOrArray(ReadOnlySpan span)
+ {
+ return new SpanOrArray(span);
+ }
+
+ ///
+ /// Cast a Span to a SpanOrArray.
+ ///
+ /// Source Span
+ public static implicit operator SpanOrArray(Span span)
+ {
+ return new SpanOrArray(span);
+ }
+
+ ///
+ /// Cast a SpanOrArray to a ReadOnlySpan
+ ///
+ /// Source SpanOrArray
+ public static implicit operator ReadOnlySpan(SpanOrArray spanOrArray)
+ {
+ return spanOrArray.AsSpan();
+ }
+ }
+}
--
cgit v1.2.3