DragonECS-Unity/src/Internal/BitMask.cs

54 lines
1.3 KiB
C#
Raw Normal View History

2023-05-07 00:50:44 +08:00
using System;
using System.Runtime.CompilerServices;
2024-03-03 03:51:49 +08:00
namespace DCFApixels.DragonECS.Unity.Internal
2023-05-07 00:50:44 +08:00
{
internal class BitMask
{
private const int OFFSET = 5;
private const int MOD_MASK = 31;
private const int DATA_BITS = 32;
private int[] _data;
private int _size;
public BitMask(int size)
{
_data = Array.Empty<int>();
Resize(size);
}
public bool this[int index]
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2024-03-03 03:51:49 +08:00
get
{
return (_data[index >> OFFSET] & (1 << (index & MOD_MASK))) != 0;
}
2023-05-07 00:50:44 +08:00
[MethodImpl(MethodImplOptions.AggressiveInlining)]
set
{
2023-06-22 14:40:26 +08:00
if (value)
2024-03-03 03:51:49 +08:00
{
2023-05-07 00:50:44 +08:00
_data[index >> OFFSET] |= (1 << (index & MOD_MASK));
2024-03-03 03:51:49 +08:00
}
2023-05-07 00:50:44 +08:00
else
2024-03-03 03:51:49 +08:00
{
2023-05-07 00:50:44 +08:00
_data[index >> OFFSET] &= ~(1 << (index & MOD_MASK));
2024-03-03 03:51:49 +08:00
}
2023-05-07 00:50:44 +08:00
}
}
public void Resize(int newSize)
{
if (newSize <= _size)
2024-03-03 03:51:49 +08:00
{
2023-05-07 00:50:44 +08:00
return;
2024-03-03 03:51:49 +08:00
}
2023-05-07 00:50:44 +08:00
_size = newSize / DATA_BITS + 1;
Array.Resize(ref _data, _size);
}
}
}