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

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;
}