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/BitArray.cs | 103 +++++++++++++++++++++++++++
1 file changed, 103 insertions(+)
create mode 100644 src/Ryujinx.Audio/Renderer/Utils/BitArray.cs
(limited to 'src/Ryujinx.Audio/Renderer/Utils/BitArray.cs')
diff --git a/src/Ryujinx.Audio/Renderer/Utils/BitArray.cs b/src/Ryujinx.Audio/Renderer/Utils/BitArray.cs
new file mode 100644
index 00000000..8b105477
--- /dev/null
+++ b/src/Ryujinx.Audio/Renderer/Utils/BitArray.cs
@@ -0,0 +1,103 @@
+using System;
+using System.Runtime.CompilerServices;
+
+namespace Ryujinx.Audio.Renderer.Utils
+{
+ ///
+ /// A simple bit array implementation backed by a .
+ ///
+ public class BitArray
+ {
+ ///
+ /// The backing storage of the .
+ ///
+ private Memory _storage;
+
+ ///
+ /// Create a new from .
+ ///
+ /// The backing storage of the .
+ public BitArray(Memory storage)
+ {
+ _storage = storage;
+ }
+
+ ///
+ /// Get the byte position of a given bit index.
+ ///
+ /// A bit index.
+ /// The byte position of a given bit index.
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ private static int ToPosition(int index) => index / 8;
+
+ ///
+ /// Get the bit position of a given bit index inside a byte.
+ ///
+ /// A bit index.
+ /// The bit position of a given bit index inside a byte.
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ private static int ToBitPosition(int index) => index % 8;
+
+ ///
+ /// Test if the bit at the given index is set.
+ ///
+ /// A bit index.
+ /// Return true if the bit at the given index is set
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public bool Test(int index)
+ {
+ ulong mask = 1ul << ToBitPosition(index);
+
+ return (_storage.Span[ToPosition(index)] & mask) == mask;
+ }
+
+ ///
+ /// Set the bit at the given index.
+ ///
+ /// A bit index.
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public void Set(int index)
+ {
+ Set(index, true);
+ }
+
+ ///
+ /// Reset the bit at the given index.
+ ///
+ /// A bit index.
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public void Reset(int index)
+ {
+ Set(index, false);
+ }
+
+ ///
+ /// Set a bit value at the given index.
+ ///
+ /// A bit index.
+ /// The new bit value.
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ private void Set(int index, bool value)
+ {
+ byte mask = (byte)(1 << ToBitPosition(index));
+
+ if (value)
+ {
+ _storage.Span[ToPosition(index)] |= mask;
+ }
+ else
+ {
+ _storage.Span[ToPosition(index)] &= (byte)~mask;
+ }
+ }
+
+ ///
+ /// Reset all bits in the storage.
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public void Reset()
+ {
+ _storage.Span.Fill(0);
+ }
+ }
+}
\ No newline at end of file
--
cgit v1.2.3