2023-11-03 19:40:26 +00:00
|
|
|
using MoonTools.ECS.Collections;
|
|
|
|
|
|
|
|
namespace MoonTools.ECS;
|
|
|
|
|
|
|
|
internal class IdAssigner
|
|
|
|
{
|
|
|
|
uint Next;
|
|
|
|
NativeArray<uint> AvailableIds = new NativeArray<uint>();
|
|
|
|
|
2023-11-08 01:46:44 +00:00
|
|
|
public uint Assign(out bool recycled)
|
2023-11-03 19:40:26 +00:00
|
|
|
{
|
2023-11-08 01:46:44 +00:00
|
|
|
recycled = AvailableIds.TryPop(out var id);
|
|
|
|
|
|
|
|
if (recycled)
|
2023-11-03 19:40:26 +00:00
|
|
|
{
|
2023-11-08 01:46:44 +00:00
|
|
|
return id;
|
2023-11-03 19:40:26 +00:00
|
|
|
}
|
|
|
|
|
2023-11-08 01:46:44 +00:00
|
|
|
id = Next;
|
|
|
|
Next += 1;
|
2023-11-03 19:40:26 +00:00
|
|
|
return id;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void Unassign(uint id)
|
|
|
|
{
|
|
|
|
AvailableIds.Append(id);
|
|
|
|
}
|
|
|
|
|
|
|
|
public void CopyTo(IdAssigner other)
|
|
|
|
{
|
|
|
|
AvailableIds.CopyTo(other.AvailableIds);
|
|
|
|
other.Next = Next;
|
|
|
|
}
|
|
|
|
}
|