namespace MoonTools.ECS; internal class ComponentDepot { private Dictionary storages = new Dictionary(); private Dictionary> entityComponentMap = new Dictionary>(); private ComponentStorage Lookup() where TComponent : struct { // TODO: is it possible to optimize this? if (!storages.ContainsKey(typeof(TComponent))) { storages.Add(typeof(TComponent), new ComponentStorage()); } return storages[typeof(TComponent)] as ComponentStorage; } public bool Some() where TComponent : struct { return Lookup().Any(); } public bool Has(int entityID) where TComponent : struct { return Lookup().Has(entityID); } public ref readonly TComponent Get(int entityID) where TComponent : struct { return ref Lookup().Get(entityID); } public void Set(int entityID, in TComponent component) where TComponent : struct { Lookup().Set(entityID, component); if (!entityComponentMap.ContainsKey(entityID)) { entityComponentMap.Add(entityID, new HashSet()); } entityComponentMap[entityID].Add(typeof(TComponent)); } public ReadOnlySpan ReadEntities() where TComponent : struct { return Lookup().AllEntities(); } public ReadOnlySpan ReadComponents() where TComponent : struct { return Lookup().AllComponents(); } public void Remove(int entityID) where TComponent : struct { Lookup().Remove(entityID); entityComponentMap[entityID].Remove(typeof(TComponent)); } public void OnEntityDestroy(int entityID) { if (entityComponentMap.ContainsKey(entityID)) { foreach (var type in entityComponentMap[entityID]) { storages[type].Remove(entityID); } entityComponentMap.Remove(entityID); } } }