using MoonTools.FastCollections; using System; using System.Collections.Generic; namespace Encompass { internal class ComponentStore { private Dictionary _stores = new Dictionary(512); public ComponentBitSet ComponentBitSet { get; private set; } private Dictionary _typeToIndex; public ComponentStore(Dictionary typeToIndex) { _typeToIndex = typeToIndex; ComponentBitSet = new ComponentBitSet(typeToIndex); } public virtual void RegisterComponentType() where TComponent : unmanaged { if (!_stores.ContainsKey(typeof(TComponent))) { var store = new TypedComponentStore(); _stores.Add(typeof(TComponent), store); } if (!_typeToIndex.ContainsKey(typeof(TComponent))) { _typeToIndex.Add(typeof(TComponent), _typeToIndex.Count); } } private TypedComponentStore Lookup() where TComponent : unmanaged { RegisterComponentType(); return _stores[typeof(TComponent)] as TypedComponentStore; } public bool Has(int entityID) where TComponent : unmanaged { return Lookup().Has(entityID); } public bool Has(Type type, int entityID) { return _stores.ContainsKey(type) && _stores[type].Has(entityID); } public BitSet512 EntityBitArray(int entityID) { return ComponentBitSet.EntityBitArray(entityID); } public ref readonly TComponent Get(int entityID) where TComponent : unmanaged { return ref Lookup().Get(entityID); } public virtual void Set(int entityID, TComponent component) where TComponent : unmanaged { Lookup().Set(entityID, component); ComponentBitSet.Set(entityID); } public virtual bool Set(int entityID, TComponent component, int priority) where TComponent : unmanaged { if (Lookup().Set(entityID, component, priority)) { ComponentBitSet.Set(entityID); return true; } return false; } public virtual bool Remove(int entityID, int priority) where TComponent : unmanaged { if (Lookup().Remove(entityID, priority)) { ComponentBitSet.RemoveComponent(entityID); return true; } return false; } public void ForceRemove(int entityID) where TComponent : unmanaged { Lookup().ForceRemove(entityID); ComponentBitSet.RemoveComponent(entityID); } public virtual void Remove(int entityID) { foreach (var entry in _stores.Values) { entry.ForceRemove(entityID); } ComponentBitSet.RemoveEntity(entityID); } public bool Any() where TComponent : unmanaged { return Lookup().Count > 0; } public IEnumerable<(TComponent, int)> All() where TComponent : unmanaged { return Lookup().All(); } public void Clear() where TComponent : unmanaged { Lookup().Clear(); } public virtual void ClearAllPriorities() { foreach (var store in _stores.Values) { store.ClearPriorities(); } } public virtual void ClearAll() { ComponentBitSet.Clear(); foreach (var store in _stores.Values) { store.Clear(); } } public void SwapWith(ComponentStore other) { (_stores, other._stores) = (other._stores, _stores); (ComponentBitSet, other.ComponentBitSet) = (other.ComponentBitSet, ComponentBitSet); } public void UpdateUsing(ComponentDeltaStore delta) { foreach (var replayer in delta.CurrentReplayers) { replayer.Replay(this); } } } }