using DCFApixels.DragonECS.Internal; using System; namespace DCFApixels.DragonECS { public interface IEntityStorage { EcsWorld World { get; } EcsSpan ToSpan(); } public static class Queries { #region Where public static EcsSpan Where(this TCollection entities, out TAspect aspect) where TAspect : EcsAspect, new() where TCollection : IEntityStorage { if(ReferenceEquals(entities, entities.World)) { entities.World.GetQueryCache(out EcsWhereExecutor executor, out aspect); return executor.Execute(); } return entities.ToSpan().Where(out aspect); } public static EcsSpan Where(this EcsReadonlyGroup group, out TAspect aspect) where TAspect : EcsAspect, new() { return group.ToSpan().Where(out aspect); } public static EcsSpan Where(this EcsSpan span, out TAspect aspect) where TAspect : EcsAspect, new() { span.World.GetQueryCache(out EcsWhereExecutor executor, out aspect); return executor.ExecuteFor(span); } public static EcsSpan Where(this TCollection entities, IEcsComponentMask mask) where TCollection : IEntityStorage { if (ReferenceEquals(entities, entities.World)) { var executor = entities.World.GetExecutor(mask); return executor.Execute(); } return entities.ToSpan().Where(mask); } public static EcsSpan Where(this EcsReadonlyGroup group, IEcsComponentMask mask) { return group.ToSpan().Where(mask); } public static EcsSpan Where(this EcsSpan span, IEcsComponentMask mask) { var executor = span.World.GetExecutor(mask); return executor.ExecuteFor(span); } #endregion #region Where with sort public static EcsSpan Where(this TCollection entities, out TAspect aspect, Comparison comparison) where TAspect : EcsAspect, new() where TCollection : IEntityStorage { if (ReferenceEquals(entities, entities.World)) { entities.World.GetQueryCache(out EcsWhereExecutor executor, out aspect); return executor.Execute(comparison); } return entities.ToSpan().Where(out aspect, comparison); } public static EcsSpan Where(this EcsReadonlyGroup group, out TAspect aspect, Comparison comparison) where TAspect : EcsAspect, new() { return group.ToSpan().Where(out aspect, comparison); } public static EcsSpan Where(this EcsSpan span, out TAspect aspect, Comparison comparison) where TAspect : EcsAspect, new() { span.World.GetQueryCache(out EcsWhereExecutor executor, out aspect); return executor.ExecuteFor(span, comparison); } public static EcsSpan Where(this TCollection entities, IEcsComponentMask mask, Comparison comparison) where TCollection : IEntityStorage { if (ReferenceEquals(entities, entities.World)) { EcsWhereExecutor executor = entities.World.GetExecutor(mask); return executor.Execute(comparison); } return entities.ToSpan().Where(mask, comparison); } public static EcsSpan Where(this EcsReadonlyGroup group, IEcsComponentMask mask, Comparison comparison) { return group.ToSpan().Where(mask, comparison); } public static EcsSpan Where(this EcsSpan span, IEcsComponentMask mask, Comparison comparison) { var executor = span.World.GetExecutor(mask); return executor.ExecuteFor(span); } #endregion #region WhereToGroup public static EcsReadonlyGroup WhereToGroup(this TCollection entities, out TAspect aspect) where TAspect : EcsAspect, new() where TCollection : IEntityStorage { if (ReferenceEquals(entities, entities.World)) { entities.World.GetQueryCache(out EcsWhereToGroupExecutor executor, out aspect); return executor.Execute(); } return entities.ToSpan().WhereToGroup(out aspect); } public static EcsReadonlyGroup WhereToGroup(this EcsReadonlyGroup group, out TAspect aspect) where TAspect : EcsAspect, new() { return group.ToSpan().WhereToGroup(out aspect); } public static EcsReadonlyGroup WhereToGroup(this EcsSpan span, out TAspect aspect) where TAspect : EcsAspect, new() { span.World.GetQueryCache(out EcsWhereToGroupExecutor executor, out aspect); return executor.ExecuteFor(span); } public static EcsReadonlyGroup WhereToGroup(this TCollection entities, IEcsComponentMask mask) where TCollection : IEntityStorage { if (ReferenceEquals(entities, entities.World)) { EcsWhereToGroupExecutor executor = entities.World.GetExecutor(mask); return executor.Execute(); } return entities.ToSpan().WhereToGroup(mask); } public static EcsReadonlyGroup WhereToGroup(this EcsReadonlyGroup group, IEcsComponentMask mask) { return group.ToSpan().WhereToGroup(mask); } public static EcsReadonlyGroup WhereToGroup(this EcsSpan span, IEcsComponentMask mask) { var executor = span.World.GetExecutor(mask); return executor.ExecuteFor(span); } #endregion } }