Remove IEnumerable from Filter / Query / Rule

Hopefully this makes it more clear
that these need to be disposed.
wip/source-generators
copygirl 2 years ago
parent 255352e7c4
commit f399da3cf0
  1. 2
      src/gaemstone.Client/Systems/Renderer.cs
  2. 14
      src/gaemstone/ECS/Filter.cs
  3. 13
      src/gaemstone/ECS/Query.cs
  4. 13
      src/gaemstone/ECS/Rule.cs
  5. 2
      src/gaemstone/ECS/System.cs

@ -98,7 +98,7 @@ public class Renderer
(Mesh, $mesh), MeshHandle($mesh),
?(Texture, $tex), ?TextureHandle($tex)
"));
foreach (var iter in _renderEntityRule) {
foreach (var iter in _renderEntityRule.Iter()) {
var transforms = iter.Field<GlobalTransform>(1);
var meshes = iter.Field<MeshHandle>(3);
// var texPairs = iter.MaybeField<Identifier>(4);

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

@ -1,14 +1,11 @@
using System;
using System.Collections;
using System.Collections.Generic;
using gaemstone.Utility;
using static flecs_hub.flecs;
namespace gaemstone.ECS;
public unsafe sealed class Query
: IEnumerable<Iterator>
, IDisposable
: IDisposable
{
public Universe Universe { get; }
public ecs_query_t* Handle { get; }
@ -24,15 +21,13 @@ public unsafe sealed class Query
public void Dispose()
=> ecs_query_fini(this);
public Iterator Iter()
=> new(Universe, IteratorType.Query, ecs_query_iter(Universe, 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

@ -1,14 +1,11 @@
using System;
using System.Collections;
using System.Collections.Generic;
using gaemstone.Utility;
using static flecs_hub.flecs;
namespace gaemstone.ECS;
public unsafe sealed class Rule
: IEnumerable<Iterator>
, IDisposable
: IDisposable
{
public Universe Universe { get; }
public ecs_rule_t* Handle { get; }
@ -24,13 +21,11 @@ public unsafe sealed class Rule
public void Dispose()
=> ecs_rule_fini(this);
public Iterator Iter()
=> new(Universe, IteratorType.Rule, ecs_rule_iter(Universe, this));
public override string ToString()
=> ecs_rule_str(Handle).FlecsToStringAndFree()!;
public static implicit operator ecs_rule_t*(Rule q) => q.Handle;
// IEnumerable implementation
public Iterator Iter() => new(Universe, IteratorType.Rule, ecs_rule_iter(Universe, this));
public IEnumerator<Iterator> GetEnumerator() => Iter().GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}

@ -112,7 +112,7 @@ public static class SystemExtensions
var type = (&flecsIter->next == (delegate*<ecs_iter_t*, Runtime.CBool>)&ecs_query_next)
? IteratorType.Query : (IteratorType?)null;
var iter = new Iterator(callback.Universe, type, *flecsIter);
using var iter = new Iterator(callback.Universe, type, *flecsIter);
callback.Prepare(iter);

Loading…
Cancel
Save