using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; using System.Security.AccessControl; using System.Threading; namespace BITKit.Entities { public class EntitiesService:IEntitiesService { private readonly ConcurrentDictionary _entities = new(); private readonly ConcurrentDictionary _queryCache = new(); private readonly ConcurrentDictionary<(Type,Type), IEntity[]> _query2ComponentsCache = new(); private readonly ConcurrentDictionary<(Type,Type,Type), IEntity[]> _query3ComponentsCache = new(); public event Action OnAdd; public event Action OnRemove; public IEntity[] Entities => _entities.Values.ToArray(); public bool Register(IEntity entity) { if (!_entities.TryAdd(entity.Id, entity)) return false; OnAdd?.Invoke(entity); return true; } public bool UnRegister(IEntity entity) { if (!_entities.TryRemove(entity.Id, out _)) return false; OnRemove?.Invoke(entity); return true; } public CancellationToken CancellationToken => _cancellationTokenSource.Token; private readonly CancellationTokenSource _cancellationTokenSource = new(); public IEntity Get(int id) { return _entities[id]; } public bool TryGetEntity(int id, out IEntity entity) { return _entities.TryGetValue(id, out entity); } public IEntity GetOrAdd(int id, Func factory) { return _entities.GetOrAdd(id, factory); } public IEntity[] Query() { throw new NotImplementedException("Obsoleted"); } public T[] QueryComponents() { throw new NotImplementedException(); // return _queryCache.GetOrAdd(typeof(T), type => // { // return _entities.Values.Where(entity => entity.TryGetComponent(out T component)).ToArray(); // }).Cast().ToArray(); } public (T, T1)[] QueryComponents() { throw new NotImplementedException(); // List<(T, T1)> list = new(); // foreach (var entity in _entities.Values) // { // if (entity.TryGetComponent(out T t) && entity.TryGetComponent(out T1 t1)) // list.Add((t, t1)); // } // return list.ToArray(); } public (T, T1, T2)[] QueryComponents() { throw new NotImplementedException(); // List<(T, T1, T2)> list = new(); // foreach (var entity in _entities.Values) // { // if (entity.TryGetComponent(out T t) && entity.TryGetComponent(out T1 t1) && entity.TryGetComponent(out T2 t2)) // list.Add((t, t1, t2)); // } // return list.ToArray(); } public (T, T1, T2, T3)[] QueryComponents() { throw new NotImplementedException(); // List<(T, T1, T2, T3)> list = new(); // foreach (var entity in _entities.Values) // { // if (entity.TryGetComponent(out T t) && entity.TryGetComponent(out T1 t1) && entity.TryGetComponent(out T2 t2) && entity.TryGetComponent(out T3 t3)) // list.Add((t, t1, t2, t3)); // } // return list.ToArray(); } public (T, T1, T2, T3, T4)[] QueryComponents() { throw new NotImplementedException(); // List<(T, T1, T2, T3, T4)> list = new(); // foreach (var entity in _entities.Values) // { // if (entity.TryGetComponent(out T t) && entity.TryGetComponent(out T1 t1) && entity.TryGetComponent(out T2 t2) && entity.TryGetComponent(out T3 t3) && entity.TryGetComponent(out T4 t4)) // list.Add((t, t1, t2, t3, t4)); // } // return list.ToArray(); } public (T, T1, T2, T3, T4, T5)[] QueryComponents() { throw new NotImplementedException(); // List<(T, T1, T2, T3, T4, T5)> list = new(); // foreach (var entity in _entities.Values) // { // if (entity.TryGetComponent(out T t) && entity.TryGetComponent(out T1 t1) && entity.TryGetComponent(out T2 t2) && entity.TryGetComponent(out T3 t3) && entity.TryGetComponent(out T4 t4) && entity.TryGetComponent(out T5 t5)) // list.Add((t, t1, t2, t3, t4, t5)); // } // return list.ToArray(); } public (T, T1, T2, T3, T4, T5, T6)[] QueryComponents() { throw new NotImplementedException(); // List<(T, T1, T2, T3, T4, T5, T6)> list = new(); // foreach (var entity in _entities.Values) // { // if (entity.TryGetComponent(out T t) && entity.TryGetComponent(out T1 t1) && entity.TryGetComponent(out T2 t2) && entity.TryGetComponent(out T3 t3) && entity.TryGetComponent(out T4 t4) && entity.TryGetComponent(out T5 t5) && entity.TryGetComponent(out T6 t6)) // list.Add((t, t1, t2, t3, t4, t5, t6)); // } // return list.ToArray(); } public ValueTuple[] QueryComponents() where TRest : struct { throw new NotImplementedException(); // throw new NotImplementedException(); } } }