You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
39 lines
1.3 KiB
39 lines
1.3 KiB
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<Iterator> |
|
, 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<Iterator> GetEnumerator() => Iter().GetEnumerator(); |
|
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); |
|
|
|
public static implicit operator ecs_filter_t*(Filter q) => q.Handle; |
|
}
|
|
|