From 4268762a0c8570c017ff75d164a571a4c41a8ee5 Mon Sep 17 00:00:00 2001 From: cosmonaut Date: Thu, 6 Apr 2023 14:54:20 -0700 Subject: [PATCH] fix EntitiesInRandomOrder --- src/Filter.cs | 2 +- src/FilterStorage.cs | 29 +++++++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/Filter.cs b/src/Filter.cs index d08e1ca..f841c39 100644 --- a/src/Filter.cs +++ b/src/Filter.cs @@ -15,7 +15,7 @@ namespace MoonTools.ECS } public ReverseSpanEnumerator Entities => FilterStorage.FilterEntities(Signature); - public LinearCongruentialEnumerator EntitiesInRandomOrder => FilterStorage.FilterEntitiesRandom(Signature); + public RandomEntityEnumerator EntitiesInRandomOrder => FilterStorage.FilterEntitiesRandom(Signature); public Entity RandomEntity => FilterStorage.FilterRandomEntity(Signature); public int Count => FilterStorage.FilterCount(Signature); diff --git a/src/FilterStorage.cs b/src/FilterStorage.cs index 91b3a0c..804ed93 100644 --- a/src/FilterStorage.cs +++ b/src/FilterStorage.cs @@ -54,9 +54,12 @@ namespace MoonTools.ECS return filterSignatureToEntityIDs[filterSignature].GetEnumerator(); } - public LinearCongruentialEnumerator FilterEntitiesRandom(FilterSignature filterSignature) + public RandomEntityEnumerator FilterEntitiesRandom(FilterSignature filterSignature) { - return RandomGenerator.LinearCongruentialGenerator(FilterCount(filterSignature)); + return new RandomEntityEnumerator( + this, + filterSignature, + RandomGenerator.LinearCongruentialGenerator(FilterCount(filterSignature))); } public Entity FilterNthEntity(FilterSignature filterSignature, int index) @@ -178,4 +181,26 @@ namespace MoonTools.ECS removeCallbacks.Add(filterSignature, callback); } } + + public ref struct RandomEntityEnumerator + { + public RandomEntityEnumerator GetEnumerator() => this; + + private FilterStorage FilterStorage; + private FilterSignature FilterSignature; + private LinearCongruentialEnumerator LinearCongruentialEnumerator; + + internal RandomEntityEnumerator( + FilterStorage filterStorage, + FilterSignature filterSignature, + LinearCongruentialEnumerator linearCongruentialEnumerator) + { + FilterStorage = filterStorage; + FilterSignature = filterSignature; + LinearCongruentialEnumerator = linearCongruentialEnumerator; + } + + public bool MoveNext() => LinearCongruentialEnumerator.MoveNext(); + public Entity Current => FilterStorage.FilterNthEntity(FilterSignature, LinearCongruentialEnumerator.Current); + } }