aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Horizon/Sdk/Ngc/Detail/BitVector32.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2023-09-27 14:21:26 -0300
committerGitHub <noreply@github.com>2023-09-27 19:21:26 +0200
commit01c2b8097c2d66839105470d82405a12d57d196f (patch)
tree466e1a04138bd14ba31a6a0738a46065b6033129 /src/Ryujinx.Horizon/Sdk/Ngc/Detail/BitVector32.cs
parent4bd2ca3f0de37c53b3ecc78789a0a8296668235a (diff)
Implement NGC service (#5681)
* Implement NGC service * Use raw byte arrays instead of string for _wordSeparators * Silence IDE0230 for _wordSeparators * Try to silence warning about _rangeValuesCount not being read on SparseSet * Make AcType enum private * Add abstract methods and one TODO that I forgot * PR feedback * More PR feedback * More PR feedback
Diffstat (limited to 'src/Ryujinx.Horizon/Sdk/Ngc/Detail/BitVector32.cs')
-rw-r--r--src/Ryujinx.Horizon/Sdk/Ngc/Detail/BitVector32.cs78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/Ryujinx.Horizon/Sdk/Ngc/Detail/BitVector32.cs b/src/Ryujinx.Horizon/Sdk/Ngc/Detail/BitVector32.cs
new file mode 100644
index 00000000..f5456201
--- /dev/null
+++ b/src/Ryujinx.Horizon/Sdk/Ngc/Detail/BitVector32.cs
@@ -0,0 +1,78 @@
+namespace Ryujinx.Horizon.Sdk.Ngc.Detail
+{
+ class BitVector32
+ {
+ private const int BitsPerWord = Set.BitsPerWord;
+
+ private int _bitLength;
+ private uint[] _array;
+
+ public int BitLength => _bitLength;
+ public uint[] Array => _array;
+
+ public BitVector32()
+ {
+ _bitLength = 0;
+ _array = null;
+ }
+
+ public BitVector32(int length)
+ {
+ _bitLength = length;
+ _array = new uint[(length + BitsPerWord - 1) / BitsPerWord];
+ }
+
+ public bool Has(int index)
+ {
+ if ((uint)index < (uint)_bitLength)
+ {
+ int wordIndex = index / BitsPerWord;
+ int wordBitOffset = index % BitsPerWord;
+
+ return ((_array[wordIndex] >> wordBitOffset) & 1u) != 0;
+ }
+
+ return false;
+ }
+
+ public bool TurnOn(int index, int count)
+ {
+ for (int bit = 0; bit < count; bit++)
+ {
+ if (!TurnOn(index + bit))
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ public bool TurnOn(int index)
+ {
+ if ((uint)index < (uint)_bitLength)
+ {
+ int wordIndex = index / BitsPerWord;
+ int wordBitOffset = index % BitsPerWord;
+
+ _array[wordIndex] |= 1u << wordBitOffset;
+
+ return true;
+ }
+
+ return false;
+ }
+
+ public bool Import(ref BinaryReader reader)
+ {
+ if (!reader.Read(out _bitLength))
+ {
+ return false;
+ }
+
+ int arrayLength = (_bitLength + BitsPerWord - 1) / BitsPerWord;
+
+ return reader.AllocateAndReadArray(ref _array, arrayLength) == arrayLength;
+ }
+ }
+}