Update EcsSubject.cs

This commit is contained in:
Mikhail 2023-06-02 04:00:08 +08:00
parent 1c5ce4561b
commit 9aef47e66b

View File

@ -125,21 +125,18 @@ namespace DCFApixels.DragonECS
#endregion #endregion
} }
#endregion #endregion
}
#region Extensions #region Iterator
public static class EcsSubjectExtensions public EcsSubjectIterator GetIterator<TSubject>() where TSubject : EcsSubject
{ {
public static EcsSubjectIterator<TSubject> GetIterator<TSubject>(this TSubject self) where TSubject : EcsSubject return new EcsSubjectIterator(this, World.Entities);
{
return new EcsSubjectIterator<TSubject>(self, self.World.Entities);
} }
public static EcsSubjectIterator<TSubject> GetIteratorFor<TSubject>(this TSubject self, EcsReadonlyGroup sourceGroup) where TSubject : EcsSubject public EcsSubjectIterator GetIteratorFor<TSubject>(EcsReadonlyGroup sourceGroup) where TSubject : EcsSubject
{ {
return new EcsSubjectIterator<TSubject>(self, sourceGroup); return new EcsSubjectIterator(this, sourceGroup);
}
} }
#endregion #endregion
}
#region BuilderBase #region BuilderBase
public abstract class EcsSubjectBuilderBase public abstract class EcsSubjectBuilderBase
@ -201,20 +198,20 @@ namespace DCFApixels.DragonECS
#endregion #endregion
#region Iterator #region Iterator
public ref struct EcsSubjectIterator<TSubject> where TSubject : EcsSubject public ref struct EcsSubjectIterator
{ {
public readonly TSubject s; public readonly EcsMask mask;
private EcsReadonlyGroup _sourceGroup; private EcsReadonlyGroup _sourceGroup;
private Enumerator _enumerator; private Enumerator _enumerator;
public EcsSubjectIterator(TSubject s, EcsReadonlyGroup sourceGroup) public EcsSubjectIterator(EcsSubject subject, EcsReadonlyGroup sourceGroup)
{ {
this.s = s; mask = subject.mask;
_sourceGroup = sourceGroup; _sourceGroup = sourceGroup;
_enumerator = default; _enumerator = default;
} }
public int Entity public int Current
{ {
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
get => _enumerator.Current; get => _enumerator.Current;
@ -230,9 +227,8 @@ namespace DCFApixels.DragonECS
while (enumerator.MoveNext()) while (enumerator.MoveNext())
group.AddInternal(enumerator.Current); group.AddInternal(enumerator.Current);
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Enumerator GetEnumerator() => new Enumerator(_sourceGroup, s);
#region object
public override string ToString() public override string ToString()
{ {
StringBuilder result = new StringBuilder(); StringBuilder result = new StringBuilder();
@ -243,6 +239,11 @@ namespace DCFApixels.DragonECS
} }
return result.ToString(); return result.ToString();
} }
#endregion
#region Enumerator
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Enumerator GetEnumerator() => new Enumerator(_sourceGroup, mask);
public ref struct Enumerator public ref struct Enumerator
{ {
@ -251,12 +252,12 @@ namespace DCFApixels.DragonECS
private readonly int[] _exc; private readonly int[] _exc;
private readonly IEcsPoolImplementation[] _pools; private readonly IEcsPoolImplementation[] _pools;
public Enumerator(EcsReadonlyGroup sourceGroup, EcsSubject subject) public Enumerator(EcsReadonlyGroup sourceGroup, EcsMask mask)
{ {
_sourceGroup = sourceGroup.GetEnumerator(); _sourceGroup = sourceGroup.GetEnumerator();
_inc = subject.mask._inc; _inc = mask._inc;
_exc = subject.mask._exc; _exc = mask._exc;
_pools = subject.World._pools; _pools = sourceGroup.World._pools;
} }
public int Current public int Current
{ {
@ -278,6 +279,7 @@ namespace DCFApixels.DragonECS
return false; return false;
} }
} }
#endregion
} }
#endregion #endregion
} }