using System.Runtime.CompilerServices; using Svelto.DataStructures; using Svelto.ECS.Hybrid; using Svelto.ECS.Internal; namespace Svelto.ECS { public static class EntityManagedDBExtensions { [MethodImpl(MethodImplOptions.AggressiveInlining)] public static MB QueryEntitiesAndIndex (this EntitiesDB entitiesDb, EGID entityGID, out uint index) where T : struct, IEntityViewComponent { if (entitiesDb.QueryEntitiesAndIndexInternal(entityGID, out index, out MB array) == true) return array; throw new EntityNotFoundException(entityGID, typeof(T)); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool TryQueryEntitiesAndIndex (this EntitiesDB entitiesDb, EGID entityGID, out uint index, out MB array) where T : struct, IEntityViewComponent { if (entitiesDb.QueryEntitiesAndIndexInternal(entityGID, out index, out array) == true) return true; return false; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool TryQueryEntitiesAndIndex (this EntitiesDB entitiesDb, uint id, ExclusiveGroupStruct group, out uint index, out MB array) where T : struct, IEntityViewComponent { if (entitiesDb.QueryEntitiesAndIndexInternal(new EGID(id, group), out index, out array) == true) return true; return false; } [MethodImpl(MethodImplOptions.AggressiveInlining)] static bool QueryEntitiesAndIndexInternal (this EntitiesDB entitiesDb, EGID entityGID, out uint index, out MB buffer) where T : struct, IEntityViewComponent { index = 0; buffer = default; if (entitiesDb.SafeQueryEntityDictionary(entityGID.groupID, out var safeDictionary) == false) return false; if (safeDictionary.TryFindIndex(entityGID.entityID, out index) == false) return false; buffer = (MBInternal) (safeDictionary as ITypeSafeDictionary).GetValues(out _); return true; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ref T QueryEntity (this EntitiesDB entitiesDb, EGID entityGID) where T : struct, IEntityViewComponent { var array = entitiesDb.QueryEntitiesAndIndex(entityGID, out var index); return ref array[(int) index]; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ref T QueryEntity (this EntitiesDB entitiesDb, uint id, ExclusiveGroupStruct group) where T : struct, IEntityViewComponent { return ref entitiesDb.QueryEntity(new EGID(id, group)); } /// /// Expects that only one entity of type T exists in the group /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ref T QueryUniqueEntity (this EntitiesDB entitiesDb, ExclusiveGroupStruct group) where T : struct, IEntityViewComponent { var (entities, entitiescount) = entitiesDb.QueryEntities(@group); #if DEBUG && !PROFILE_SVELTO if (entitiescount == 0) throw new ECSException("Unique entity not found '".FastConcat(typeof(T).ToString()).FastConcat("'")); if (entitiescount != 1) throw new ECSException("Unique entities must be unique! '".FastConcat(typeof(T).ToString()) .FastConcat("'")); #endif return ref entities[0]; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static MB GetArrayAndEntityIndex (this EGIDMapper mapper, uint entityID, out uint index) where T : struct, IEntityViewComponent { if (mapper._map.TryFindIndex(entityID, out index)) { return (MBInternal) mapper._map.GetValues(out _); } throw new ECSException("Entity not found"); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool TryGetArrayAndEntityIndex (this EGIDMapper mapper, uint entityID, out uint index, out MB array) where T : struct, IEntityViewComponent { index = default; if (mapper._map != null && mapper._map.TryFindIndex(entityID, out index)) { array = (MBInternal) mapper._map.GetValues(out _); return true; } array = default; return false; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static AllGroupsEnumerable QueryEntities(this EntitiesDB db) where T1 :struct, IEntityViewComponent { return new AllGroupsEnumerable(db); } } }