From 89daba3278f3425069ad72c1e889e2d5c12ffebb Mon Sep 17 00:00:00 2001 From: avery Date: Fri, 27 Feb 2026 19:50:38 -0500 Subject: [PATCH] Big work --- AwperativeKernel.sln.DotSettings.user | 2 + .../Kernel/Component/Component.cs | 46 +-- .../ComponentDocker/Attributes/DockerOwns.cs | 223 +++++++++++++ .../ComponentDocker/ComponentDockEnum.cs | 62 ++++ .../{ => Core}/ComponentDocker.cs | 303 ++++-------------- .../Core/ComponentDockerExposure.cs | 32 ++ .../Core/ComponentDockerManagement.cs | 189 +++++++++++ AwperativeKernel/Kernel/Debug/Debug.cs | 13 +- .../Kernel/Overhead/Awperative/Awperative.cs | 54 +++- .../net8.0/AwperativeKernel.AssemblyInfo.cs | 2 +- .../AwperativeKernel.AssemblyInfoInputs.cache | 2 +- ...ativeKernel.csproj.CoreCompileInputs.cache | 2 +- .../obj/Debug/net8.0/AwperativeKernel.dll | Bin 20992 -> 21504 bytes .../obj/Debug/net8.0/AwperativeKernel.pdb | Bin 18504 -> 18936 bytes .../obj/Debug/net8.0/ref/AwperativeKernel.dll | Bin 8704 -> 9728 bytes .../Debug/net8.0/refint/AwperativeKernel.dll | Bin 8704 -> 9728 bytes 16 files changed, 648 insertions(+), 282 deletions(-) create mode 100644 AwperativeKernel/Kernel/ComponentDocker/Attributes/DockerOwns.cs create mode 100644 AwperativeKernel/Kernel/ComponentDocker/ComponentDockEnum.cs rename AwperativeKernel/Kernel/ComponentDocker/{ => Core}/ComponentDocker.cs (51%) create mode 100644 AwperativeKernel/Kernel/ComponentDocker/Core/ComponentDockerExposure.cs create mode 100644 AwperativeKernel/Kernel/ComponentDocker/Core/ComponentDockerManagement.cs diff --git a/AwperativeKernel.sln.DotSettings.user b/AwperativeKernel.sln.DotSettings.user index 13e04fa..de6613a 100644 --- a/AwperativeKernel.sln.DotSettings.user +++ b/AwperativeKernel.sln.DotSettings.user @@ -1,4 +1,6 @@  + ForceIncluded + ForceIncluded <AssemblyExplorer> <Assembly Path="/Users/averynorris/Programming/Test/Awperative/Awperative/bin/Debug/net8.0/Awperative.dll" /> </AssemblyExplorer> \ No newline at end of file diff --git a/AwperativeKernel/Kernel/Component/Component.cs b/AwperativeKernel/Kernel/Component/Component.cs index e4f7652..79fe4ad 100644 --- a/AwperativeKernel/Kernel/Component/Component.cs +++ b/AwperativeKernel/Kernel/Component/Component.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Collections.ObjectModel; +using System.Diagnostics; using System.Linq; using System.Reflection; using Microsoft.VisualBasic; @@ -12,15 +13,15 @@ namespace AwperativeKernel; -public abstract partial class Component : ComponentDocker +public abstract partial class Component : ComponentDocker, IDisposable { - - - + + + /// /// Current parent of the Component. Can be either Scene or another Component. /// - public ComponentDocker ComponentDocker { get; internal set; } + public ComponentDocker ComponentDocker { get; internal set; } = null; @@ -38,12 +39,8 @@ public abstract partial class Component : ComponentDocker - /// - internal Collection EventDelegates = []; - - @@ -58,30 +55,6 @@ public abstract partial class Component : ComponentDocker - /// - /// To be called when the Component is created. - /// - /// Docker that this spawned in this Component - /// Name of the component - internal void Initiate(ComponentDocker __parent, string __name, ICollection __tags, Type __type) { - ComponentDocker = __parent; - Name = __name; - _tags = [..__tags]; - - if (Awperative._TypeAssociatedTimeEvents.TryGetValue(__type, out byte eventProfile)) { - - for (int i = 0; i < Awperative.ComponentEvents.Count; i++) { - if ((eventProfile & (1 << i)) > 0) - EventDelegates.Add((Action)Delegate.CreateDelegate(typeof(Action), this, __type.GetMethod(Awperative.ComponentEvents[i])!)); - else EventDelegates.Add(null); - } - } else { - Debug.LogError("Awperative does not recognize the given type! Perhaps it was created after Start() was called?", ["Type"], [__type.Name]); - } - } - - - /// @@ -98,7 +71,8 @@ public abstract partial class Component : ComponentDocker public void TryEvent(int __timeEvent) { - EventDelegates[__timeEvent]?.Invoke(); + Action eventDelegates = Awperative._TypeAssociatedTimeEvents[GetType()][__timeEvent]; + eventDelegates?.Invoke(this); } @@ -234,4 +208,8 @@ public abstract partial class Component : ComponentDocker for (int i = 0; i < targets.Count; i++) targets.InsertRange(i + 1, targets[i]._Components); return [..targets]; } + + public virtual void Dispose() { + GC.SuppressFinalize(this); + } } \ No newline at end of file diff --git a/AwperativeKernel/Kernel/ComponentDocker/Attributes/DockerOwns.cs b/AwperativeKernel/Kernel/ComponentDocker/Attributes/DockerOwns.cs new file mode 100644 index 0000000..61e39cf --- /dev/null +++ b/AwperativeKernel/Kernel/ComponentDocker/Attributes/DockerOwns.cs @@ -0,0 +1,223 @@ +using System; + + +namespace AwperativeKernel; + + +/// +/// Requires that the Docker owns the parameter +/// +[AttributeUsage(AttributeTargets.Parameter)] +public class DockerOwns : Attribute +{ + + + /// + /// Verifies if the Component is actually owned by Docker. Throws an error if not. + /// + /// Docker we are checking ownership for + /// Component to check for + public static bool VerifyOrThrow(ComponentDocker __docker, Component __component) { + if (__docker.Contains(__component)) return true; + + Debug.LogError("Docker does not own the Component!", ["ComponentType", "ComponentName", "ComponentHash", "DockerType", "DockerName", "DockerHash"], [ + __component.GetType().Name, + __component.Name, + __component.GetHashCode().ToString("N0"), + __docker.GetType().Name, + __docker switch { Scene scene => scene.Name, Component component => component.Name, _ => "unknown" }, + __docker.GetHashCode().ToString("N0") + ]); + + return Awperative.IgnoreErrors; + } +} + + + +/// +/// Requires that the Docker does not own the parameter +/// +[AttributeUsage(AttributeTargets.Parameter)] +public class DockerDoesntOwn : Attribute +{ + + + /// + /// Verifies if the Component is actually not owned by Docker. Throws an error if not. + /// + /// Docker we are checking ownership for + /// Component to check for + public static bool VerifyOrThrow(ComponentDocker __docker, Component __component) { + if (!__docker.Contains(__component)) return true; + + Debug.LogError("Docker owns the Component!", ["ComponentType", "ComponentName", "ComponentHash", "DockerType", "DockerName", "DockerHash"], [ + __component.GetType().Name, + __component.Name, + __component.GetHashCode().ToString("N0"), + __docker.GetType().Name, + __docker switch { Scene scene => scene.Name, Component component => component.Name, _ => "unknown" }, + __docker.GetHashCode().ToString("N0") + ]); + + return Awperative.IgnoreErrors; + } +} + + + +/// +/// Requires that the component is not attached to any Docker +/// +[AttributeUsage(AttributeTargets.Parameter)] +public class OrphanComponent : Attribute +{ + + + /// + /// Verifies if the Component is an orphan, not fully accurate, because it only checks if the docker is null, this means it is technically possible + /// to have a component already attached to a docker, and still verify it as false if Docker is null, but this should be impossible in practice. + /// + /// + /// + public static bool VerifyOrThrow(Component __component) { + if (__component.ComponentDocker == null) return true; + + Debug.LogError("Component is already owned!", ["ComponentType", "ComponentName", "ComponentHash", "DockerType", "DockerName", "DockerHash"], [ + __component.GetType().Name, + __component.Name, + __component.GetHashCode().ToString("N0"), + __component.ComponentDocker.GetType().Name, + __component.ComponentDocker switch { Scene scene => scene.Name, Component component => component.Name, _ => "unknown" }, + __component.ComponentDocker.GetHashCode().ToString("N0") + ]); + + return Awperative.IgnoreErrors; + } +} + + + +/// +/// Requires that the Component is not null +/// +[AttributeUsage(AttributeTargets.Parameter)] +public class ComponentNotNull : Attribute +{ + + + /// + /// Verifies if the Component is not null! Throws an error otherwise. + /// + /// + /// + public static bool VerifyOrThrow(Component __component) { + if (__component != null) return true; + + Debug.LogError("Component is null!"); + + return Awperative.IgnoreErrors; + } +} + + + +/// +/// Requires that the Docker is not null +/// +[AttributeUsage(AttributeTargets.Parameter)] +public class DockerNotNull : Attribute +{ + + + /// + /// Verifies if the Docker is not null! Throws an error otherwise. + /// + /// + /// + public static bool VerifyOrThrow(ComponentDocker __componentDocker) { + if (__componentDocker != null) return true; + + Debug.LogError("Docker is null!"); + + return Awperative.IgnoreErrors; + } +} + + + +/// +/// Requires that the Scene is not null +/// +[AttributeUsage(AttributeTargets.Parameter)] +public class SceneNotNull : Attribute +{ + + + /// + /// Verifies if the Scene is not null! Throws an error otherwise. + /// + /// + /// + public static bool VerifyOrThrow(Scene __scene) { + if (__scene != null) return true; + + Debug.LogError("Scene is null!"); + + return Awperative.IgnoreErrors; + } +} + + + +/// +/// Requires that the object is not null +/// +[AttributeUsage(AttributeTargets.Parameter)] +public class NotNull : Attribute +{ + + + /// + /// Verifies if the Scene is not null! Throws an error otherwise. + /// + /// + /// + public static bool VerifyOrThrow(Object __object) { + if (__object != null) return true; + + Debug.LogError("A Given parameter is null!", ["Type"], + [__object.GetType().Name + ]); + + return Awperative.IgnoreErrors; + } +} + + + +/// +/// Requires that the Docker is a different docker than the one given +/// +[AttributeUsage(AttributeTargets.Parameter)] +public class DifferentDocker : Attribute +{ + + + /// + /// Verifies if the Dockers are different! + /// + /// + /// + public static bool VerifyOrThrow(ComponentDocker __docker, ComponentDocker __other) { + if (__docker != __other) return true; + + Debug.LogError("The Dockers are the same!", ["DockerType, DockerName, DockerHash"], [ + __docker.GetType().Name, + __docker switch { Scene scene => scene.Name, Component component => component.Name, _ => "unknown" }, + __docker.GetHashCode().ToString("N0") + ]); + + return Awperative.IgnoreErrors; + } +} \ No newline at end of file diff --git a/AwperativeKernel/Kernel/ComponentDocker/ComponentDockEnum.cs b/AwperativeKernel/Kernel/ComponentDocker/ComponentDockEnum.cs new file mode 100644 index 0000000..11fde12 --- /dev/null +++ b/AwperativeKernel/Kernel/ComponentDocker/ComponentDockEnum.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections; +using System.Collections.Generic; + + +namespace AwperativeKernel; + + + +/// +/// Provides an Enumerator for the Component Docker, Loops through all Components in the Docker all for your convenience :) +/// +/// Reference to the Component Docker's components, (List to Enumerate through) +/// Enumerates on a snapshot of the list. This allows you to modify the ComponentDocker's collection during the loop. +/// Avery Norris +public class ComponentDockEnum(Component[] __components) : IEnumerator, IEnumerator, IDisposable +{ + + + + //Current index of the loop + private int index = -1; + + + + /// + /// Gets the current Component; + /// + public Component Current => __components[index]; + + + + /// + /// Get the current Component as a generic object + /// + object IEnumerator.Current => Current; + + + + /// + /// Proceeds to the next index of the loop + /// + /// Returns true or false, depending on whether the Enumeration should continue + bool IEnumerator.MoveNext() { ++index; return index < __components.Length; } + + + + /// + /// Resets the loop back to the very start + /// + public void Reset() => index = -1; + + + + /// + /// Destroys the enumerator + /// + public void Dispose() => GC.SuppressFinalize(this); + + + +} \ No newline at end of file diff --git a/AwperativeKernel/Kernel/ComponentDocker/ComponentDocker.cs b/AwperativeKernel/Kernel/ComponentDocker/Core/ComponentDocker.cs similarity index 51% rename from AwperativeKernel/Kernel/ComponentDocker/ComponentDocker.cs rename to AwperativeKernel/Kernel/ComponentDocker/Core/ComponentDocker.cs index 837a7b9..688b341 100644 --- a/AwperativeKernel/Kernel/ComponentDocker/ComponentDocker.cs +++ b/AwperativeKernel/Kernel/ComponentDocker/Core/ComponentDocker.cs @@ -1,9 +1,11 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Collections.Immutable; -using System.Collections.ObjectModel; +using System.Diagnostics; using System.Linq; using System.Reflection; +using AwperativeKernel.Attributes; namespace AwperativeKernel; @@ -14,9 +16,33 @@ namespace AwperativeKernel; /// /// Please don't inherit this. I don't know why you would /// Avery Norris -public abstract class ComponentDocker +public abstract partial class ComponentDocker : IEnumerable, IEnumerable, IEquatable, IEquatable { + public bool Equals(Component __other) { + if (this is Component component) { + return component == __other; + } else return false; + } + + public bool Equals(ComponentDocker __other) { + return this == __other; + } + + + //blocks external inheritance + internal ComponentDocker() {} + + + IEnumerator IEnumerable.GetEnumerator() { + return GetEnumerator(); + } + + public IEnumerator GetEnumerator() { + Console.WriteLine("enumerator called" + _Components.Count); + return new ComponentDockEnum([.._Components]); + } + /// @@ -37,7 +63,9 @@ public abstract class ComponentDocker /// Core of Docker, contains all of our precious Components. Sorts them by their priorities with highest going first. /// If they are equal it defaults to hash codes to ensure consistent Behavior /// - internal SortedSet _Components = new(_componentSorter); + internal List _Components = new(); + internal Dictionary> _ComponentDictionary = new(); + internal Dictionary> _taggedComponents = new(); @@ -60,163 +88,34 @@ public abstract class ComponentDocker /// New priority for Component internal void UpdatePriority(Component __component, int __priority) { //add ownership enforcement/method - - foreach (String tag in __component._tags) _taggedComponents[tag].Remove(__component); _Components.Remove(__component); - + _Components.Sort(_componentSorter); __component._priority = __priority; - - foreach (String tag in __component._tags) _taggedComponents[tag].Add(__component); _Components.Add(__component); } //internal void TryEvent(Component __component, Awperative.TimeEvent __timeEvent) => __component.TryEvent(__timeEvent); - - internal void ChainEvent(int __timeEvent) { foreach (Component component in _Components) { component.TryEvent(__timeEvent); component.ChainEvent(__timeEvent); }} - - - - - - - - - - - /// - /// Add a new Component to the Docker; This is the only way they should be created. - /// - /// Arguments to construct the Component with - /// Type of Component to instantiate - /// s - public __Type Add<__Type>(object[] __args, string name = "", ICollection tags = null) where __Type : Component { - - Type newComponentType = typeof(__Type); - - if(name == "") { name = newComponentType.Name; } - if (tags == null) tags = []; - - - - - //Component does not have a constructor that matches the given args - if (newComponentType.GetConstructor(__args.Select(x => x.GetType()).ToArray()) == null) { - Debug.LogError("Component cannot be constructed with the given arguments", - ["Type", "Args"], - [newComponentType.ToString(), "[" + string.Join(", ", __args.Select(x => x.ToString())) + "]"]); return null; - }; - - Component newComponent; - - - - //Tries to instantiate Component, and sends a fail call if an issue occurs. - try { newComponent = (__Type)Activator.CreateInstance(newComponentType, __args); } - catch { - Debug.LogError("Component creation failed!", ["Type", "Args", "Docker"], - [newComponentType.ToString(), "[" + string.Join(", ", __args.Select(x => x.ToString())) + "]", GetHashCode().ToString()]); return null; + internal void ChainEvent(int __timeEvent) { + for (int i = 0; i < _Components.Count; i++) { + _Components[i].TryEvent(__timeEvent); + _Components[i].ChainEvent(__timeEvent); } - - - //If Component is null do not add - if(newComponent == null) { - Debug.LogError("Activator created Null Component", ["Type", "Args", "Docker"], - [newComponentType.ToString(), "[" + string.Join(", ", __args.Select(x => x.ToString())) + "]", GetHashCode().ToString()]); return null; - } - - - //Add to docker and initialize the new Component - _Components.Add(newComponent); - newComponent.Initiate(this, name, tags, newComponentType); - - newComponent.TryEvent(4); - newComponent.ChainEvent(4); - - return (__Type) newComponent; } - - - - /// - /// Adds a new Component to the Docker; This is the only way they should be created. - /// - /// - /// - public __Type Add<__Type>(string name = "", string[] tags = null) where __Type : Component => Add<__Type>([], name: name, tags: tags); + + + + - - - - - - /// - /// Transfers a child Component to another Docker - /// - /// Component to move - /// Docker to move component to - /// Components cannot transfer themselves with this Method! - public void Move(Component __component, ComponentDocker __componentDocker) { - - - - //This allows self transfer behavior while preserving Docker's actual job, Before all other statements to prevent Double-Debugging. - if (__component == this) { __component.ComponentDocker.Move(__component, __componentDocker); return; } - - - - if (__component == null) { - Debug.LogError("Component is null!", ["CurrentDocker", "NewDocker"], - [GetHashCode().ToString(), __componentDocker.GetHashCode().ToString()]); return; } - - - - if (!_Components.Contains(__component)) { - Debug.LogError("Docker does not have ownership of Component", ["Component", "Type", "CurrentDocker", "NewDocker"], - [__component.GetHashCode().ToString(), __component.GetType().ToString(), GetHashCode().ToString(), __componentDocker.GetHashCode().ToString()]); return; } - - - - //Update docker lists - __componentDocker._Components.Add(__component); - _Components.Remove(__component); - - - - //Update components parent - __component.ComponentDocker = __componentDocker; - } - - - - /// - /// Transfers the first found Component of a specific type to another Docker - /// - /// Docker to move component to - /// Type of component - public void Move<__Type>(ComponentDocker __componentDocker) where __Type : Component => Move(Get<__Type>(), __componentDocker); - - - - /// - /// Transfers all Components in a list to another Docker. - /// - /// List of Components to transfer - /// Docker to move Component to - public void MoveAll(IEnumerable __Components, ComponentDocker __componentDocker) { foreach (Component Component in (Component[])[..__Components]) Move(Component, __componentDocker); } - - - - /// - /// Transfers all Components of a type to another Docker. - /// - /// Target Docker - /// Type of Components to transfer - public void MoveAll<__Type>(ComponentDocker __componentDocker) where __Type : Component => MoveAll(GetAll<__Type>(), __componentDocker); + + + + + @@ -224,13 +123,9 @@ public abstract class ComponentDocker + + - - - /// /// - /// Holds Components at Keys of their tags. - /// - internal Dictionary> _taggedComponents = []; @@ -463,97 +358,33 @@ public abstract class ComponentDocker - /// - /// Returns a bool based on if the Docker contains a Component with the given tag or not - /// - /// - /// - public bool Contains(string __tag) => _taggedComponents.ContainsKey(__tag); - - - /// - /// Returns a bool based on if the Docker contains a Component of that type or not - /// - /// Type of the Component - /// - public bool Contains<__Type>() where __Type : Component => _Components.Any(x => x is __Type); - - - - /// - /// Returns a bool based on if the current __Component is owned by this Docker - /// - /// - /// - public bool Contains(Component __component) => _Components.Contains(__component); - - - - - - /// - /// Destroys a Component attached to docker - /// - /// - public void Remove(Component __component) { - //Component is null - if (__component == null) { - Debug.LogError("Component is null", ["CurrentDocker"], - [GetHashCode().ToString()]); return; - } + private void AddComponentToLists(Component __component) { + var Type = __component.GetType(); + _Components.Add(__component); + if (!_ComponentDictionary.TryAdd(Type, [__component])) _ComponentDictionary[Type].Add(__component); - - //Docker doesn't have Component - if (!_Components.Contains(__component)) { - Debug.LogError("Docker does not have ownership of Component", ["Component", "Type", "CurrentDocker"], - [__component.GetHashCode().ToString(), __component.GetType().ToString(), GetHashCode().ToString()]); return; - } - - __component.TryEvent(5); - __component.ChainEvent(5); - - foreach (string tag in __component._tags) UnhashTaggedComponent(__component, tag); - __component.ComponentDocker = null; - - _Components.Remove(__component); + for(var i = 0; i < __component.Tags.Length; i++) { HashTaggedComponent(__component.Tags[i], __component); } } - - - - /// - /// Destroys the first found Component of a given type - /// - /// Type of Component to destroy - public void Remove<__Type>() where __Type : Component => Remove(Get<__Type>()); + private void RemoveComponentFromLists(Component __component) { + var Type = __component.GetType(); + _Components.Remove(__component); + + if(!_ComponentDictionary.ContainsKey(Type)) _ComponentDictionary[Type].Remove(__component); + + for(var i = 0; i < __component.Tags.Length; i++) { UnhashTaggedComponent(__component.Tags[i], __component); } + } + private void HashTaggedComponent(string __tag, Component __component) { + if (!_taggedComponents.TryAdd(__component.Tags[i], [__component])) + _taggedComponents[__component.Tags[i]].Add(__component); + } - /// - /// Destroys all Components from a given collection. - /// - /// - public void RemoveAll(IEnumerable __Components) { foreach (Component component in (Component[])[..__Components]) { Remove(component); } } + private void UnhashTaggedComponent(string __tag, Component __component) { + if(!_taggedComponents.ContainsKey(__tag)) _taggedComponents[__tag].Remove(__component); + } - - - /// - /// Destroys all Components of a given type - /// - /// - public void RemoveAll<__Type>() where __Type : Component => RemoveAll(GetAll<__Type>()); - - - - /// - /// Destroys all Components attached to Docker - /// - public void RemoveAll() { foreach (Component component in (Component[])[.._Components]) { Remove(component); } } - - - - - } \ No newline at end of file diff --git a/AwperativeKernel/Kernel/ComponentDocker/Core/ComponentDockerExposure.cs b/AwperativeKernel/Kernel/ComponentDocker/Core/ComponentDockerExposure.cs new file mode 100644 index 0000000..e396e20 --- /dev/null +++ b/AwperativeKernel/Kernel/ComponentDocker/Core/ComponentDockerExposure.cs @@ -0,0 +1,32 @@ + + +namespace AwperativeKernel; + + +public abstract partial class ComponentDocker +{ + + + /// + /// Returns a bool based on if the Docker contains a Component with the given tag or not + /// + /// + /// + public bool Contains([NotNull] string __tag) => NotNull.VerifyOrThrow(__tag) && _taggedComponents.ContainsKey(__tag); + + + /// + /// Returns a bool for if the Docker contains a Component of that type or not + /// + /// Type of the Component + public bool Contains<__Type>() where __Type : Component => _ComponentDictionary.ContainsKey(typeof(__Type)); + + + + /// + /// Returns a bool based on if the current __Component is owned by this Docker + /// + /// + /// + public bool Contains([ComponentNotNull,DockerOwns] Component __component) => NotNull.VerifyOrThrow(__component) && DockerOwns.VerifyOrThrow(this, __component) && _Components.Contains(__component); +} \ No newline at end of file diff --git a/AwperativeKernel/Kernel/ComponentDocker/Core/ComponentDockerManagement.cs b/AwperativeKernel/Kernel/ComponentDocker/Core/ComponentDockerManagement.cs new file mode 100644 index 0000000..292fdde --- /dev/null +++ b/AwperativeKernel/Kernel/ComponentDocker/Core/ComponentDockerManagement.cs @@ -0,0 +1,189 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics.CodeAnalysis; + + +namespace AwperativeKernel; + + +public abstract partial class ComponentDocker +{ + + + + /// + /// Adds a previously instantiated Component to the Docker + /// + /// The Component to add + /// This is NOT meant to transfer a Component from one docker to another (Please use Move() for that). + /// And If you are just instantiating an Empty Component, also consider instead using Add<Type>(); + /// Avery Norris + #nullable enable + public void Add([ComponentNotNull,OrphanComponent] Component __component) { + if(!ComponentNotNull.VerifyOrThrow(__component)) return; + if(!OrphanComponent.VerifyOrThrow(__component)) return; + + //Component has already been added to another docker + if (__component.ComponentDocker != null) { Debug.LogError("You cannot use add if the Component already belongs to a Docker, use Component.Transfer();"); return; } + + InitiateComponent(__component); + } + + + + /// + /// Add a new Component to the Docker; and returns a reference to it! + /// + /// Type of Component to instantiate + /// Component cannot have a Constructor + /// Avery Norris + public __Type Add<__Type>() where __Type : Component, new() { Component newComponent = new __Type(); InitiateComponent(newComponent); return (__Type)newComponent; } + + + + /// + /// Add a new Component to the Docker; and returns a reference to it! + /// + /// Type of Component to instantiate + /// Component cannot have a Constructor + /// Avery Norris + public __Type Add<__Type>(string name = null, int priority = 0, Collection tags = null) where __Type : Component, new() { + Component newComponent = new __Type(); + newComponent.Name = name ??= typeof(__Type).Name; + newComponent._tags = [..tags ??= []]; + newComponent._priority = priority; + + InitiateComponent(newComponent); return (__Type)newComponent; + } + + + + + + /// + /// Sets important Component variables; and tries to send the Create() event. + /// + /// + /// + private void InitiateComponent(Component __component) { + //add to Component Docker's lists + AddComponentToLists(__component); + + __component.ComponentDocker = this; + //create event + __component.TryEvent(4); __component.ChainEvent(4); + } + + + + + + /// + /// Transfers a Component to another Docker + /// + /// Component to move + /// Docker to move component to + /// Components cannot transfer themselves with this Method! + public void Move([ComponentNotNull,DockerOwns] Component __component, [DockerNotNull,DifferentDocker] ComponentDocker __componentDocker) { + if(!ComponentNotNull.VerifyOrThrow(__component)) return; + if(!DockerOwns.VerifyOrThrow(this, __component)) return; + if(!DockerNotNull.VerifyOrThrow(__componentDocker)) return; + if(!DifferentDocker.VerifyOrThrow(this, __componentDocker)) return; + + if (!Contains(__component)) { + Debug.LogError("Docker does not have ownership over Component!", ["ComponentType"], [__component.GetType().Name]); return; + } + + if (__componentDocker == this) { + Debug.LogError("Docker already has Component!", ["ComponentType"], [__component.GetType().Name]); return; + } + + var type = __component.GetType(); + + //Modify collections on both Dockers + RemoveComponentFromLists(__component); + __componentDocker.AddComponentToLists(__component); + + __component.ComponentDocker = __componentDocker; + } + + + + /// + /// Transfers the first found Component of a specific type to another Docker + /// + /// Docker to move the Component to + /// Type of component + public void Move<__Type>([DockerNotNull,DifferentDocker] ComponentDocker __componentDocker) where __Type : Component => Move(Get<__Type>(), __componentDocker); + + + + /// + /// Transfers all Components in a collection to another Docker. + /// + /// The Components that need to be transferred + /// Docker to move Component to + public void MoveAll([ComponentNotNull,DockerOwns] IEnumerable __Components, [DockerNotNull,DifferentDocker] ComponentDocker __componentDocker) { foreach (Component Component in (Component[])[..__Components]) Move(Component, __componentDocker); } + + + + /// + /// Transfers all Components of a type to another Docker. + /// + /// Target Docker + /// Type of Components to transfer + public void MoveAll<__Type>([DockerNotNull, DifferentDocker] ComponentDocker __componentDocker) where __Type : Component => MoveAll(GetAll<__Type>(), __componentDocker); + + + + + + /// + /// Destroys a Component attached to the Docker + /// + /// + public void Destroy([ComponentNotNull,DockerOwns] Component __component) { + if(!ComponentNotNull.VerifyOrThrow(__component)) return; + if(!DockerOwns.VerifyOrThrow(this, __component)) return; + + __component.TryEvent(5); + __component.ChainEvent(5); + + RemoveComponentFromLists(__component); + __component.ComponentDocker = null; + + __component.Dispose(); + } + + + + /// + /// Destroys the first found Component of a given type + /// + /// Type of Component to destroy + public void Destroy<__Type>() where __Type : Component => Destroy(Get<__Type>()); + + + + /// + /// Destroys all Components from a given collection. + /// + /// + public void DestroyAll([ComponentNotNull, DockerOwns] Collection __Components) { for (var i = 0; i < __Components.Count; i++) Destroy(__Components[i]); } + + + + /// + /// Destroys all Components of a given type + /// + /// + public void DestroyAll<__Type>() where __Type : Component => DestroyAll(GetAll<__Type>()); + + + + /// + /// Destroys all Components attached to Docker + /// + public void DestroyAll() { for(var i = 0; i < _Components.Count; i++) Destroy(_Components[i]); } +} \ No newline at end of file diff --git a/AwperativeKernel/Kernel/Debug/Debug.cs b/AwperativeKernel/Kernel/Debug/Debug.cs index d1fb2ba..a5885ae 100644 --- a/AwperativeKernel/Kernel/Debug/Debug.cs +++ b/AwperativeKernel/Kernel/Debug/Debug.cs @@ -146,15 +146,17 @@ public static class Debug /// /// Message to debug public static void LogError(string __message) => LogGeneric(__message, "ERR", [], []); - + /// /// Writes the current message to the log file. With any given call sign. /// /// Message to debug /// Names of values to debug /// Values to debug - public static void LogError(string __message, string[] __parameters, string[] __values) => LogGeneric(__message, "ERR", __parameters, __values); - + public static void LogError(string __message, string[] __parameters, string[] __values) { + if(Awperative.DebugErrors) LogGeneric(__message, "ERR", __parameters, __values, Awperative.ThrowExceptions); + } + /// /// Writes the current message to the log file if the condition is true. /// @@ -173,11 +175,14 @@ public static class Debug /// Message identifier /// Names of values to debug /// Values to debug - public static void LogGeneric(string __message, string __callSign, string[] __parameters, string[] __values) { + /// Should this throw an exception instead + public static void LogGeneric(string __message, string __callSign, string[] __parameters, string[] __values, bool __exception = false) { string output = "\n\n" + __callSign + "- \"" + __message + "\"\n STK-" + new StackTrace(); for (int i = 0; i < __parameters.Length || i < __values.Length; i++) output += "\n " + __parameters[i] + "- " + __values[i]; + + if (__exception) throw new Exception(output); File.AppendAllText(LogFilePath, output); } diff --git a/AwperativeKernel/Kernel/Overhead/Awperative/Awperative.cs b/AwperativeKernel/Kernel/Overhead/Awperative/Awperative.cs index ae6b605..33fcbb9 100644 --- a/AwperativeKernel/Kernel/Overhead/Awperative/Awperative.cs +++ b/AwperativeKernel/Kernel/Overhead/Awperative/Awperative.cs @@ -2,7 +2,9 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Collections.ObjectModel; +using System.Diagnostics.CodeAnalysis; using System.Linq; +using System.Linq.Expressions; using System.Reflection; @@ -44,6 +46,7 @@ public static class Awperative public static bool DebugMode = false; + @@ -111,22 +114,37 @@ public static class Awperative foreach (Type type in Assembly.GetCallingAssembly().GetTypes()) { if (type.IsSubclassOf(typeof(Component))) { + + Action[] timeEvents = new Action[ComponentEvents.Count]; + byte eventProfile = 0; List debugProfile = []; for(int i = 0; i < ComponentEvents.Count; i++) { - if (type.GetMethod(ComponentEvents[i]) != null) { - eventProfile |= (byte)(1 << i); + MethodInfo eventMethod = type.GetMethod(ComponentEvents[i]); + + if (eventMethod != null) { + debugProfile.Add(ComponentEvents[i]); - } + + var ComponentInstanceParameter = Expression.Parameter(typeof(Component), "__component"); + var Casting = Expression.Convert(ComponentInstanceParameter, type); + var Call = Expression.Call(Casting, eventMethod); + var Lambda = Expression.Lambda>(Call, ComponentInstanceParameter); + timeEvents[i] = Lambda.Compile(); + + } else timeEvents[i] = null; } Debug.LogAction("Evaluated Component! ", ["Type", "Time Events", "Profile"], [type.Name, "[" + string.Join(", ", debugProfile.Select(x => x.ToString())) + "]", eventProfile.ToString()]); - _TypeAssociatedTimeEvents.Add(type, eventProfile); + _TypeAssociatedTimeEvents.Add(type, timeEvents); } } + + + } @@ -134,6 +152,7 @@ public static class Awperative /// /// Starts Awperative up! This method runs forever. /// + [DoesNotReturn] public static void Run() { Base = new Base(); Base.Run(); @@ -158,5 +177,30 @@ public static class Awperative /// List of all type of components and the associated time events /// Each event is a 0 or 1 based on true or false, stored at their index in the byte /// - internal static Dictionary _TypeAssociatedTimeEvents = []; + internal static Dictionary[]> _TypeAssociatedTimeEvents = []; + + + + public static SafetyLevel safetyLevel { + get => _safetyLevel; + set { + ThrowExceptions = value is SafetyLevel.Extreme; + IgnoreErrors = value is SafetyLevel.Low or SafetyLevel.None; + DebugErrors = value is not SafetyLevel.None; + _safetyLevel = value; + } + } private static SafetyLevel _safetyLevel; + + public static bool ThrowExceptions { get; private set; } = false; + public static bool IgnoreErrors { get; private set; } = false; + public static bool DebugErrors { get; private set; } = true; + + + //What to do if there is an error, keep in mind low and none still can have errors, because you are turning off validation checking + public enum SafetyLevel { + Extreme, //Throw exceptions and stop the whole program + Normal, //Just debug it to the console, and halt current process + Low, //Push through tasks but debug error + None, //Ignore most/all errors and do not debug it, + } } \ No newline at end of file diff --git a/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.AssemblyInfo.cs b/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.AssemblyInfo.cs index 1c415ff..f3ac88e 100644 --- a/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.AssemblyInfo.cs +++ b/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.AssemblyInfo.cs @@ -13,7 +13,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("AwperativeKernel")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+32fdae32482131f6e177956aee0f9ddcdf9877cf")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+abd47153ad47e5c2d5300dcab27ac4628f468ab1")] [assembly: System.Reflection.AssemblyProductAttribute("AwperativeKernel")] [assembly: System.Reflection.AssemblyTitleAttribute("AwperativeKernel")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.AssemblyInfoInputs.cache b/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.AssemblyInfoInputs.cache index d42d723..5663421 100644 --- a/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.AssemblyInfoInputs.cache +++ b/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.AssemblyInfoInputs.cache @@ -1 +1 @@ -22a4163440a667e1fc9f683e846ca5e0db424c2a4e8629dde601d67fa1038af8 +8e04a8f03c26d3cf7cdf50da4979193904b566d6f40392f132e749a5bd9092b9 diff --git a/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.csproj.CoreCompileInputs.cache b/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.csproj.CoreCompileInputs.cache index c5e7555..29e9348 100644 --- a/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.csproj.CoreCompileInputs.cache +++ b/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -1492481e4eae3b80db2d149ab088600d21214f29161b6bc87c6dbab466600b9b +e4b135c3045a438e4953bde74a036a568da5652715efda203daab787973e7f7e diff --git a/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.dll b/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.dll index f7d5ab880b308dca136f294676735d6390e299f2..89b7af55012006fb1f6e88855d5ac1d7715d6adc 100644 GIT binary patch literal 21504 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

E4jr*)_npJ|u0yA&}C&mqu4{o6^0P?hxo}bQjja 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 diff --git a/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.pdb b/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.pdb index 33d249e5d91392734a40944dbda88b8d33857584..8e3e3bf3cf5fb849622f04cac4b6af1390c5d421 100644 GIT binary patch delta 5961 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 delta 5532 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 diff --git a/AwperativeKernel/obj/Debug/net8.0/ref/AwperativeKernel.dll b/AwperativeKernel/obj/Debug/net8.0/ref/AwperativeKernel.dll index 7ca0f88623ea83f511720c0b34789312da4310fe..1b1cce7820ee7eb6ab32a3fee20692eee1278c4d 100644 GIT binary patch literal 9728 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 diff --git a/AwperativeKernel/obj/Debug/net8.0/refint/AwperativeKernel.dll b/AwperativeKernel/obj/Debug/net8.0/refint/AwperativeKernel.dll index 7ca0f88623ea83f511720c0b34789312da4310fe..1b1cce7820ee7eb6ab32a3fee20692eee1278c4d 100644 GIT binary patch literal 9728 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