diff --git a/src/Utils/Exceptions.cs b/src/Utils/Exceptions.cs index 7245b3b..04fa33a 100644 --- a/src/Utils/Exceptions.cs +++ b/src/Utils/Exceptions.cs @@ -141,6 +141,11 @@ namespace DCFApixels.DragonECS.Core.Internal { throw new ArgumentException("The groups belong to different worlds."); } + [MethodImpl(MethodImplOptions.NoInlining)] + internal static void ArgumentDifferentWorldsException() + { + throw new ArgumentException("The groups belong to different worlds."); + } [MethodImpl(MethodImplOptions.NoInlining)] diff --git a/src/entlong.cs b/src/entlong.cs index d8f38b2..b93a608 100644 --- a/src/entlong.cs +++ b/src/entlong.cs @@ -136,7 +136,7 @@ namespace DCFApixels.DragonECS } #endregion - #region Unpacking + #region Unpacking Try [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool TryGetID(out int id) { @@ -156,6 +156,90 @@ namespace DCFApixels.DragonECS return IsAlive; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool TryUnpack(out int id) + { + id = _id; + return IsAlive; + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool TryUnpack(out int id, out EcsWorld world) + { + world = GetWorld_Internal(); + id = _id; + return IsAlive; + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool TryUnpack(out int id, out short gen, out EcsWorld world) + { + world = GetWorld_Internal(); + gen = _gen; + id = _id; + return IsAlive; + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool TryUnpack(out int id, out short worldID) + { + worldID = _world; + id = _id; + return IsAlive; + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool TryUnpack(out int id, out short gen, out short worldID) + { + worldID = _world; + gen = _gen; + id = _id; + return IsAlive; + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool TryUnpack(EcsWorld world, out int id) + { + if (world.ID != _world) { Throw.ArgumentDifferentWorldsException(); } + id = _id; + return world.IsAlive(_id, _gen); + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool TryUnpack(EcsWorld world, out int id, out short gen) + { + if (world.ID != _world) { Throw.ArgumentDifferentWorldsException(); } + gen = _gen; + id = _id; + return world.IsAlive(_id, _gen); + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool TryUnpack(EcsMask mask, out int id) + { + if (mask.WorldID != _world) { Throw.ArgumentDifferentWorldsException(); } + id = _id; + return mask.World.IsAlive(_id, _gen); + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool TryUnpack(EcsMask mask, out int id, out short gen) + { + if (mask.WorldID != _world) { Throw.ArgumentDifferentWorldsException(); } + gen = _gen; + id = _id; + return mask.World.IsAlive(_id, _gen); + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool TryUnpack(EcsAspect aspect, out int id) + { + if (aspect.World.ID != _world) { Throw.ArgumentDifferentWorldsException(); } + id = _id; + return aspect.World.IsAlive(_id, _gen); + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool TryUnpack(EcsAspect aspect, out int id, out short gen) + { + if (aspect.World.ID != _world) { Throw.ArgumentDifferentWorldsException(); } + gen = _gen; + id = _id; + return aspect.World.IsAlive(_id, _gen); + } + #endregion + + #region Unpacking/Deconstruct [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Unpack(out int id) { @@ -238,46 +322,13 @@ namespace DCFApixels.DragonECS gen = _gen; id = _id; } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool TryUnpack(out int id) - { - id = _id; - return IsAlive; - } + public void Deconstruct(out int id, out short gen, out short worldID) { Unpack(out id, out gen, out worldID); } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool TryUnpack(out int id, out EcsWorld world) - { - world = GetWorld_Internal(); - id = _id; - return IsAlive; - } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool TryUnpack(out int id, out short gen, out EcsWorld world) - { - world = GetWorld_Internal(); - gen = _gen; - id = _id; - return IsAlive; - } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool TryUnpack(out int id, out short worldID) - { - worldID = _world; - id = _id; - return IsAlive; - } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool TryUnpack(out int id, out short gen, out short worldID) - { - worldID = _world; - gen = _gen; - id = _id; - return IsAlive; - } + public void Deconstruct(out int id, out EcsWorld world) { Unpack(out id, out world); } #endregion - #region Unpacking + #region Unpacking Unchecked [MethodImpl(MethodImplOptions.AggressiveInlining)] public int GetIDUnchecked() { @@ -352,13 +403,6 @@ namespace DCFApixels.DragonECS public static explicit operator int(entlong a) { return a.ID; } #endregion - #region Deconstruct - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void Deconstruct(out int id, out short gen, out short worldID) { Unpack(out id, out gen, out worldID); } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void Deconstruct(out int id, out EcsWorld world) { Unpack(out id, out world); } - #endregion - #region Other [MethodImpl(MethodImplOptions.AggressiveInlining)] private EcsWorld GetWorld_Internal()