using System; using gaemstone.ECS.Utility; using static flecs_hub.flecs; namespace gaemstone.ECS; public unsafe class Query : IDisposable { public World World { get; } public ecs_query_t* Handle { get; } public Filter Filter { get; } public Variable? ThisVar => Filter.ThisVar; public Query(World world, QueryDesc desc) { using var alloc = TempAllocator.Use(); var flecsDesc = desc.ToFlecs(alloc); World = world; Handle = ecs_query_init(world, &flecsDesc); Filter = new(world, ecs_query_get_filter(Handle)); } public void Dispose() => ecs_query_fini(this); public QueryIterator Iter() => new(ecs_query_iter(World, this)); public override string ToString() => ecs_query_str(Handle).FlecsToStringAndFree()!; public static implicit operator ecs_query_t*(Query query) => query.Handle; } public unsafe class QueryIterator : Iterator { internal QueryIterator(ecs_iter_t value) : base(value) { } public override bool Next() => ecs_query_next(Handle); } public class QueryDesc : FilterDesc { public QueryDesc(params Term[] terms) : base(terms) { } public QueryDesc(string expression) : base(expression) { } public new unsafe ecs_query_desc_t ToFlecs(IAllocator alloc) { var desc = new ecs_query_desc_t { filter = base.ToFlecs(alloc), // TODO: Implement more Query features. }; return desc; } }