aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Horizon/Sdk/Ngc/Detail/Set.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Horizon/Sdk/Ngc/Detail/Set.cs')
-rw-r--r--src/Ryujinx.Horizon/Sdk/Ngc/Detail/Set.cs73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/Ryujinx.Horizon/Sdk/Ngc/Detail/Set.cs b/src/Ryujinx.Horizon/Sdk/Ngc/Detail/Set.cs
new file mode 100644
index 00000000..559b7851
--- /dev/null
+++ b/src/Ryujinx.Horizon/Sdk/Ngc/Detail/Set.cs
@@ -0,0 +1,73 @@
+namespace Ryujinx.Horizon.Sdk.Ngc.Detail
+{
+ class Set
+ {
+ public const int BitsPerWord = 32;
+
+ private readonly BitVector32 _bitVector;
+ private readonly SbvRank _sbvRank;
+
+ public BitVector32 BitVector => _bitVector;
+ public SbvRank SbvRank => _sbvRank;
+
+ public Set()
+ {
+ _bitVector = new();
+ _sbvRank = new();
+ }
+
+ public Set(int length)
+ {
+ _bitVector = new(length);
+ _sbvRank = new();
+ }
+
+ public void Build()
+ {
+ _sbvRank.Build(_bitVector.Array, _bitVector.BitLength);
+ }
+
+ public bool Import(ref BinaryReader reader)
+ {
+ return _bitVector.Import(ref reader) && _sbvRank.Import(ref reader, _bitVector.BitLength);
+ }
+
+ public bool Has(int index)
+ {
+ return _bitVector.Has(index);
+ }
+
+ public bool TurnOn(int index, int count)
+ {
+ return _bitVector.TurnOn(index, count);
+ }
+
+ public bool TurnOn(int index)
+ {
+ return _bitVector.TurnOn(index);
+ }
+
+ public int Rank1(int index)
+ {
+ if ((uint)index >= (uint)_bitVector.BitLength)
+ {
+ index = _bitVector.BitLength - 1;
+ }
+
+ return _sbvRank.CalcRank1(index, _bitVector.Array);
+ }
+
+ public int Select0(int index)
+ {
+ int length = _bitVector.BitLength;
+ int rankIndex = _sbvRank.CalcRank1(length - 1, _bitVector.Array);
+
+ if ((uint)index < (uint)(length - rankIndex))
+ {
+ return _sbvRank.CalcSelect0(index, length, _bitVector.Array);
+ }
+
+ return -1;
+ }
+ }
+}