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