using System; using System.Collections.Generic; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; namespace DCFApixels.DragonECS { public interface IEcsFiled where TComponent : struct { public ref TComponent Write(int entityID); public ref readonly TComponent Read(int entityID); public bool Has(int entityID); public void Del(int entityID); } [StructLayout(LayoutKind.Sequential, Pack = 8, Size = 8)] public readonly struct inc : IEcsFiled where TComponent : struct { private readonly EcsPool _pool; [MethodImpl(MethodImplOptions.AggressiveInlining)] internal inc(EcsPool pool) => _pool = pool; [MethodImpl(MethodImplOptions.AggressiveInlining)] public ref TComponent Write(int entityID) => ref _pool.Write(entityID); [MethodImpl(MethodImplOptions.AggressiveInlining)] public ref readonly TComponent Read(int entityID) => ref _pool.Read(entityID); [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Has(int entityID) => _pool.Has(entityID); [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Del(int entityID) => _pool.Del(entityID); [MethodImpl(MethodImplOptions.AggressiveInlining)] public override string ToString() => $"{(_pool == null ? "NULL" : _pool.World.ArchetypeType.Name)}inc<{typeof(TComponent).Name}>"; [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator inc(EcsEntityArchetypeBuilder buider) => buider.Include(); } [StructLayout(LayoutKind.Sequential, Pack = 8, Size = 8)] public readonly struct exc : IEcsFiled where TComponent : struct { private readonly EcsPool _pool; [MethodImpl(MethodImplOptions.AggressiveInlining)] internal exc(EcsPool pool) => _pool = pool; [MethodImpl(MethodImplOptions.AggressiveInlining)] public ref TComponent Write(int entityID) => ref _pool.Write(entityID); [MethodImpl(MethodImplOptions.AggressiveInlining)] public ref readonly TComponent Read(int entityID) => ref _pool.Read(entityID); [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Has(int entityID) => _pool.Has(entityID); [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Del(int entityID) => _pool.Del(entityID); [MethodImpl(MethodImplOptions.AggressiveInlining)] public override string ToString() => $"{(_pool == null ? "NULL" : _pool.World.ArchetypeType.Name)}exc<{typeof(TComponent).Name}>"; [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator exc(EcsEntityArchetypeBuilder buider) => buider.Exclude(); } [StructLayout(LayoutKind.Sequential, Pack = 8, Size = 8)] public readonly struct opt : IEcsFiled where TComponent : struct { private readonly EcsPool _pool; [MethodImpl(MethodImplOptions.AggressiveInlining)] internal opt(EcsPool pool) => _pool = pool; [MethodImpl(MethodImplOptions.AggressiveInlining)] public ref TComponent Write(int entityID) => ref _pool.Write(entityID); [MethodImpl(MethodImplOptions.AggressiveInlining)] public ref readonly TComponent Read(int entityID) => ref _pool.Read(entityID); [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Has(int entityID) => _pool.Has(entityID); [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Del(int entityID) => _pool.Del(entityID); [MethodImpl(MethodImplOptions.AggressiveInlining)] public override string ToString() => $"{(_pool == null ? "NULL" : _pool.World.ArchetypeType.Name)}opt<{typeof(TComponent).Name}>"; [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator opt(EcsEntityArchetypeBuilder buider) => buider.Optional(); } }