using System.Runtime.CompilerServices; using System.Runtime.InteropServices; namespace DCFApixels.DragonECS { public interface IEcsQueryMember { } public interface IEcsQueryReadonlyField : IEcsQueryMember { public ref TComponent Read(ent entityID); public bool Has(ent entityID); } public interface IEcsQueryField : IEcsQueryReadonlyField where TComponent : struct { public ref TComponent Add(ent entityID); public ref TComponent Write(ent entityID); public void Del(ent entityID); } #region select [StructLayout(LayoutKind.Sequential, Pack = 8, Size = 8)] public readonly struct inc_ : IEcsQueryField where TComponent : struct { internal readonly EcsPool pool; [MethodImpl(MethodImplOptions.AggressiveInlining)] internal inc_(EcsPool pool) => this.pool = pool; [MethodImpl(MethodImplOptions.AggressiveInlining)] public ref TComponent Add(ent entityID) => ref pool.Add(entityID.id); [MethodImpl(MethodImplOptions.AggressiveInlining)] public ref TComponent Write(ent entityID) => ref pool.Write(entityID.id); [MethodImpl(MethodImplOptions.AggressiveInlining)] public ref TComponent Read(ent entityID) => ref pool.Read(entityID.id); [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Has(ent entityID) => pool.Has(entityID.id); [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Del(ent entityID) => pool.Del(entityID.id); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator inc_(EcsQueryBuilderBase buider) => buider.Include(); } [StructLayout(LayoutKind.Sequential, Pack = 8, Size = 8)] public readonly struct exc_ : IEcsQueryField where TComponent : struct { internal readonly EcsPool pool; [MethodImpl(MethodImplOptions.AggressiveInlining)] internal exc_(EcsPool pool) => this.pool = pool; [MethodImpl(MethodImplOptions.AggressiveInlining)] public ref TComponent Add(ent entityID) => ref pool.Add(entityID.id); [MethodImpl(MethodImplOptions.AggressiveInlining)] public ref TComponent Write(ent entityID) => ref pool.Write(entityID.id); [MethodImpl(MethodImplOptions.AggressiveInlining)] public ref TComponent Read(ent entityID) => ref pool.Read(entityID.id); [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Has(ent entityID) => pool.Has(entityID.id); [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Del(ent entityID) => pool.Del(entityID.id); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator exc_(EcsQueryBuilderBase buider) => buider.Exclude(); } [StructLayout(LayoutKind.Sequential, Pack = 8, Size = 8)] public readonly struct opt_ : IEcsQueryField where TComponent : struct { internal readonly EcsPool pool; [MethodImpl(MethodImplOptions.AggressiveInlining)] internal opt_(EcsPool pool) => this.pool = pool; [MethodImpl(MethodImplOptions.AggressiveInlining)] public ref TComponent Add(ent entityID) => ref pool.Add(entityID.id); [MethodImpl(MethodImplOptions.AggressiveInlining)] public ref TComponent Write(ent entityID) => ref pool.Write(entityID.id); [MethodImpl(MethodImplOptions.AggressiveInlining)] public ref TComponent Read(ent entityID) => ref pool.Read(entityID.id); [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Has(ent entityID) => pool.Has(entityID.id); [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Del(ent entityID) => pool.Del(entityID.id); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator opt_(EcsQueryBuilderBase buider) => buider.Optional(); } #endregion // #region select_readonly // [StructLayout(LayoutKind.Sequential, Pack = 8, Size = 8)] // public readonly struct inc_readonly_ : IEcsQueryReadonlyField // where T : struct // { // internal readonly EcsPool pool; // [MethodImpl(MethodImplOptions.AggressiveInlining)] // internal inc_readonly_(EcsPool pool) => this.pool = pool; // [MethodImpl(MethodImplOptions.AggressiveInlining)] // public ref T Read(ent entityID) => ref pool.Read(entityID.uniqueID); // [MethodImpl(MethodImplOptions.AggressiveInlining)] // public bool Has(ent entityID) => pool.Has(entityID.uniqueID); // [MethodImpl(MethodImplOptions.AggressiveInlining)] // // public static implicit operator inc_readonly_(EcsQueryBuilderBase buider) => buider.Include(); // public static implicit operator inc_readonly_(inc_ o) => new inc_readonly_(o.pool); // } // // [StructLayout(LayoutKind.Sequential, Pack = 8, Size = 8)] // public readonly struct exc_readonly_ : IEcsQueryReadonlyField // where T : struct // { // internal readonly EcsPool pool; // [MethodImpl(MethodImplOptions.AggressiveInlining)] // internal exc_readonly_(EcsPool pool) => this.pool = pool; // [MethodImpl(MethodImplOptions.AggressiveInlining)] // public ref T Read(ent entityID) => ref pool.Read(entityID.uniqueID); // [MethodImpl(MethodImplOptions.AggressiveInlining)] // public bool Has(ent entityID) => pool.Has(entityID.uniqueID); // [MethodImpl(MethodImplOptions.AggressiveInlining)] // // public static implicit operator exc_readonly_(EcsQueryBuilderBase buider) => buider.Exclude(); // public static implicit operator exc_readonly_(exc_ o) => new exc_readonly_(o.pool); // } // // [StructLayout(LayoutKind.Sequential, Pack = 8, Size = 8)] // public readonly struct opt_readonly_ : IEcsQueryReadonlyField // where T : struct // { // internal readonly EcsPool pool; // [MethodImpl(MethodImplOptions.AggressiveInlining)] // internal opt_readonly_(EcsPool pool) => this.pool = pool; // [MethodImpl(MethodImplOptions.AggressiveInlining)] // public ref T Read(ent entityID) => ref pool.Read(entityID.uniqueID); // [MethodImpl(MethodImplOptions.AggressiveInlining)] // public bool Has(ent entityID) => pool.Has(entityID.uniqueID); // [MethodImpl(MethodImplOptions.AggressiveInlining)] // // public static implicit operator opt_readonly_(EcsQueryBuilderBase buider) => buider.Optional(); // public static implicit operator opt_readonly_(opt_ o) => new opt_readonly_(o.pool); // } // #endregion // // #region join // [StructLayout(LayoutKind.Sequential, Pack = 8, Size = 8)] // public readonly struct attach : IEcsQueryField // { // internal readonly EcsPool pool; // [MethodImpl(MethodImplOptions.AggressiveInlining)] // internal attach(EcsPool pool) => this.pool = pool; // [MethodImpl(MethodImplOptions.AggressiveInlining)] // public ref Edge Add(ent entityID) => ref pool.Add(entityID.uniqueID); // [MethodImpl(MethodImplOptions.AggressiveInlining)] // public ref Edge Write(ent entityID) => ref pool.Write(entityID.uniqueID); // [MethodImpl(MethodImplOptions.AggressiveInlining)] // public ref Edge Read(ent entityID) => ref pool.Read(entityID.uniqueID); // [MethodImpl(MethodImplOptions.AggressiveInlining)] // public bool Has(ent entityID) => pool.Has(entityID.uniqueID); // [MethodImpl(MethodImplOptions.AggressiveInlining)] // public void Del(ent entityID) => pool.Del(entityID.uniqueID); // [MethodImpl(MethodImplOptions.AggressiveInlining)] // public static implicit operator attach(EcsQueryBuilderBase buider) => buider.Include(); // public static implicit operator attach(inc_ o) => new attach(o.pool); // } // #endregion }