using System.Collections.Generic; using EcsRx.Collections; using EcsRx.Components; using EcsRx.Components.Database; using EcsRx.Components.Lookups; using EcsRx.Groups.Observable; using EcsRx.Plugins.Batching.Factories; namespace EcsRx.Plugins.Batching.Accessors { public class BatchManager : IBatchManager { public Dictionary BatchAccessors { get; } = new Dictionary(); public IComponentDatabase ComponentDatabase { get; } public IComponentTypeLookup ComponentTypeLookup { get; } public IBatchBuilderFactory BatchBuilderFactory { get; } public IReferenceBatchBuilderFactory ReferenceBatchBuilderFactory { get; } public IObservableGroupManager ObservableGroupManager { get; } public BatchManager(IComponentDatabase componentDatabase, IComponentTypeLookup componentTypeLookup, IBatchBuilderFactory batchBuilderFactory, IReferenceBatchBuilderFactory referenceBatchBuilderFactory, IObservableGroupManager observableGroupManager) { ComponentDatabase = componentDatabase; ComponentTypeLookup = componentTypeLookup; BatchBuilderFactory = batchBuilderFactory; ObservableGroupManager = observableGroupManager; ReferenceBatchBuilderFactory = referenceBatchBuilderFactory; } public IBatchAccessor GetAccessorFor(IObservableGroup observableGroup) where T1 : unmanaged, IComponent where T2 : unmanaged, IComponent { var componentTypes = ComponentTypeLookup.GetComponentTypes(typeof(T1), typeof(T2)); var token = new AccessorToken(componentTypes, observableGroup); if (BatchAccessors.ContainsKey(token)) { return (IBatchAccessor) BatchAccessors[token]; } var batchBuilder = BatchBuilderFactory.Create(); var batchAccessor = new BatchAccessor(observableGroup, ComponentDatabase, batchBuilder, ComponentTypeLookup); BatchAccessors.Add(token, batchAccessor); return batchAccessor; } public IReferenceBatchAccessor GetReferenceAccessorFor(IObservableGroup observableGroup) where T1 : class, IComponent where T2 : class, IComponent { var componentTypes = ComponentTypeLookup.GetComponentTypes(typeof(T1), typeof(T2)); var token = new AccessorToken(componentTypes, observableGroup); if (BatchAccessors.ContainsKey(token)) { return (IReferenceBatchAccessor) BatchAccessors[token]; } var batchBuilder = ReferenceBatchBuilderFactory.Create(); var batchAccessor = new ReferenceBatchAccessor(observableGroup, ComponentDatabase, batchBuilder, ComponentTypeLookup); BatchAccessors.Add(token, batchAccessor); return batchAccessor; } public IBatchAccessor GetAccessorFor(IObservableGroup observableGroup) where T1 : unmanaged, IComponent where T2 : unmanaged, IComponent where T3 : unmanaged, IComponent { var componentTypes = ComponentTypeLookup.GetComponentTypes(typeof(T1), typeof(T2), typeof(T3)); var token = new AccessorToken(componentTypes, observableGroup); if (BatchAccessors.ContainsKey(token)) { return (IBatchAccessor) BatchAccessors[token]; } var batchBuilder = BatchBuilderFactory.Create(); var batchAccessor = new BatchAccessor(observableGroup, ComponentDatabase, batchBuilder, ComponentTypeLookup); BatchAccessors.Add(token, batchAccessor); return batchAccessor; } public IReferenceBatchAccessor GetReferenceAccessorFor(IObservableGroup observableGroup) where T1 : class, IComponent where T2 : class, IComponent where T3 : class, IComponent { var componentTypes = ComponentTypeLookup.GetComponentTypes(typeof(T1), typeof(T2), typeof(T3)); var token = new AccessorToken(componentTypes, observableGroup); if (BatchAccessors.ContainsKey(token)) { return (IReferenceBatchAccessor) BatchAccessors[token]; } var batchBuilder = ReferenceBatchBuilderFactory.Create(); var batchAccessor = new ReferenceBatchAccessor(observableGroup, ComponentDatabase, batchBuilder, ComponentTypeLookup); BatchAccessors.Add(token, batchAccessor); return batchAccessor; } public IBatchAccessor GetAccessorFor(IObservableGroup observableGroup) where T1 : unmanaged, IComponent where T2 : unmanaged, IComponent where T3 : unmanaged, IComponent where T4 : unmanaged, IComponent { var componentTypes = ComponentTypeLookup.GetComponentTypes(typeof(T1), typeof(T2), typeof(T3), typeof(T4)); var token = new AccessorToken(componentTypes, observableGroup); if (BatchAccessors.ContainsKey(token)) { return (IBatchAccessor) BatchAccessors[token]; } var batchBuilder = BatchBuilderFactory.Create(); var batchAccessor = new BatchAccessor(observableGroup, ComponentDatabase, batchBuilder, ComponentTypeLookup); BatchAccessors.Add(token, batchAccessor); return batchAccessor; } public IReferenceBatchAccessor GetReferenceAccessorFor(IObservableGroup observableGroup) where T1 : class, IComponent where T2 : class, IComponent where T3 : class, IComponent where T4 : class, IComponent { var componentTypes = ComponentTypeLookup.GetComponentTypes(typeof(T1), typeof(T2), typeof(T3), typeof(T4)); var token = new AccessorToken(componentTypes, observableGroup); if (BatchAccessors.ContainsKey(token)) { return (IReferenceBatchAccessor) BatchAccessors[token]; } var batchBuilder = ReferenceBatchBuilderFactory.Create(); var batchAccessor = new ReferenceBatchAccessor(observableGroup, ComponentDatabase, batchBuilder, ComponentTypeLookup); BatchAccessors.Add(token, batchAccessor); return batchAccessor; } public IBatchAccessor GetAccessorFor(IObservableGroup observableGroup) where T1 : unmanaged, IComponent where T2 : unmanaged, IComponent where T3 : unmanaged, IComponent where T4 : unmanaged, IComponent where T5 : unmanaged, IComponent { var componentTypes = ComponentTypeLookup.GetComponentTypes(typeof(T1), typeof(T2), typeof(T3), typeof(T4), typeof(T5)); var token = new AccessorToken(componentTypes, observableGroup); if (BatchAccessors.ContainsKey(token)) { return (IBatchAccessor) BatchAccessors[token]; } var batchBuilder = BatchBuilderFactory.Create(); var batchAccessor = new BatchAccessor(observableGroup, ComponentDatabase, batchBuilder, ComponentTypeLookup); BatchAccessors.Add(token, batchAccessor); return batchAccessor; } public IReferenceBatchAccessor GetReferenceAccessorFor(IObservableGroup observableGroup) where T1 : class, IComponent where T2 : class, IComponent where T3 : class, IComponent where T4 : class, IComponent where T5 : class, IComponent { var componentTypes = ComponentTypeLookup.GetComponentTypes(typeof(T1), typeof(T2), typeof(T3), typeof(T4), typeof(T5)); var token = new AccessorToken(componentTypes, observableGroup); if (BatchAccessors.ContainsKey(token)) { return (IReferenceBatchAccessor) BatchAccessors[token]; } var batchBuilder = ReferenceBatchBuilderFactory.Create(); var batchAccessor = new ReferenceBatchAccessor(observableGroup, ComponentDatabase, batchBuilder, ComponentTypeLookup); BatchAccessors.Add(token, batchAccessor); return batchAccessor; } public IBatchAccessor GetAccessorFor(IObservableGroup observableGroup) where T1 : unmanaged, IComponent where T2 : unmanaged, IComponent where T3 : unmanaged, IComponent where T4 : unmanaged, IComponent where T5 : unmanaged, IComponent where T6 : unmanaged, IComponent { var componentTypes = ComponentTypeLookup.GetComponentTypes(typeof(T1), typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6)); var token = new AccessorToken(componentTypes, observableGroup); if (BatchAccessors.ContainsKey(token)) { return (IBatchAccessor) BatchAccessors[token]; } var batchBuilder = BatchBuilderFactory.Create(); var batchAccessor = new BatchAccessor(observableGroup, ComponentDatabase, batchBuilder, ComponentTypeLookup); BatchAccessors.Add(token, batchAccessor); return batchAccessor; } public IReferenceBatchAccessor GetReferenceAccessorFor(IObservableGroup observableGroup) where T1 : class, IComponent where T2 : class, IComponent where T3 : class, IComponent where T4 : class, IComponent where T5 : class, IComponent where T6 : class, IComponent { var componentTypes = ComponentTypeLookup.GetComponentTypes(typeof(T1), typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6)); var token = new AccessorToken(componentTypes, observableGroup); if (BatchAccessors.ContainsKey(token)) { return (IReferenceBatchAccessor) BatchAccessors[token]; } var batchBuilder = ReferenceBatchBuilderFactory.Create(); var batchAccessor = new ReferenceBatchAccessor(observableGroup, ComponentDatabase, batchBuilder, ComponentTypeLookup); BatchAccessors.Add(token, batchAccessor); return batchAccessor; } } }