|
|
@ -1,5 +1,4 @@ |
|
|
|
using System; |
|
|
|
using System; |
|
|
|
using System.Collections; |
|
|
|
|
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Linq; |
|
|
|
using System.Linq; |
|
|
|
using System.Runtime.CompilerServices; |
|
|
|
using System.Runtime.CompilerServices; |
|
|
@ -10,8 +9,7 @@ using static flecs_hub.flecs; |
|
|
|
namespace gaemstone.ECS; |
|
|
|
namespace gaemstone.ECS; |
|
|
|
|
|
|
|
|
|
|
|
public unsafe sealed class Filter |
|
|
|
public unsafe sealed class Filter |
|
|
|
: IEnumerable<Iterator> |
|
|
|
: IDisposable |
|
|
|
, IDisposable |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
public Universe Universe { get; } |
|
|
|
public Universe Universe { get; } |
|
|
|
public ecs_filter_t* Handle { get; } |
|
|
|
public ecs_filter_t* Handle { get; } |
|
|
@ -29,21 +27,19 @@ public unsafe sealed class Filter |
|
|
|
var gen = IterActionGenerator.GetOrBuild(universe, action.Method); |
|
|
|
var gen = IterActionGenerator.GetOrBuild(universe, action.Method); |
|
|
|
var desc = new FilterDesc(gen.Terms.ToArray()) { Name = action.Method.Name }; |
|
|
|
var desc = new FilterDesc(gen.Terms.ToArray()) { Name = action.Method.Name }; |
|
|
|
using var filter = new Filter(universe, desc); |
|
|
|
using var filter = new Filter(universe, desc); |
|
|
|
foreach (var iter in filter) gen.RunWithTryCatch(action.Target, iter); |
|
|
|
foreach (var iter in filter.Iter()) gen.RunWithTryCatch(action.Target, iter); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void Dispose() |
|
|
|
public void Dispose() |
|
|
|
=> ecs_filter_fini(Handle); |
|
|
|
=> ecs_filter_fini(Handle); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public Iterator Iter() |
|
|
|
|
|
|
|
=> new(Universe, IteratorType.Filter, ecs_filter_iter(Universe, this)); |
|
|
|
|
|
|
|
|
|
|
|
public override string ToString() |
|
|
|
public override string ToString() |
|
|
|
=> ecs_filter_str(Universe, Handle).FlecsToStringAndFree()!; |
|
|
|
=> ecs_filter_str(Universe, Handle).FlecsToStringAndFree()!; |
|
|
|
|
|
|
|
|
|
|
|
public static implicit operator ecs_filter_t*(Filter q) => q.Handle; |
|
|
|
public static implicit operator ecs_filter_t*(Filter q) => q.Handle; |
|
|
|
|
|
|
|
|
|
|
|
// IEnumerable implementation |
|
|
|
|
|
|
|
public Iterator Iter() => new(Universe, IteratorType.Filter, ecs_filter_iter(Universe, this)); |
|
|
|
|
|
|
|
public IEnumerator<Iterator> GetEnumerator() => Iter().GetEnumerator(); |
|
|
|
|
|
|
|
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public class FilterDesc |
|
|
|
public class FilterDesc |
|
|
|