using System.Collections; using System.Collections.Generic; using Encompass.Collections; namespace Encompass { internal struct EntitySetQuery { private BitSet WithImmediateMask { get; } private BitSet WithExistingMask { get; } private BitSet WithoutImmediateMask { get; } private BitSet WithoutExistingMask { get; } private BitSet NotWithMask { get; } internal EntitySetQuery(BitSet withImmediateMask, BitSet withExistingMask, BitSet withoutImmediateMask, BitSet withoutExistingMask, BitSet notWithMask) { WithImmediateMask = withImmediateMask; WithExistingMask = withExistingMask; WithoutImmediateMask = withoutImmediateMask; WithoutExistingMask = withoutExistingMask; NotWithMask = notWithMask; } public IEnumerable FilterEntities(IEnumerable entities, ComponentBitSet immediateBitLookup, ComponentBitSet existingBitLookup) { foreach (var entity in entities) { var immediateBits = immediateBitLookup.EntityBitArray(entity.ID); var existingBits = existingBitLookup.EntityBitArray(entity.ID); var immediate = WithImmediateMask.And(immediateBits); var existing = WithExistingMask.And(existingBits); var withCheck = immediate.Or(existing).Or(NotWithMask); var immediateForbidden = WithoutImmediateMask.And(immediateBits).Not(); var existingForbidden = WithoutExistingMask.And(existingBits).Not(); var withoutCheck = immediateForbidden.And(existingForbidden); if (withCheck.And(withoutCheck).AllTrue()) { yield return entity; } } } } }