mirror of
https://git.743378673.xyz/MeloNX/MeloNX.git
synced 2025-08-02 03:47:09 +02:00
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
This commit is contained in:
parent
80f2a9e748
commit
dbe1a2d09e
44 changed files with 4630 additions and 4 deletions
73
src/Ryujinx.Horizon/Sdk/Ngc/Detail/Set.cs
Normal file
73
src/Ryujinx.Horizon/Sdk/Ngc/Detail/Set.cs
Normal file
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue