diff options
Diffstat (limited to 'src/Ryujinx.Horizon/Sdk/Ngc/Detail/Set.cs')
| -rw-r--r-- | src/Ryujinx.Horizon/Sdk/Ngc/Detail/Set.cs | 73 |
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; + } + } +} |
