using System; using System.Collections.Generic; using System.ComponentModel; using System.Runtime.CompilerServices; namespace DCFApixels.DragonECS { public readonly struct EcsField : IEcsMemberCachePool, T> where T :struct { private readonly EcsPool _pool; private readonly int _poolID; public EcsPool Pool => _pool; public int PoolID => _poolID; private EcsField(int poolID) { _pool = null; _poolID = poolID; } internal EcsField(EcsPool pool) { _pool = pool; _poolID = pool.ID; } [EditorBrowsable(EditorBrowsableState.Never)] public ref T this[int entityID] { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => ref _pool[entityID]; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Has(int entityID) { return _pool.Has(entityID); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public ref T Add(int entityID) { return ref _pool.Add(entityID); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Del(int entityID) { _pool.Del(entityID); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator EcsField(in int poolID) => new EcsField(poolID); void IEcsMemberCachePool, T>.Inject(out EcsField self, EcsPool pool) { self = new EcsField(pool); } } public readonly struct EcsIncField : IEcsMemberCachePool, T> where T :struct { private readonly EcsPool _pool; private readonly int _poolID; public EcsPool Pool => _pool; public int PoolID => _poolID; private EcsIncField(int poolID) { _pool = null; _poolID = poolID; } internal EcsIncField(EcsPool pool) { _pool = pool; _poolID = pool.ID; } [EditorBrowsable(EditorBrowsableState.Never)] public ref T this[int entityID] { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => ref _pool[entityID]; } [EditorBrowsable(EditorBrowsableState.Never)] public void Del(int entityID) { _pool.Del(entityID); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator EcsIncField(in int poolID) => new EcsIncField(poolID); void IEcsMemberCachePool, T>.Inject(out EcsIncField self, EcsPool pool) { self = new EcsIncField(pool); } } public struct EcsExcField : IEcsMemberCachePool, T> where T :struct { private readonly EcsPool _pool; private readonly int _poolID; public EcsPool Pool => _pool; public int PoolID => _poolID; private EcsExcField(int poolID) { _pool = null; _poolID = poolID; } internal EcsExcField(EcsPool pool) { _pool = pool; _poolID = pool.ID; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public ref T Add(int entityID) { return ref _pool.Add(entityID); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator EcsExcField(in int poolID) => new EcsExcField(poolID); void IEcsMemberCachePool, T>.Inject(out EcsExcField self, EcsPool pool) { self = new EcsExcField(pool); } } }