From ad505869018a37934d21ae4a97b55734ac0541bf Mon Sep 17 00:00:00 2001 From: andreakarasho Date: Fri, 31 May 2024 20:01:59 +0200 Subject: [PATCH] improved query iter --- src/Query.cs | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/Query.cs b/src/Query.cs index 4c52ab3..ddaaca1 100644 --- a/src/Query.cs +++ b/src/Query.cs @@ -4,31 +4,33 @@ namespace TinyEcs; public ref struct QueryInternal { - private readonly ReadOnlySpan _archetypes; - private int _index; + private ref Archetype _value; + private readonly ref Archetype _first, _last; - internal QueryInternal(ReadOnlySpan archetypes) + internal QueryInternal(Span archetypes) { - _archetypes = archetypes; - _index = -1; + _first = ref MemoryMarshal.GetReference(archetypes); + _last = ref Unsafe.Add(ref _first, archetypes.Length); + _value = ref Unsafe.NullRef(); } - public readonly Archetype Current => _archetypes[_index]; + public readonly ref Archetype Current => ref _value; public bool MoveNext() { - while (++_index < _archetypes.Length) + while (true) { - var arch = _archetypes[_index]; - if (arch.Count > 0) + _value = ref Unsafe.IsNullRef(ref _value) ? ref _first : ref Unsafe.Add(ref _value, 1); + if (!Unsafe.IsAddressLessThan(ref _value, ref _last)) + break; + + if (_value.Count > 0) return true; } return false; } - public void Reset() => _index = -1; - public readonly QueryInternal GetEnumerator() => this; }