using System; using System.Collections.Generic; namespace Encompass { internal class ComponentDeltaStore { private readonly ComponentStore _store; private readonly Dictionary _replayers = new Dictionary(); private readonly HashSet _currentReplayers = new HashSet(); public IEnumerable CurrentReplayers { get { return _currentReplayers; } } public ComponentDeltaStore(Dictionary typeToIndex) { _store = new ComponentStore(typeToIndex); } public void RegisterComponentType() where TComponent : struct { _store.RegisterComponentType(); if (!_replayers.ContainsKey(typeof(TComponent))) { _replayers.Add(typeof(TComponent), new Replayer(this)); } } public ref readonly TComponent GetComponent(int entityID) where TComponent : struct { return ref _store.Get(entityID); } public void Set(int entityID, in TComponent component) where TComponent : struct { _store.Set(entityID, component); RegisterComponentType(); var replayer = _replayers[typeof(TComponent)]; _currentReplayers.Add(replayer); replayer.UnMarkRemoval(entityID); } public bool Set(int entityID, TComponent component, int priority) where TComponent : struct { var result = _store.Set(entityID, component, priority); if (result) { RegisterComponentType(); var replayer = _replayers[typeof(TComponent)]; _currentReplayers.Add(replayer); replayer.UnMarkRemoval(entityID); } return result; } public bool Remove(int entityID, int priority) where TComponent : struct { var result = _store.Remove(entityID, priority); if (result) { RegisterComponentType(); var replayer = _replayers[typeof(TComponent)]; _currentReplayers.Add(replayer); replayer.MarkRemoval(entityID); } return result; } public void Remove(int entityID) { _store.Remove(entityID); foreach (var replayer in CurrentReplayers) { replayer.MarkRemoval(entityID); } } public ReadOnlySpan AllEntities() where TComponent : struct { return _store.AllEntities(); } public void ClearAll() { _store.ClearAll(); foreach (var replayer in _currentReplayers) { replayer.Clear(); } _currentReplayers.Clear(); } } }