using System; using System.Collections; using System.Collections.Generic; using gaemstone.Utility.IL; using static flecs_hub.flecs; namespace gaemstone.ECS; public unsafe class Filter : IEnumerable , IDisposable { public Universe Universe { get; } public ecs_filter_t* Handle { get; } private Filter(Universe universe, ecs_filter_t* handle) { Universe = universe; Handle = handle; } public Filter(Universe universe, ecs_filter_desc_t desc) : this(universe, ecs_filter_init(universe, &desc)) { } public Filter(Universe universe, string expression) : this(universe, new ecs_filter_desc_t { expr = expression }) { } public static void RunOnce(Universe universe, Delegate action) { var gen = QueryActionGenerator.GetOrBuild(universe, action.Method); using var filter = new Filter(universe, gen.Filter); foreach (var iter in filter) gen.RunWithTryCatch(action.Target, iter); } ~Filter() => Dispose(); public void Dispose() { ecs_filter_fini(Handle); GC.SuppressFinalize(this); } public Iterator Iter() => new(Universe, IteratorType.Filter, ecs_filter_iter(Universe, this)); public IEnumerator GetEnumerator() => Iter().GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); public static implicit operator ecs_filter_t*(Filter q) => q.Handle; }