rework data interfaces

This commit is contained in:
Mikhail 2024-01-25 20:11:06 +08:00
parent 21ee6aee00
commit 294a3af4ac

View File

@ -1,27 +1,5 @@
using System;
using System.Linq;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using static DCFApixels.DragonECS.Internal.DataInterfaceHalper;
namespace DCFApixels.DragonECS.Internal
{
#region DataInterfaceHalper
public static class DataInterfaceHalper
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void CheckFakeInstanceValide<T>(T fakeInstnace)
{
#if DEBUG
T nil = default;
if (fakeInstnace.Equals(nil) == false)
{
throw new Exception("Не правильное применение интерфейса, менять нужно передаваемое по ref значение");
}
#endif
}
}
#endregion
}
namespace DCFApixels.DragonECS namespace DCFApixels.DragonECS
{ {
#region IEcsWorldComponent #region IEcsWorldComponent
@ -36,11 +14,10 @@ namespace DCFApixels.DragonECS
public static readonly bool isHasHandler; public static readonly bool isHasHandler;
static EcsWorldComponentHandler() static EcsWorldComponentHandler()
{ {
Type targetType = typeof(T); T def = default;
isHasHandler = targetType.GetInterfaces().Contains(typeof(IEcsWorldComponent<>).MakeGenericType(targetType)); if (def is IEcsWorldComponent<T> intrf)
if (isHasHandler)
{ {
instance = (IEcsWorldComponent<T>)Activator.CreateInstance(typeof(WorldComponentHandler<>).MakeGenericType(targetType)); instance = intrf;
} }
else else
{ {
@ -54,23 +31,6 @@ namespace DCFApixels.DragonECS
public void OnDestroy(ref T component, EcsWorld world) { } public void OnDestroy(ref T component, EcsWorld world) { }
} }
} }
internal sealed class WorldComponentHandler<T> : IEcsWorldComponent<T>
where T : struct, IEcsWorldComponent<T>
{
private T _fakeInstnace = default;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void Init(ref T component, EcsWorld world)
{
_fakeInstnace.Init(ref component, world);
CheckFakeInstanceValide(_fakeInstnace);
}
public void OnDestroy(ref T component, EcsWorld world)
{
_fakeInstnace.OnDestroy(ref component, world);
CheckFakeInstanceValide(_fakeInstnace);
}
}
#endregion #endregion
#region IEcsComponentReset #region IEcsComponentReset
@ -84,11 +44,10 @@ namespace DCFApixels.DragonECS
public static readonly bool isHasHandler; public static readonly bool isHasHandler;
static EcsComponentResetHandler() static EcsComponentResetHandler()
{ {
Type targetType = typeof(T); T def = default;
isHasHandler = targetType.GetInterfaces().Contains(typeof(IEcsComponentReset<>).MakeGenericType(targetType)); if (def is IEcsComponentReset<T> intrf)
if (isHasHandler)
{ {
instance = (IEcsComponentReset<T>)Activator.CreateInstance(typeof(ComponentResetHandler<>).MakeGenericType(targetType)); instance = intrf;
} }
else else
{ {
@ -101,17 +60,6 @@ namespace DCFApixels.DragonECS
public void Reset(ref T component) => component = default; public void Reset(ref T component) => component = default;
} }
} }
internal sealed class ComponentResetHandler<T> : IEcsComponentReset<T>
where T : IEcsComponentReset<T>
{
private T _fakeInstnace = default;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void Reset(ref T component)
{
_fakeInstnace.Reset(ref component);
CheckFakeInstanceValide(_fakeInstnace);
}
}
#endregion #endregion
#region IEcsComponentCopy #region IEcsComponentCopy
@ -125,11 +73,10 @@ namespace DCFApixels.DragonECS
public static readonly bool isHasHandler; public static readonly bool isHasHandler;
static EcsComponentCopyHandler() static EcsComponentCopyHandler()
{ {
Type targetType = typeof(T); T def = default;
isHasHandler = targetType.GetInterfaces().Contains(typeof(IEcsComponentCopy<>).MakeGenericType(targetType)); if(def is IEcsComponentCopy<T> intrf)
if (isHasHandler)
{ {
instance = (IEcsComponentCopy<T>)Activator.CreateInstance(typeof(ComponentCopyHandler<>).MakeGenericType(targetType)); instance = intrf;
} }
else else
{ {
@ -142,16 +89,5 @@ namespace DCFApixels.DragonECS
public void Copy(ref T from, ref T to) => to = from; public void Copy(ref T from, ref T to) => to = from;
} }
} }
internal sealed class ComponentCopyHandler<T> : IEcsComponentCopy<T>
where T : IEcsComponentCopy<T>
{
private T _fakeInstnace = default;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void Copy(ref T from, ref T to)
{
_fakeInstnace.Copy(ref from, ref to);
CheckFakeInstanceValide(_fakeInstnace);
}
}
#endregion #endregion
} }