From 6ae6775e008efc831f32d62567052490fe53f2be Mon Sep 17 00:00:00 2001 From: Mikhail <99481254+DCFApixels@users.noreply.github.com> Date: Sun, 12 Mar 2023 01:33:48 +0800 Subject: [PATCH] Update runner --- src/Builtin/InjectProcessor.cs | 5 ++ src/Interfaces/IEcsProcessor.cs | 1 - src/React/EcsProcessorsMessenger.cs | 50 ----------------- src/React/EcsProcessorsRunner.cs | 45 --------------- src/React/{RunnerHandler.cs => EcsRunner.cs} | 55 +++++++++---------- ...unnerHandler.cs.meta => EcsRunner.cs.meta} | 0 src/React/WorldFilterAttribute.cs | 15 ----- 7 files changed, 32 insertions(+), 139 deletions(-) delete mode 100644 src/React/EcsProcessorsMessenger.cs delete mode 100644 src/React/EcsProcessorsRunner.cs rename src/React/{RunnerHandler.cs => EcsRunner.cs} (63%) rename src/React/{RunnerHandler.cs.meta => EcsRunner.cs.meta} (100%) delete mode 100644 src/React/WorldFilterAttribute.cs diff --git a/src/Builtin/InjectProcessor.cs b/src/Builtin/InjectProcessor.cs index e6800bf..0145497 100644 --- a/src/Builtin/InjectProcessor.cs +++ b/src/Builtin/InjectProcessor.cs @@ -6,8 +6,13 @@ using System.Threading.Tasks; namespace DCFApixels.DragonECS { + public interface IEcsInject + { + public void Inject(T obj); + } public class InjectProcessor : IDo<_PreInit> { + private T _injectedData; public InjectProcessor(T injectedData) diff --git a/src/Interfaces/IEcsProcessor.cs b/src/Interfaces/IEcsProcessor.cs index 3d3f9de..b3db294 100644 --- a/src/Interfaces/IEcsProcessor.cs +++ b/src/Interfaces/IEcsProcessor.cs @@ -1,6 +1,5 @@ namespace DCFApixels.DragonECS { - public interface IEcsProcessor { } public struct _PreInit { } public struct _Init { } diff --git a/src/React/EcsProcessorsMessenger.cs b/src/React/EcsProcessorsMessenger.cs deleted file mode 100644 index 8357ff5..0000000 --- a/src/React/EcsProcessorsMessenger.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System.Collections.Generic; -using System; - -namespace DCFApixels.DragonECS -{ - public interface IEcsProcessorsMessenger - { - public EcsSession Source { get; } - } - public interface IEcsProcessorsMessenger : IEcsProcessorsMessenger where TMessage : IEcsMessage { } - public class EcsProcessorsMessenger : IEcsProcessorsMessenger, IDisposable - where TMessage : IEcsMessage - { - private readonly EcsSession _source; - private readonly IReceive[] _targets; - - public EcsSession Source => _source; - public IReadOnlyList> Targets => _targets; - - internal EcsProcessorsMessenger(EcsSession source) - { - _source = source; - List> list = new List>(); - - foreach (var item in _source.AllProcessors) - { - if (item is IReceive targetItem) - { - list.Add(targetItem); - } - } - _targets = list.ToArray(); - } - - public void Send(TMessage message) - { - Send(in message); - } - public void Send(in TMessage message) - { - foreach (var item in _targets) - { - item.Do(_source, in message); - } - } - - public void Destroy() => _source.OnMessengerDetroyed(this); - void IDisposable.Dispose() => Destroy(); - } -} diff --git a/src/React/EcsProcessorsRunner.cs b/src/React/EcsProcessorsRunner.cs deleted file mode 100644 index 17a87a3..0000000 --- a/src/React/EcsProcessorsRunner.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace DCFApixels.DragonECS -{ - public interface IEcsProcessorsRunner - { - public EcsSession Source { get; } - public void Run(); - } - public class EcsProcessorsRunner : IEcsProcessorsRunner, IDisposable - { - private readonly EcsSession _source; - private readonly IDo[] _targets; - - public EcsSession Source => _source; - public IReadOnlyList> Targets => _targets; - - internal EcsProcessorsRunner(EcsSession source) - { - _source = source; - List> list = new List>(); - - foreach (var item in _source.AllProcessors) - { - if (item is IDo targetItem) - { - list.Add(targetItem); - } - } - _targets = list.ToArray(); - } - - public void Run() - { - foreach (var item in _targets) - { - item.Do(_source); - } - } - - public void Destroy() => _source.OnRunnerDetroyed(this); - void IDisposable.Dispose() => Destroy(); - } -} diff --git a/src/React/RunnerHandler.cs b/src/React/EcsRunner.cs similarity index 63% rename from src/React/RunnerHandler.cs rename to src/React/EcsRunner.cs index 85776e3..6bf50be 100644 --- a/src/React/RunnerHandler.cs +++ b/src/React/EcsRunner.cs @@ -7,35 +7,35 @@ using System.Runtime.CompilerServices; namespace DCFApixels.DragonECS { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = true)] - sealed class RunnerFilterAttribute : Attribute + sealed class EcsRunnerFilterAttribute : Attribute { public readonly Type interfaceType; public readonly object filter; - public RunnerFilterAttribute(Type interfaceType, object filter) + public EcsRunnerFilterAttribute(Type interfaceType, object filter) { this.interfaceType = interfaceType; this.filter = filter; } } - public interface IProcessor { } + public interface IEcsProcessor { } - public static class IProcessorExtensions + public static class IEcsProcessorExtensions { - public static bool IsRunner(this IProcessor self) + public static bool IsRunner(this IEcsProcessor self) { - return self is IRunner; + return self is IEcsRunner; } } - internal static class RunnerActivator + internal static class EcsRunnerActivator { private static bool _isInit = false; [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Init() { if (_isInit) return; - Type targetType = typeof(Runner<>); + Type targetType = typeof(EcsRunner<>); var subclasses = Assembly.GetAssembly(targetType).GetTypes().Where(type => type.BaseType != null && type.BaseType.IsGenericType && targetType == type.BaseType.GetGenericTypeDefinition()); foreach (var item in subclasses) { @@ -45,10 +45,11 @@ namespace DCFApixels.DragonECS } } - public interface IRunner { } - public abstract class Runner : IProcessor, IRunner - where TInterface : IProcessor + public interface IEcsRunner { } + + public abstract class EcsRunner : IEcsProcessor, IEcsRunner + where TInterface : IEcsProcessor { internal static void Init(Type subclass) { @@ -66,58 +67,56 @@ namespace DCFApixels.DragonECS { throw new ArgumentException($"{typeof(TInterface).FullName} is not interface"); } - if (interfaces.Length != 1 || interfaces[0] != typeof(IProcessor)) + if (interfaces.Length != 1 || interfaces[0] != typeof(IEcsProcessor)) { - throw new ArgumentException($"{typeof(TInterface).FullName} does not directly inherit the {nameof(IProcessor)} interface"); + throw new ArgumentException($"{typeof(TInterface).FullName} does not directly inherit the {nameof(IEcsProcessor)} interface"); } #endif _subclass = subclass; } - public static TInterface Instantiate(IEnumerable targets, object filter) + public static TInterface Instantiate(IEnumerable targets, object filter) { Type interfaceType = typeof(TInterface); - IEnumerable newTargets; + IEnumerable newTargets = targets.OfType(); if (filter != null) { - newTargets = targets.Where(o => + newTargets = newTargets.Where(o => { if (o is TInterface == false) return false; - var atr = o.GetType().GetCustomAttribute(); + var atr = o.GetType().GetCustomAttribute(); return atr != null && atr.interfaceType == interfaceType && atr.filter.Equals(filter); }); } else { - newTargets = targets.Where(o => + newTargets = newTargets.Where(o => { if (o is TInterface == false) return false; - var atr = o.GetType().GetCustomAttribute(); + var atr = o.GetType().GetCustomAttribute(); return atr == null || atr.interfaceType == interfaceType && atr.filter == null; }); } - return Instantiate(newTargets.Select(o => (TInterface)o).ToArray()); + return Instantiate(newTargets.ToArray()); } - public static TInterface Instantiate(IEnumerable targets) + public static TInterface Instantiate(IEnumerable targets) { - return Instantiate(targets.Where(o => o is TInterface).Select(o => (TInterface)o).ToArray()); + return Instantiate(targets.OfType().ToArray()); } internal static TInterface Instantiate(TInterface[] targets) { - RunnerActivator.Init(); - var instance = (Runner)Activator.CreateInstance(_subclass); - return (TInterface)(IProcessor)instance.Set(targets); + EcsRunnerActivator.Init(); + var instance = (EcsRunner)Activator.CreateInstance(_subclass); + return (TInterface)(IEcsProcessor)instance.Set(targets); } - - private static Type _subclass; protected TInterface[] targets; - private Runner Set(TInterface[] targets) + private EcsRunner Set(TInterface[] targets) { this.targets = targets; return this; diff --git a/src/React/RunnerHandler.cs.meta b/src/React/EcsRunner.cs.meta similarity index 100% rename from src/React/RunnerHandler.cs.meta rename to src/React/EcsRunner.cs.meta diff --git a/src/React/WorldFilterAttribute.cs b/src/React/WorldFilterAttribute.cs deleted file mode 100644 index c4a0358..0000000 --- a/src/React/WorldFilterAttribute.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace DCFApixels.Assets.DragonECS.src.React -{ - [AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = false)] - sealed class WorldFilterAttribute : Attribute //TODO - { - public readonly string[] worlds; - - public WorldFilterAttribute(params string[] worlds) - { - this.worlds = worlds; - } - } -}