|
|
|
using System;
|
|
|
|
using System.Collections;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using static flecs_hub.flecs;
|
|
|
|
|
|
|
|
namespace gaemstone.ECS;
|
|
|
|
|
|
|
|
public unsafe sealed class Query
|
|
|
|
: IEnumerable<Iterator>
|
|
|
|
, IDisposable
|
|
|
|
{
|
|
|
|
public Universe Universe { get; }
|
|
|
|
public ecs_query_t* Handle { get; }
|
|
|
|
|
|
|
|
private Query(Universe universe, ecs_query_t* handle)
|
|
|
|
{ Universe = universe; Handle = handle; }
|
|
|
|
private Query(Universe universe, ecs_query_desc_t desc)
|
|
|
|
: this(universe, ecs_query_init(universe, &desc)) { }
|
|
|
|
|
|
|
|
public Query(Universe universe, QueryDesc desc)
|
|
|
|
: this(universe, desc.ToFlecs()) { }
|
|
|
|
|
|
|
|
public void Dispose()
|
|
|
|
=> ecs_query_fini(this);
|
|
|
|
|
|
|
|
public override string ToString()
|
|
|
|
=> ecs_query_str(Handle).FlecsToStringAndFree()!;
|
|
|
|
|
|
|
|
public static implicit operator ecs_query_t*(Query q) => q.Handle;
|
|
|
|
|
|
|
|
// IEnumerable implementation
|
|
|
|
public Iterator Iter() => new(Universe, IteratorType.Query, ecs_query_iter(Universe, this));
|
|
|
|
public IEnumerator<Iterator> GetEnumerator() => Iter().GetEnumerator();
|
|
|
|
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
|
|
|
|
}
|
|
|
|
|
|
|
|
public class QueryDesc : FilterDesc
|
|
|
|
{
|
|
|
|
public QueryDesc(string? name = null, params Term[] terms)
|
|
|
|
: base(name, terms) { }
|
|
|
|
|
|
|
|
public new unsafe ecs_query_desc_t ToFlecs()
|
|
|
|
{
|
|
|
|
var desc = new ecs_query_desc_t {
|
|
|
|
filter = base.ToFlecs(),
|
|
|
|
// TODO: Implement more Query features.
|
|
|
|
};
|
|
|
|
return desc;
|
|
|
|
}
|
|
|
|
}
|