2022-05-03 04:51:11 +00:00
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
|
|
|
|
namespace MoonTools.ECS
|
2022-03-05 02:01:44 +00:00
|
|
|
|
{
|
2022-04-08 05:52:03 +00:00
|
|
|
|
internal class EntityStorage
|
2022-03-05 02:01:44 +00:00
|
|
|
|
{
|
2022-05-03 04:51:11 +00:00
|
|
|
|
private int nextID = 0;
|
|
|
|
|
private readonly Stack<int> availableIDs = new Stack<int>();
|
|
|
|
|
private readonly HashSet<int> availableIDHash = new HashSet<int>();
|
2022-03-05 02:01:44 +00:00
|
|
|
|
|
2022-04-08 05:52:03 +00:00
|
|
|
|
public Entity Create()
|
|
|
|
|
{
|
2022-05-03 04:51:11 +00:00
|
|
|
|
return new Entity(NextID());
|
2022-04-08 05:52:03 +00:00
|
|
|
|
}
|
2022-03-31 23:15:30 +00:00
|
|
|
|
|
2022-04-08 05:52:03 +00:00
|
|
|
|
public bool Exists(in Entity entity)
|
|
|
|
|
{
|
2022-05-03 04:51:11 +00:00
|
|
|
|
return Taken(entity.ID);
|
2022-04-08 05:52:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Destroy(in Entity entity)
|
|
|
|
|
{
|
2022-05-03 04:51:11 +00:00
|
|
|
|
Release(entity.ID);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Save(EntityStorageState state)
|
|
|
|
|
{
|
|
|
|
|
state.NextID = nextID;
|
|
|
|
|
state.availableIDs.Clear();
|
|
|
|
|
foreach (var id in availableIDs)
|
|
|
|
|
{
|
|
|
|
|
state.availableIDs.Add(id);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Load(EntityStorageState state)
|
|
|
|
|
{
|
|
|
|
|
nextID = state.NextID;
|
|
|
|
|
availableIDs.Clear();
|
|
|
|
|
availableIDHash.Clear();
|
|
|
|
|
foreach (var id in state.availableIDs)
|
|
|
|
|
{
|
|
|
|
|
availableIDs.Push(id);
|
|
|
|
|
availableIDHash.Add(id);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private int NextID()
|
|
|
|
|
{
|
|
|
|
|
if (availableIDs.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
var id = availableIDs.Pop();
|
|
|
|
|
availableIDHash.Remove(id);
|
|
|
|
|
return id;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
var id = nextID;
|
|
|
|
|
nextID += 1;
|
|
|
|
|
return id;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private bool Taken(int id)
|
|
|
|
|
{
|
|
|
|
|
return !availableIDHash.Contains(id) && id < nextID;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void Release(int id)
|
|
|
|
|
{
|
|
|
|
|
availableIDs.Push(id);
|
|
|
|
|
availableIDHash.Add(id);
|
2022-04-08 05:52:03 +00:00
|
|
|
|
}
|
2022-03-05 02:01:44 +00:00
|
|
|
|
}
|
|
|
|
|
}
|