From daff25af555790c4cc665d8158c8ec80cf2d5cf2 Mon Sep 17 00:00:00 2001 From: avery Date: Sun, 1 Mar 2026 19:28:14 -0500 Subject: [PATCH] NEARLY THERE --- .../Kernel/Atrributes/DebugAttributes.cs | 8 +- .../Kernel/Atrributes/MarkerAttributes.cs | 60 ++- .../Kernel/Component/Component.cs | 86 ++-- .../ComponentCalculatedProperties.cs | 50 +++ .../Component/ComponentCalculatedProperty.cs | 52 --- .../Kernel/Component/ComponentLambda.cs | 7 + .../Kernel/ComponentDocker/ComponentDocker.cs | 143 +++++++ .../ComponentDockerExposure.cs | 164 ++++++++ .../ComponentDockerMovement.cs | 96 +++++ .../ComponentDockerMutation.cs | 128 ++++++ .../ComponentDocker/Core/ComponentDocker.cs | 168 -------- .../Core/ComponentDockerExposure.cs | 366 ------------------ .../Core/ComponentDockerManagement.cs | 191 --------- .../Kernel/Overhead/Awperative/Awperative.cs | 10 +- .../Kernel/RequiredModules/IDebugger.cs | 6 +- .../Kernel/RequiredModules/IModuleManager.cs | 2 +- .../net8.0/AwperativeKernel.AssemblyInfo.cs | 2 +- .../AwperativeKernel.AssemblyInfoInputs.cache | 2 +- ...ativeKernel.csproj.CoreCompileInputs.cache | 2 +- .../obj/Debug/net8.0/AwperativeKernel.dll | Bin 35328 -> 36864 bytes .../obj/Debug/net8.0/AwperativeKernel.pdb | Bin 24380 -> 23532 bytes .../obj/Debug/net8.0/ref/AwperativeKernel.dll | Bin 16896 -> 19456 bytes .../Debug/net8.0/refint/AwperativeKernel.dll | Bin 16896 -> 19456 bytes .../obj/rider.project.model.nuget.info | 2 +- 24 files changed, 688 insertions(+), 857 deletions(-) create mode 100644 AwperativeKernel/Kernel/Component/ComponentCalculatedProperties.cs delete mode 100644 AwperativeKernel/Kernel/Component/ComponentCalculatedProperty.cs create mode 100644 AwperativeKernel/Kernel/ComponentDocker/ComponentDocker.cs create mode 100644 AwperativeKernel/Kernel/ComponentDocker/ComponentDockerExposure.cs create mode 100644 AwperativeKernel/Kernel/ComponentDocker/ComponentDockerMovement.cs create mode 100644 AwperativeKernel/Kernel/ComponentDocker/ComponentDockerMutation.cs delete mode 100644 AwperativeKernel/Kernel/ComponentDocker/Core/ComponentDocker.cs delete mode 100644 AwperativeKernel/Kernel/ComponentDocker/Core/ComponentDockerExposure.cs delete mode 100644 AwperativeKernel/Kernel/ComponentDocker/Core/ComponentDockerManagement.cs diff --git a/AwperativeKernel/Kernel/Atrributes/DebugAttributes.cs b/AwperativeKernel/Kernel/Atrributes/DebugAttributes.cs index 3e16cfc..fbdaeb6 100644 --- a/AwperativeKernel/Kernel/Atrributes/DebugAttributes.cs +++ b/AwperativeKernel/Kernel/Atrributes/DebugAttributes.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Collections.ObjectModel; namespace AwperativeKernel; @@ -30,6 +29,7 @@ public static class DebugAttributes /// Returns true or false based on the given condition from the attribute, unless Debug.IgnoreErrors is true, in which it will always return true, but still try to throw errors. /// It is required to use VerifyOrThrow() to validate important conditions for methods within the kernel. You may also feel free to use this outside in any modules or games. /// It is easiest to use VerifyOrThrow like : (In your method) if(!Attribute.VerifyOrThrow()) return; That way the attribute can exit the code if the condition is false. + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.Medium), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.ON)] public static bool VerifyOrThrow(ComponentDocker __docker, Component __component) { if (__docker.Contains(__component)) return true; @@ -56,6 +56,7 @@ public static class DebugAttributes /// + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.Medium), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.ON)] public static bool VerifyOrThrow(ComponentDocker __docker, Component __component) { if (!__docker.Contains(__component)) return true; @@ -82,6 +83,7 @@ public static class DebugAttributes /// + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.O1)] public static bool VerifyOrThrow(Component __component) { if (__component.ComponentDocker == null) return true; @@ -108,6 +110,7 @@ public static class DebugAttributes /// + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.O1)] public static bool VerifyOrThrow(ComponentDocker __docker, ComponentDocker __other) { if (!__docker.Equals(__other)) return true; @@ -130,6 +133,7 @@ public static class DebugAttributes /// + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.O1)] public static bool VerifyOrThrow(Component __component) { if (__component != null) return true; @@ -148,6 +152,7 @@ public static class DebugAttributes /// + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.O1)] public static bool VerifyOrThrow(ComponentDocker __componentDocker) { if (__componentDocker != null) return true; @@ -166,6 +171,7 @@ public static class DebugAttributes /// + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.O1)] public static bool VerifyOrThrow(Scene __scene) { if (__scene != null) return true; diff --git a/AwperativeKernel/Kernel/Atrributes/MarkerAttributes.cs b/AwperativeKernel/Kernel/Atrributes/MarkerAttributes.cs index 2161b04..190529a 100644 --- a/AwperativeKernel/Kernel/Atrributes/MarkerAttributes.cs +++ b/AwperativeKernel/Kernel/Atrributes/MarkerAttributes.cs @@ -4,30 +4,66 @@ using System; namespace AwperativeKernel; +/// +/// Provides many handy cosmetic attributes for methods to specify use cases or provide information. +/// +/// Avery Norris public static class MarkerAttributes { - /// - /// Shows that the given object is unsafe (ex. it doesn't check for null values and such, or it doesn't have guardrails based on cases). + /// Shows that the given object is unsafe (ex. it doesn't check for null values and such, or it doesn't have guardrails based on cases). /// This is just for internal/private methods to remind myself how to call it :) The reasoning is case by case, but most of the time, - /// it is because all of the exposing public methods already check, and double checks would only slow me down - /// + /// it is because all the exposing public methods already check, and double checks would only slow me down [AttributeUsage(AttributeTargets.All)] public class UnsafeInternal : Attribute { } - /// - /// Shows that the given object (meant for external use) is calculated every time it is called! Good to know for performance heavy systems. - /// + /// Shows that the given object is calculated every time it is called! Good to know for performance heavy systems. [AttributeUsage(AttributeTargets.All)] - public class CalculatedProperty() : Attribute { } + public class CalculatedProperty : Attribute { } - /// - /// Just a way to write how expensive a calculated property can be. - /// + /// Just a way to write how expensive a calculated property or method can be. [AttributeUsage(AttributeTargets.All)] - public class CalculatedPropertyExpense(string Expense) : Attribute { } + public class Expense(Expense.ExpenseLevel __expense) : Attribute + { + public enum ExpenseLevel { + None, + VeryLow, + Low, + Medium, + High, + VeryHigh, + } + + + public ExpenseLevel expense = __expense; + } + + + + /// Just a way to write the time complexity of a calculated property or method. + [AttributeUsage(AttributeTargets.All)] + public class Complexity(Complexity.TimeComplexity __complexity) : Attribute + { + public enum TimeComplexity + { + O1, + OLogN, + ON, + ONLogN, + ON2, + ON3 + } + + public TimeComplexity complexity = __complexity; + } + + + + /// Shows that the given method does not actually belong to the object, but instead just calls a lambda to another method. + [AttributeUsage(AttributeTargets.All)] + public class MethodPointer : Attribute { } } \ No newline at end of file diff --git a/AwperativeKernel/Kernel/Component/Component.cs b/AwperativeKernel/Kernel/Component/Component.cs index 2dfb875..521e398 100644 --- a/AwperativeKernel/Kernel/Component/Component.cs +++ b/AwperativeKernel/Kernel/Component/Component.cs @@ -1,32 +1,26 @@ -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; namespace AwperativeKernel; - - +/// +/// The backing class for components in Awperative; provides access to a few important methods, and inheriting this is required to receive time based events. +/// When Start() is called, Awperative reflectively analyzes all classes that inherits component, and checks for given events. See the wiki for more information! +/// +/// Avery Norris public abstract partial class Component : ComponentDocker { - /// Current parent of the Component. Can be either Scene or another Component. + /// Current parent of the Component. Can be either a Scene or another Component. [MarkerAttributes.UnsafeInternal] - public ComponentDocker ComponentDocker { get; set; } = null; + public ComponentDocker ComponentDocker { get; internal set; } = null; - - /// - /// Component name - /// - [NotNull] + + /// Component's name + [DebugAttributes.NotNull] public string Name { get => _name; set { if (!DebugAttributes.NotNull.VerifyOrThrow(value)) return; _name = value; } @@ -34,19 +28,19 @@ public abstract partial class Component : ComponentDocker /// Represents the state of this Component, The largest bit represents if the Component is enabled or not, while the - /// next 7 represent its priority + /// next 7 represent its priority like so : (Enabled -> 0 | Priority -> 0000000) [MarkerAttributes.UnsafeInternal] private byte OrderProfile; /// If the component receives time events or not. - [MarkerAttributes.CalculatedProperty, MarkerAttributes.CalculatedPropertyExpense("Very Low")] + [MarkerAttributes.CalculatedProperty, MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.O1)] public bool Enabled { get => (OrderProfile & 128) > 0; set => OrderProfile = (byte)((OrderProfile & 127) | (value ? 128 : 0)); } - /// Represents the Component's Update priority, can be set to any value ranging from -64 to 63; otherwise an error will throw! - [MarkerAttributes.CalculatedProperty, MarkerAttributes.CalculatedPropertyExpense("Very Low")] + /// Represents the Component's Update priority; higher priorities get updated first. Can be any integer in the range -64 -> 63. + [MarkerAttributes.CalculatedProperty, MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.O1)] public int Priority { get => (sbyte)(OrderProfile << 1) >> 1; set { @@ -55,62 +49,46 @@ public abstract partial class Component : ComponentDocker ComponentDocker.UpdatePriority(this, value); } } - - - - - /// - /// Attempts to send an Event to the Component, terminates if the Component does not have the given Event - /// - /// Type of Event + + /// A list of all tags belonging to the component. Use AddTag() to modify it. + public IReadOnlySet Tags => _tags; + [MarkerAttributes.UnsafeInternal] internal HashSet _tags = []; + + + /// Attempts to send an event to the component, and quietly exits if not. [MarkerAttributes.UnsafeInternal] internal void TryEvent(int __timeEvent) { Awperative._TypeAssociatedTimeEvents[GetType()][__timeEvent]?.Invoke(this); } - - - /// - /// Identifiers for Components. - /// - public IReadOnlyList Tags => [.._tags]; - [MarkerAttributes.UnsafeInternal] internal HashSet _tags = []; - - - - /// - /// Adds a new tag to the Component - /// - /// The tag to add - public void AddTag([DebugAttributes.NotNull, DebugAttributes.CollectionDoesntContain] string __tag) - { + /// Adds a new tag to the component + [MarkerAttributes.CalculatedProperty, MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.Low), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.ON)] + public void AddTag([DebugAttributes.NotNull, DebugAttributes.CollectionDoesntContain] string __tag) { if(!DebugAttributes.NotNull.VerifyOrThrow(__tag)) return; if(!DebugAttributes.CollectionDoesntContain.VerifyOrThrow(__tag, _tags)) return; - + _tags.Add(__tag); - ComponentDocker.AddTagToComponent(__tag, this); + ComponentDocker.HashTaggedComponent(__tag, this); } - /// - /// Adds a new tag to the Component - /// - /// The tag to add - public void RemoveTag([DebugAttributes.NotNull,DebugAttributes.CollectionContains] string __tag) - { + /// Removes a tag from the component. + [MarkerAttributes.CalculatedProperty, MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.Low), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.ON)] + public void RemoveTag([DebugAttributes.NotNull,DebugAttributes.CollectionContains] string __tag) { if (!DebugAttributes.NotNull.VerifyOrThrow(__tag)) return; if(!DebugAttributes.CollectionContains.VerifyOrThrow(__tag, _tags)) return; - + _tags.Remove(__tag); - ComponentDocker.RemoveTagFromComponent(__tag, this); + ComponentDocker.UnhashTaggedComponent(__tag, this); } + /// Just gives the Component's name. But makes debugging a little easier :). public override string ToString() { return this.Name; } diff --git a/AwperativeKernel/Kernel/Component/ComponentCalculatedProperties.cs b/AwperativeKernel/Kernel/Component/ComponentCalculatedProperties.cs new file mode 100644 index 0000000..e714fe1 --- /dev/null +++ b/AwperativeKernel/Kernel/Component/ComponentCalculatedProperties.cs @@ -0,0 +1,50 @@ +using System.Collections.Generic; + + +namespace AwperativeKernel; + + +public abstract partial class Component +{ + /// Scene the Component resides in. To save ram it's not stored but calculated on the fly. + [MarkerAttributes.CalculatedProperty, MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.Medium), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.ON)] + public Scene Scene => __QueryScene(); + private Scene __QueryScene() { + if (ComponentDocker is Scene scene) return scene; + if (ComponentDocker is Component Component) return Component.__QueryScene(); + + return null; + } + + + + /// Returns the Parent Component. Will be null if the Component's parent is a Scene. + [MarkerAttributes.CalculatedProperty, MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.O1)] + public Component Parent => __QueryParent(); + private Component __QueryParent() { + if (ComponentDocker is Component Component) + return Component; + return null; + } + + + + /// All parent Components and the parents of the parents up until the Scene. Will only list parents of parents, not uncle Components. And will not list the Scene + [MarkerAttributes.CalculatedProperty, MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.Medium), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.ON)] + public IEnumerable AllParents => __QueryComponents(); + private IEnumerable __QueryComponents() { + List returnValue = []; + ComponentDocker currentComponentDocker = ComponentDocker; + + while (currentComponentDocker is not AwperativeKernel.Scene) { + if (currentComponentDocker is Component Component) { + returnValue.Add(Component); + currentComponentDocker = Component.ComponentDocker; + } + } + + return returnValue; + } + + +} \ No newline at end of file diff --git a/AwperativeKernel/Kernel/Component/ComponentCalculatedProperty.cs b/AwperativeKernel/Kernel/Component/ComponentCalculatedProperty.cs deleted file mode 100644 index 6f379c1..0000000 --- a/AwperativeKernel/Kernel/Component/ComponentCalculatedProperty.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System.Collections.Generic; - -namespace AwperativeKernel; - -public abstract partial class Component -{ - /// - /// Scene the Component resides in. - /// - [CalculatedProperty, CalculatedPropertyExpense("Medium: O(Parents)")] - public Scene Scene => __QueryScene(); - private Scene __QueryScene() { - if (ComponentDocker is Scene scene) return scene; - if (ComponentDocker is Component Component) return Component.__QueryScene(); - - return null; - } - - - - /// - /// Returns the Parent Component. Will be null if the Component is at the base of a scene. - /// - [CalculatedProperty, CalculatedPropertyExpense("Very Low O(1)")] - public Component Parent => __QueryParent(); - private Component __QueryParent() { - if (ComponentDocker is Component Component) - return Component; - return null; - } - - - - /// - /// All parent Components and the parents of the parents up until the Scene. Will only list parents of parents, not uncle Components. - /// - [CalculatedProperty, CalculatedPropertyExpense("Medium O(Parents)")] - public IReadOnlyList AllParents => __QueryComponents(); - private IReadOnlyList __QueryComponents() { - List returnValue = []; - ComponentDocker currentComponentDocker = ComponentDocker; - - while (!(currentComponentDocker is Scene)) - if (currentComponentDocker is Component Component) { - returnValue.Add(Component); - currentComponentDocker = Component.ComponentDocker; - } - return [..returnValue]; - } - - -} \ No newline at end of file diff --git a/AwperativeKernel/Kernel/Component/ComponentLambda.cs b/AwperativeKernel/Kernel/Component/ComponentLambda.cs index 8dc598e..d012169 100644 --- a/AwperativeKernel/Kernel/Component/ComponentLambda.cs +++ b/AwperativeKernel/Kernel/Component/ComponentLambda.cs @@ -1,33 +1,40 @@ namespace AwperativeKernel; + public abstract partial class Component { /// + [MarkerAttributes.MethodPointer] public static Scene CreateScene(string __name) => Awperative.CreateScene(__name); /// + [MarkerAttributes.MethodPointer] public static Scene GetScene(string __name) => Awperative.GetScene(__name); /// + [MarkerAttributes.MethodPointer] public void RemoveScene(Scene __scene) => Awperative.CloseScene(__scene); /// + [MarkerAttributes.MethodPointer] public void RemoveScene(string __name) => Awperative.CloseScene(__name); /// + [MarkerAttributes.MethodPointer] public void Move(ComponentDocker __newDocker) => ComponentDocker.Move(this, __newDocker); /// Makes the Component destroy itself + [MarkerAttributes.MethodPointer] public void Destroy() => ComponentDocker.Destroy(this); } \ No newline at end of file diff --git a/AwperativeKernel/Kernel/ComponentDocker/ComponentDocker.cs b/AwperativeKernel/Kernel/ComponentDocker/ComponentDocker.cs new file mode 100644 index 0000000..654f547 --- /dev/null +++ b/AwperativeKernel/Kernel/ComponentDocker/ComponentDocker.cs @@ -0,0 +1,143 @@ +using System; +using System.Collections; +using System.Collections.Generic; + + +namespace AwperativeKernel; + + +/// +/// Base class for all Awperative objects. Responsible for Managing hierarchy between Components and Scenes, has Extensive Component Manipulation Available. +/// Also transfers Time and Carries most of the responsibilities akin to the Component. NOT FOR INHERITING, please use docker by inheriting component. +/// +/// Avery Norris +public abstract partial class ComponentDocker : IEnumerable, IEquatable, IEquatable, IEquatable +{ + + //Blocks external inheritance + internal ComponentDocker() {} + + + + /// Core of the Docker, holds all of the Components, sorted by update priority. + [MarkerAttributes.UnsafeInternal] internal readonly List _components = []; + /// Holds a list of Components at each of their types. This optimizes Get<Type> to O(1) + [MarkerAttributes.UnsafeInternal] internal readonly Dictionary> _componentTypeDictionary = new(); + /// Stores a Component in a list at each of their tags. This optimizes Get(string tag) to O(1) + [MarkerAttributes.UnsafeInternal] internal readonly Dictionary> _componentTagDictionary = new(); + + + + /// All children belonging to the Component. + public IEnumerable Children => _components; + + + /// All children and children of children until the bottom of the scene. Uses Breadth First Search. + [MarkerAttributes.CalculatedProperty, MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.High), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.ON)] + public IEnumerable AllChildren => GetAllChildren(); + public IEnumerable GetAllChildren() { + List returnValue = []; + Queue queue = new(_components); + while (queue.Count > 0) { + Component current = queue.Dequeue(); + returnValue.Add(current); + + for (int i = 0; i < current.Count; i++) queue.Enqueue(current[i]); + } + + return returnValue; + } + + + /// Amount of Components attached to the Docker + public int Count => _components.Count; + + + + //Indexers to make for loops easier. + public Component this[[DebugAttributes.ValueFitsRange] int __index] { + get => !DebugAttributes.ValueFitsRange.VerifyOrThrow(__index, 0, _components.Count) ? null : _components[__index]; + set { if (!DebugAttributes.ValueFitsRange.VerifyOrThrow(__index, 0, _components.Count)) return; _components[__index] = value; } + } + + + + //Enumerators that allow convenient foreach loops. + IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } + public IEnumerator GetEnumerator() { return new ComponentDockEnum([.._components]); } + + + + /// Compares the Docker to another Scene. + public bool Equals(Scene __other) { + if (this is Scene scene) + return scene == __other; + return false; + } + + /// Compares the Docker to another Component. + public bool Equals(Component __other) { + if (this is Component component) + return component == __other; + return false; + } + + /// Compares the Docker to another Docker. + public bool Equals(ComponentDocker __other) { + return this == __other; + } + + + + + + /// Resorts the component list to order of priority + [MarkerAttributes.UnsafeInternal] + internal void UpdatePriority(Component __component, int __priority) { + _components.Sort(Awperative._prioritySorter); + } + + /// Sends an event to all Children and tells them to continue it. + /// Integer ID of the event to send. + [MarkerAttributes.UnsafeInternal] + internal void ChainEvent(int __timeEvent) { + for (int i = 0; i < _components.Count; i++) { + _components[i].TryEvent(__timeEvent); + _components[i].ChainEvent(__timeEvent); + } + } + + /// Add a Component to the Docker. + [MarkerAttributes.UnsafeInternal] + private void AddComponentToLists(Component __component) { + Type Type = __component.GetType(); + _components.Add(__component); + if (!_componentTypeDictionary.TryAdd(Type, [__component])) _componentTypeDictionary[Type].Add(__component); + + foreach (string tag in __component._tags) HashTaggedComponent(tag, __component); + } + + /// Removes a Component from the Docker. + [MarkerAttributes.UnsafeInternal] + private void RemoveComponentFromLists(Component __component) { + Type Type = __component.GetType(); + _components.Remove(__component); + + if(_componentTypeDictionary.TryGetValue(Type, out HashSet value)) value.Remove(__component); + + foreach (string tag in __component._tags) UnhashTaggedComponent(tag, __component); + } + + /// Hashes a component in the tag dictionary + [MarkerAttributes.UnsafeInternal] + internal void HashTaggedComponent(string __tag, Component __component) { + if (!_componentTagDictionary.TryAdd(__tag, [__component])) + _componentTagDictionary[__tag].Add(__component); + } + + /// Removes a component's hash from the tag dictionary + [MarkerAttributes.UnsafeInternal] + internal void UnhashTaggedComponent(string __tag, Component __component) { + if(!_componentTagDictionary.ContainsKey(__tag)) _componentTagDictionary[__tag].Remove(__component); + } +} \ No newline at end of file diff --git a/AwperativeKernel/Kernel/ComponentDocker/ComponentDockerExposure.cs b/AwperativeKernel/Kernel/ComponentDocker/ComponentDockerExposure.cs new file mode 100644 index 0000000..5783494 --- /dev/null +++ b/AwperativeKernel/Kernel/ComponentDocker/ComponentDockerExposure.cs @@ -0,0 +1,164 @@ +using System.Collections.Generic; +using System.Linq; + + +namespace AwperativeKernel; + + +public abstract partial class ComponentDocker +{ + + + /// Tells you whether the docker contains a component with the given tag + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.O1)] + public bool Contains([DebugAttributes.NotNull] string __tag) => DebugAttributes.NotNull.VerifyOrThrow(__tag) && _componentTagDictionary.ContainsKey(__tag); + + + /// Tells you whether the docker contains a component with the given type + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.O1)] + public bool Contains<__Type>() where __Type : Component => _componentTypeDictionary.ContainsKey(typeof(__Type)); + + /// Tells you whether the docker contains a component with a given type and tag + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.O1)] + public bool Contains<__Type>([DebugAttributes.NotNull] string __tag) where __Type : Component => DebugAttributes.NotNull.VerifyOrThrow(__tag) && GetAll<__Type>(__tag).Any(); + + /// Tells you whether the docker contains a component with all the given tags + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.O1)] + public bool Contains(IEnumerable __tags) => GetAll(__tags).Any(); + + /// Tells you whether the docker contains a component with all the given tags and the type + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.O1)] + public bool Contains<__Type>(IEnumerable __tags) where __Type : Component => GetAll<__Type>(__tags).Any(); + + /// Tells you whether the docker contains the given component. + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.O1)] + public bool Contains([DebugAttributes.ComponentNotNull] Component __component) => DebugAttributes.NotNull.VerifyOrThrow(__component) && _componentTypeDictionary.TryGetValue(__component.GetType(), out var components) && components.Contains(__component); + + + + + + /// Finds the first component with a given Type + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.O1)] + public __Type Get<__Type>() where __Type : Component => _componentTypeDictionary.TryGetValue(typeof(__Type), out HashSet Components) ? (__Type)Components.FirstOrDefault() : null; + + /// Tries to find the first component with a given tag, and returns false if there is none + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.O1)] + public bool TryGet<__Type>(out __Type __component) where __Type : Component { __component = Get<__Type>(); return __component != null; } + + + + /// Gets all components of a given type + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.O1)] + public IEnumerable<__Type> GetAll<__Type>() where __Type : Component => _componentTypeDictionary.TryGetValue(typeof(__Type), out var components) ? components.OfType<__Type>().ToList() : []; + + /// Tries to get all components of a given type and returns false if there are none + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.O1)] + public bool TryGetAll<__Type>(out IEnumerable<__Type> __components) where __Type : Component { __components = GetAll<__Type>(); return __components.Any(); } + + + + /// Finds all components that have all the given tags + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.ON)] + public IEnumerable GetAll(IEnumerable __tags) { + + HashSet components; + + if (_componentTagDictionary.TryGetValue(__tags.First(), out var firstComponents)) components = firstComponents; else return []; + + foreach(var tag in __tags) + if (_componentTagDictionary.TryGetValue(tag, out var taggedComponents)) + components.RemoveWhere(x => !taggedComponents.Contains(x)); + + return components; + } + + /// Tries to find all components that have all the given tags, returns false if there are none + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.ON)] + public bool TryGetAll(IEnumerable __tags, out IEnumerable __components) + { __components = GetAll(__tags); return __components.Any(); } + + + + + + /// Finds all Components that have the given type, and all the given tags + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.ON)] + public IEnumerable<__Type> GetAll<__Type>(IEnumerable __tags) where __Type : Component { + + if (!__tags.Any()) + return []; + + HashSet<__Type> components = []; + + if (_componentTagDictionary.TryGetValue(__tags.First(), out var firstComponents)) + foreach (var component in firstComponents) if (component is __Type typedComponent) components.Add(typedComponent); + + foreach(string tag in __tags) + if (_componentTagDictionary.TryGetValue(tag, out var taggedComponents)) + components.RemoveWhere(x => !taggedComponents.Contains(x as Component)); + + return components.ToList(); + } + + /// Tries to find all the components that have the given tags and type, returns false if there are none + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.ON)] + public bool TryGetAll<__Type>(IEnumerable __tags, out IEnumerable<__Type> __components) where __Type : Component { + __components = GetAll<__Type>(__tags); return __components.Any(); + } + + + + + + /// Gets all the components with the given tag + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.O1)] + public IEnumerable GetAll(string __tag) => GetAll([__tag]); + + /// Tries to get all the components with the given tag, returns false if there are none + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.O1)] + public bool TryGetAll(string __tag, out IEnumerable __components) { __components = GetAll(__tag); return __components.Any(); } + + + + /// Gets all the components that have a certain type, and a certain tag + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.ON)] + public IEnumerable<__Type> GetAll<__Type>(string __tag) where __Type : Component => GetAll<__Type>([__tag]); + + /// Tries to get all the components with a certain tag, and a type. Returns false if there are none + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.ON)] + public bool TryGetAll<__Type>(string __tag, out IEnumerable<__Type> __components) where __Type : Component { __components = GetAll<__Type>(__tag); return __components.Any(); } + + + + /// Gets the first component with all the given tags + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.ON)] + public Component Get(IEnumerable __tags) => GetAll(__tags).FirstOrDefault(); + + /// Tries to get the first component with all the given tags. Returns false if there are none + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.ON)] + public bool TryGet(IEnumerable __tags, out Component __component) { __component = Get(__tags); return __component != null; } + + + + /// Finds the first component with the given tag + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.O1)] + public Component Get(string __tag) => GetAll([__tag]).FirstOrDefault(); + + /// Tries to find the first component with the given tag, returns false if there is none + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.O1)] + public bool TryGet(string __tag, out Component __component) { __component = Get(__tag); return __component != null; } + + + + /// Gets the first component with the given type and tag + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.ON)] + public __Type Get<__Type>(string __tag) where __Type : Component => GetAll<__Type>(__tag).FirstOrDefault(); + + /// Tries to get the first component with the given type and tag, returns false if there is none. + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.ON)] + public bool TryGet<__Type>(string __tag, out __Type __component) where __Type : Component { __component = Get<__Type>(__tag); return __component != null; } + + + +} \ No newline at end of file diff --git a/AwperativeKernel/Kernel/ComponentDocker/ComponentDockerMovement.cs b/AwperativeKernel/Kernel/ComponentDocker/ComponentDockerMovement.cs new file mode 100644 index 0000000..f94c3e1 --- /dev/null +++ b/AwperativeKernel/Kernel/ComponentDocker/ComponentDockerMovement.cs @@ -0,0 +1,96 @@ +using System.Collections.Generic; +using System.Linq; + + +namespace AwperativeKernel; + + +public abstract partial class ComponentDocker +{ + + + + /// Moves a component belonging to the docker to another docker + public void Move([DebugAttributes.ComponentNotNull,DebugAttributes.DockerOwns] Component __component, [DebugAttributes.DockerNotNull,DebugAttributes.DifferentDocker] ComponentDocker __componentDocker) { + if(!DebugAttributes.ComponentNotNull.VerifyOrThrow(__component)) return; + if(!DebugAttributes.DockerOwns.VerifyOrThrow(this, __component)) return; + if(!DebugAttributes.DockerNotNull.VerifyOrThrow(__componentDocker)) return; + if(!DebugAttributes.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; + } + + RemoveComponentFromLists(__component); + __componentDocker.AddComponentToLists(__component); + + __component.ComponentDocker = __componentDocker; + } + + + /// Moves all components in a list to another docker + public void MoveAll([DebugAttributes.EnumeratorNotNull, DebugAttributes.DockerOwns] IEnumerable __Components, [DebugAttributes.DockerNotNull, DebugAttributes.DifferentDocker] ComponentDocker __componentDocker) { + if(!DebugAttributes.EnumeratorNotNull.VerifyOrThrow(__Components)) return; + if(!DebugAttributes.DockerNotNull.VerifyOrThrow(__componentDocker)) return; + if(!DebugAttributes.DifferentDocker.VerifyOrThrow(this, __componentDocker)) return; + + foreach (Component Component in __Components) { + if(!DebugAttributes.DockerOwns.VerifyOrThrow(__componentDocker, Component)) return; + Move(Component, __componentDocker); + } + } + + /// Moves the first component with a given Type + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.O1)] + public void Move<__Type>(ComponentDocker __componentDocker) where __Type : Component => Move(Get<__Type>(), __componentDocker); + + + + /// Moves all components of a given type + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.Low), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.ON)] + public void MoveAll<__Type>(ComponentDocker __componentDocker) where __Type : Component => MoveAll(GetAll<__Type>(), __componentDocker); + + + + /// Moves all components that have all the given tags + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.ON)] + public void MoveAll(IEnumerable __tags, ComponentDocker __componentDocker) => MoveAll(GetAll(__tags), __componentDocker); + + + + + /// Moves all Components that have the given type, and all the given tags + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.ON)] + public void MoveAll<__Type>(IEnumerable __tags, ComponentDocker __componentDocker) where __Type : Component => MoveAll(GetAll<__Type>(__tags), __componentDocker); + + + + + /// Moves all the components with the given tag + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.O1)] + public void MoveAll(string __tag, ComponentDocker __componentDocker) => MoveAll(GetAll([__tag]), __componentDocker); + + + + /// Moves all the components that have a certain type, and a certain tag + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.ON)] + public void MoveAll<__Type>(string __tag, ComponentDocker __componentDocker) where __Type : Component => MoveAll(GetAll<__Type>([__tag]), __componentDocker); + + + + /// Moves the first component with the given tag + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.O1)] + public void Move(string __tag, ComponentDocker __componentDocker) => Move(GetAll([__tag]).FirstOrDefault(), __componentDocker); + + + + /// Moves the moves component with the given type and tag + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.ON)] + public void Move<__Type>(string __tag, ComponentDocker __componentDocker) where __Type : Component => Move(GetAll<__Type>(__tag).FirstOrDefault(), __componentDocker); + + +} \ No newline at end of file diff --git a/AwperativeKernel/Kernel/ComponentDocker/ComponentDockerMutation.cs b/AwperativeKernel/Kernel/ComponentDocker/ComponentDockerMutation.cs new file mode 100644 index 0000000..2524b8e --- /dev/null +++ b/AwperativeKernel/Kernel/ComponentDocker/ComponentDockerMutation.cs @@ -0,0 +1,128 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Linq; + + +namespace AwperativeKernel; + + +public abstract partial class ComponentDocker +{ + + + /// Attaches a preexisting component to the docker, this is not transferring the component, the method will throw an error if the component is already attached to a docker + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.Medium), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.O1)] + public void Add([DebugAttributes.ComponentNotNull,DebugAttributes.OrphanComponent] Component __component) { + if(!DebugAttributes.ComponentNotNull.VerifyOrThrow(__component)) return; + if(!DebugAttributes.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); + } + + + /// Creates a new instance of that type of component and attaches it to the docker, and returns a reference to it. + public __Type Add<__Type>() where __Type : Component, new() { Component newComponent = new __Type(); InitiateComponent(newComponent); return (__Type)newComponent; } + + + /// Creates a new instance of that type of component and attaches it to the docker, and returns a reference to it. + public __Type Add<__Type>(string name = null, [DebugAttributes.ValueFitsRange] 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; + } + + + /// Initiates a component into the docker. + [MarkerAttributes.UnsafeInternal] + private void InitiateComponent(Component __component) { + //add to Component Docker's lists + AddComponentToLists(__component); + + __component.ComponentDocker = this; + //create event + __component.TryEvent(4); __component.ChainEvent(4); + } + + + + + + /// Destroys a component attached to the Docker + /// + public void Destroy([DebugAttributes.ComponentNotNull,DebugAttributes.DockerOwns] Component __component) { + Stopwatch timer = Stopwatch.StartNew(); + if(!DebugAttributes.ComponentNotNull.VerifyOrThrow(__component)) return; + if(!DebugAttributes.DockerOwns.VerifyOrThrow(this, __component)) return; + + __component.TryEvent(5); + __component.ChainEvent(5); + + RemoveComponentFromLists(__component); + __component.ComponentDocker = null; + } + + + + /// Destroys all the components in a given list + public void DestroyAll([DebugAttributes.ComponentNotNull, DebugAttributes.DockerOwns] IEnumerable __Components) { foreach(Component component in __Components) Destroy(component); } + + + + /// Destroys the first component with a given Type + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.O1)] + public void Destroy<__Type>() where __Type : Component => Destroy(Get<__Type>()); + + + + /// Destroys all components of a given type + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.Low), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.ON)] + public void DestroyAll<__Type>() where __Type : Component => DestroyAll(GetAll<__Type>()); + + + + /// Destroys all components that have all the given tags + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.ON)] + public void DestroyAll(IEnumerable __tags) => DestroyAll(GetAll(__tags)); + + + + + /// Destroys all Components that have the given type, and all the given tags + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.ON)] + public void DestroyAll<__Type>(IEnumerable __tags) where __Type : Component => DestroyAll(GetAll<__Type>(__tags)); + + + + + /// Destroys all the components with the given tag + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.O1)] + public void DestroyAll(string __tag) => DestroyAll(GetAll([__tag])); + + + + /// Destroys all the components that have a certain type, and a certain tag + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.ON)] + public void DestroyAll<__Type>(string __tag) where __Type : Component => DestroyAll(GetAll<__Type>([__tag])); + + + + /// Destroys the first component with the given tag + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.O1)] + public void Destroy(string __tag) => Destroy(GetAll([__tag]).FirstOrDefault()); + + + + /// Destroys the Destroys component with the given type and tag + [MarkerAttributes.Expense(MarkerAttributes.Expense.ExpenseLevel.VeryLow), MarkerAttributes.Complexity(MarkerAttributes.Complexity.TimeComplexity.ON)] + public void Destroy<__Type>(string __tag) where __Type : Component => Destroy(GetAll<__Type>(__tag).FirstOrDefault()); + +} \ No newline at end of file diff --git a/AwperativeKernel/Kernel/ComponentDocker/Core/ComponentDocker.cs b/AwperativeKernel/Kernel/ComponentDocker/Core/ComponentDocker.cs deleted file mode 100644 index 4709020..0000000 --- a/AwperativeKernel/Kernel/ComponentDocker/Core/ComponentDocker.cs +++ /dev/null @@ -1,168 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Diagnostics; -using System.Linq; -using System.Reflection; - -namespace AwperativeKernel; - -/// -/// Base class for all Awperative objects. Responsible for Managing hierarchy between Components and Scenes, has Extensive Component Manipulation Available. -/// Also transfers Time and Carries most of the responsibilities akin to the Component. -/// -/// Please don't inherit this. I don't know why you would -/// Avery Norris -public abstract partial class ComponentDocker : IEnumerable, IEnumerable, IEquatable, IEquatable, IEquatable -{ - - //Blocks external inheritance - internal ComponentDocker() {} - - - - /// Core of the Docker, holds all of the Components, sorted by update priority. - [UnsafeInternal] internal readonly List _components = []; - /// Holds a list of Components at each of their types. This optimizes Get<Type> to O(1) - [UnsafeInternal] internal readonly Dictionary> _componentTypeDictionary = new(); - /// Stores a Component in a list at each of their tags. This optimizes Get(string tag) to O(1) - [UnsafeInternal] internal readonly Dictionary> _componentTagDictionary = new(); - - - - //Indexers to allow juicy speedy: for loops - public Component this[[ValueFitsRange] int __index] { - get => !ValueFitsRange.VerifyOrThrow(__index, 0, _components.Count) ? null : _components[__index]; - set { if (!ValueFitsRange.VerifyOrThrow(__index, 0, _components.Count)) return; _components[__index] = value; } - } - - //Allows uint indexing, which makes me mad because nobody ever does those. To convert it over we just mask the largest bit, and cast to integer. That way - //no sign flipping buisness happens. - public Component this[uint __index] => this[(int) (__index & 0x7FFFFFFF)]; - - - //Enumerators for convenient foreach loops - IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } - public IEnumerator GetEnumerator() { return new ComponentDockEnum([.._components]); } - - - /// Amount of Components attached to the Docker - public int Count => _components.Count; - - - - /// Compares the Docker to another Scene. - public bool Equals(Scene __other) { - if (this is Scene scene) - return scene == __other; - return false; - } - - /// Compares the Docker to another Component. - public bool Equals(Component __other) { - if (this is Component component) - return component == __other; - return false; - } - - /// Compares the Docker to another Docker. - public bool Equals(ComponentDocker __other) { - return this == __other; - } - - - - - - /// - /// Resorts member of Component list to match the Priority. - /// - /// Component to modify - /// New priority for Component - [UnsafeInternal] - internal void UpdatePriority(Component __component, int __priority) { - _components.Sort(Awperative._prioritySorter); - } - - /// - /// Sends an event to all Children and tells them to continue it. - /// - /// Type of event to send - [UnsafeInternal] - internal void ChainEvent(int __timeEvent) { - for (int i = 0; i < _components.Count; i++) { - _components[i].TryEvent(__timeEvent); - _components[i].ChainEvent(__timeEvent); - } - } - - /// - /// Add a Component into the lists and dictionaries. - /// - /// - [UnsafeInternal] - private void AddComponentToLists(Component __component) { - var Type = __component.GetType(); - _components.Add(__component); - if (!_componentTypeDictionary.TryAdd(Type, [__component])) _componentTypeDictionary[Type].Add(__component); - - foreach (var tag in __component._tags) AddTagToComponent(tag, __component); - } - - /// - /// Removes a Component from the lists and dictionaries. - /// - /// - [UnsafeInternal] - private void RemoveComponentFromLists(Component __component) { - var Type = __component.GetType(); - _components.Remove(__component); - - if(_componentTypeDictionary.TryGetValue(Type, out var value)) value.Remove(__component); - - foreach (var tag in __component._tags) RemoveTagFromComponent(tag, __component); - } - - /// - /// Hashes a Component in the tag dictionary - /// - /// Tag to add - /// Component to add it to - [UnsafeInternal] - internal void AddTagToComponent(string __tag, Component __component) { - if (!_componentTagDictionary.TryAdd(__tag, [__component])) - _componentTagDictionary[__tag].Add(__component); - } - - /// - /// Unhashes a Component from the tag dictionary - /// - /// Tag to remove - /// Component to remove it from - [UnsafeInternal] - internal void RemoveTagFromComponent(string __tag, Component __component) { - if(!_componentTagDictionary.ContainsKey(__tag)) _componentTagDictionary[__tag].Remove(__component); - } - - - - /// - /// All children belonging to the Component. - /// - [CalculatedProperty, CalculatedPropertyExpense("Very Low")] - public IReadOnlyList Children => _components; - - - - /// - /// All children and their children until the bottom of the scene. Uses Breadth First Search. - /// - [CalculatedProperty, CalculatedPropertyExpense("Medium O(Children)")] - public IReadOnlyList AllChildren => GetAllChildren(); - public IReadOnlyList GetAllChildren() { - List targets = [.._components]; - for (int i = 0; i < targets.Count; i++) targets.InsertRange(i + 1, targets[i]._components); - return [..targets]; - } -} \ No newline at end of file diff --git a/AwperativeKernel/Kernel/ComponentDocker/Core/ComponentDockerExposure.cs b/AwperativeKernel/Kernel/ComponentDocker/Core/ComponentDockerExposure.cs deleted file mode 100644 index e5404d1..0000000 --- a/AwperativeKernel/Kernel/ComponentDocker/Core/ComponentDockerExposure.cs +++ /dev/null @@ -1,366 +0,0 @@ - - -using System; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Collections.ObjectModel; -using System.Linq; -using System.Runtime.CompilerServices; - - -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) && _componentTagDictionary.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 - => _componentTypeDictionary.ContainsKey(typeof(__Type)); - - - - /// - /// Returns a bool based on if the current __Component is owned by this Docker - /// - /// - /// - public bool Contains([ComponentNotNull] Component __component) - => NotNull.VerifyOrThrow(__component) && _componentTypeDictionary.TryGetValue(__component.GetType(), out var components) && components.Contains(__component); - - /// - /// Finds all Components that have all the given tags - /// - /// - /// - public bool Contains<__Type>([NotNull] string __tag) - => NotNull.VerifyOrThrow(__tag) && GetAll<__Type>(__tag).Any(); - - /// - /// Finds all Components that have all the given tags - /// - /// - /// - public bool Contains(IList __tags) { - return GetAll(__tags).Any(); - } - - /// - /// Finds all Components that have all the given tags - /// - /// - /// - public bool Contains(IEnumerable __tags) { - return GetAll(__tags).Any(); - } - - /// - /// Finds all Components that have all the given tags - /// - /// - /// - public bool Contains<__Type>(IList __tags) { - return GetAll<__Type>(__tags).Any(); - } - - /// - /// Finds all Components that have all the given tags - /// - /// - /// - public bool Contains<__Type>(IEnumerable __tags) { - return GetAll<__Type>(__tags).Any(); - } - - - - - - /// - /// Searches and returns the first Component of a type found on the Docker. - /// - /// The Type of Component to search for - /// - public __Type Get<__Type>() where __Type : Component { - return _componentTypeDictionary.TryGetValue(typeof(__Type), out var Components) ? (__Type)Components.FirstOrDefault() : null; - } - - /// - /// - /// - /// - /// - /// - public bool TryGet<__Type>(out __Type __component) where __Type : Component { - __component = Get<__Type>(); return __component != null; - } - - - - /// - /// Searches and returns all Components of a type found on the Docker. - /// - /// The Type of Components to search for - /// - public IReadOnlyList<__Type> GetAll<__Type>() where __Type : Component { - return _componentTypeDictionary.TryGetValue(typeof(__Type), out var components) ? components.OfType<__Type>().ToList() : []; - } - - /// - /// - /// - /// - /// - /// - public bool TryGetAll<__Type>(out IReadOnlyList<__Type> __components) where __Type : Component { - __components = GetAll<__Type>(); return __components.Any(); - } - - - - - - /// - /// Finds all Components that have all the given tags - /// - /// - /// - public IReadOnlyList GetAll(IList __tags) { - - if (__tags.Count == 0) - return []; - - HashSet components; - - if (_componentTagDictionary.TryGetValue(__tags[0], out var firstComponents)) components = firstComponents; else return []; - - for (var i = 1; i < __tags.Count; i++) - if (_componentTagDictionary.TryGetValue(__tags[i], out var taggedComponents)) - foreach (var component in components) if (!taggedComponents.Contains(component)) components.Remove(component);else return []; - - return components.ToList(); - } - - /// - /// Finds all Components that have all the given tags - /// - /// - /// - public bool TryGetAll(IList __tags, out IReadOnlyList __components) { - __components = GetAll(__tags); return __components.Any(); - } - - - - /// - /// Finds all Components that have all the given tags, slower than GetAll() using IList. If you are being high performance, use that. - /// - /// - /// - public IReadOnlyList GetAll(IEnumerable __tags) { - - if (!__tags.Any()) - return []; - - HashSet components; - - if (_componentTagDictionary.TryGetValue(__tags.First(), out var firstComponents)) components = firstComponents; else return []; - - foreach(var tag in __tags) - if (_componentTagDictionary.TryGetValue(tag, out var taggedComponents)) - foreach (var component in components) if (!taggedComponents.Contains(component)) components.Remove(component);else return []; - - return components.ToList(); - } - - /// - /// Finds all Components that have all the given tags - /// - /// - /// - public bool TryGetAll(IEnumerable __tags, out IReadOnlyList __components) { - __components = GetAll(__tags); return __components.Any(); - } - - - - - - /// - /// Finds all Components that have all the given tags - /// - /// - /// - public IReadOnlyList<__Type> GetAll<__Type>(IList __tags) { - - if (!__tags.Any()) - return []; - - HashSet<__Type> components = []; - - if (_componentTagDictionary.TryGetValue(__tags[0], out var firstComponents)) - foreach (var component in firstComponents) if (component is __Type typedComponent) components.Add(typedComponent); - - for (var i = 1; i < __tags.Count; i++) - if (_componentTagDictionary.TryGetValue(__tags[i], out var taggedComponents)) - foreach (var component in components) if (!taggedComponents.Contains(component as Component)) components.Remove(component);else return []; - - return components.ToList(); - } - - /// - /// Finds all Components that have all the given tags - /// - /// - /// - public bool TryGetAll<__Type>(IList __tags, out IReadOnlyList<__Type> __components) { - __components = GetAll<__Type>(__tags); return __components.Any(); - } - - - - - - /// - /// Finds all Components that have all the given tags - /// - /// - /// - public IReadOnlyList<__Type> GetAll<__Type>(IEnumerable __tags) { - - if (!__tags.Any()) - return []; - - HashSet<__Type> components = []; - - if (_componentTagDictionary.TryGetValue(__tags.First(), out var firstComponents)) - foreach (var component in firstComponents) if (component is __Type typedComponent) components.Add(typedComponent); - - foreach(string tag in __tags) - if (_componentTagDictionary.TryGetValue(tag, out var taggedComponents)) - foreach (var component in components) if (!taggedComponents.Contains(component as Component)) components.Remove(component);else return []; - - return components.ToList(); - } - - /// - /// Finds all Components that have all the given tags - /// - /// - /// - public bool TryGetAll<__Type>(IEnumerable __tags, out IReadOnlyList<__Type> __components) { - __components = GetAll<__Type>(__tags); return __components.Any(); - } - - - - /// - /// Finds all Components that have all the given tags - /// - /// - /// - public IReadOnlyList GetAll(string __tag) { - return GetAll([__tag]); - } - - /// - /// Finds all Components that have all the given tags - /// - /// - /// - public bool TryGetAll(string __tag, out IReadOnlyList __components) { - __components = GetAll(__tag); return __components.Any(); - } - - - - /// - /// Finds all Components that have all the given tags - /// - /// - /// - public IReadOnlyList<__Type> GetAll<__Type>(string __tag) { - return GetAll<__Type>([__tag]); - } - - /// - /// Finds all Components that have all the given tags - /// - /// - /// - public bool TryGetAll<__Type>(string __tag, out IReadOnlyList<__Type> __components) { - __components = GetAll<__Type>(__tag); return __components.Any(); - } - - - - public Component Get(IList __tags) { - return GetAll(__tags).FirstOrDefault(); - } - - public bool TryGet(IList __tags, out Component __component) { - __component = Get(__tags); return __component != null; - } - - - - public Component Get(IEnumerable __tags) { - return GetAll(__tags).FirstOrDefault(); - } - - public bool TryGet(IEnumerable __tags, out Component __component) { - __component = Get(__tags); return __component != null; - } - - - - public __Type Get<__Type>(IList __tags) { - return GetAll<__Type>(__tags).FirstOrDefault(); - } - - public bool TryGet<__Type>(IList __tags, out __Type __component) { - __component = Get<__Type>(__tags); return __component != null; - } - - - - public Component Get(string __tag) { - return GetAll([__tag]).FirstOrDefault(); - } - - public bool TryGet(string __tag, out Component __component) { - __component = Get(__tag); return __component != null; - } - - - - public __Type Get<__Type>(string __tag) { - return Get<__Type>([__tag]); - } - - public bool TryGet<__Type>(string __tag, out __Type __component) { - __component = Get<__Type>([__tag]); return __component != null; - } - - - - - - - - - -} \ No newline at end of file diff --git a/AwperativeKernel/Kernel/ComponentDocker/Core/ComponentDockerManagement.cs b/AwperativeKernel/Kernel/ComponentDocker/Core/ComponentDockerManagement.cs deleted file mode 100644 index 0357b89..0000000 --- a/AwperativeKernel/Kernel/ComponentDocker/Core/ComponentDockerManagement.cs +++ /dev/null @@ -1,191 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Diagnostics; -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, [ValueFitsRange] 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); - - - - - public TimeSpan total; - /// - /// Destroys a Component attached to the Docker - /// - /// - public void Destroy([ComponentNotNull,DockerOwns] Component __component) { - Stopwatch timer = Stopwatch.StartNew(); - if(!ComponentNotNull.VerifyOrThrow(__component)) return; - if(!DockerOwns.VerifyOrThrow(this, __component)) return; - - __component.TryEvent(5); - __component.ChainEvent(5); - - RemoveComponentFromLists(__component); - __component.ComponentDocker = null; - timer.Stop(); - total += timer.Elapsed; - } - - - - /// - /// Destroys the first found Component of a given type - /// - /// Type of Component to destroy - public void Destroy<__Type>() where __Type : Component => DestroyAll(GetAll<__Type>()); - - - - /// - /// Destroys all Components from a given collection. - /// - /// - public void DestroyAll([ComponentNotNull, DockerOwns] IReadOnlyList __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/Overhead/Awperative/Awperative.cs b/AwperativeKernel/Kernel/Overhead/Awperative/Awperative.cs index 5d49957..69d53a1 100644 --- a/AwperativeKernel/Kernel/Overhead/Awperative/Awperative.cs +++ b/AwperativeKernel/Kernel/Overhead/Awperative/Awperative.cs @@ -27,16 +27,16 @@ public static partial class Awperative /// /// Bottom class of Awperative. Contains the OpenTK Instance. /// - [NotNull, UnsafeInternal] private static Base Base; + [DebugAttributes.NotNull, MarkerAttributes.UnsafeInternal] private static Base Base; /// /// List of all scenes currently loaded in the kernel. /// - [CalculatedProperty, CalculatedPropertyExpense("Very Low")] - public static IReadOnlyList Scenes => [.._scenes]; - [UnsafeInternal] internal static HashSet _scenes { get; private set; } = []; + [MarkerAttributes.CalculatedProperty] + public static IEnumerable Scenes => [.._scenes]; + [MarkerAttributes.UnsafeInternal] internal static HashSet _scenes { get; private set; } = []; @@ -68,7 +68,7 @@ public static partial class Awperative public static void AddScene(Scene __scene) { if (!ContainsScene(__scene.Name)) { _scenes.Add(__scene); - } else Debug.LogError("Awperative already has a Scene with that name!", ["Scene", "Name"], [GetScene(__scene.Name).GetHashCode().ToString(), __scene.Name]); return null; + } else Debug.LogError("Awperative already has a Scene with that name!", ["Scene", "Name"], [GetScene(__scene.Name).GetHashCode().ToString(), __scene.Name]); return; } diff --git a/AwperativeKernel/Kernel/RequiredModules/IDebugger.cs b/AwperativeKernel/Kernel/RequiredModules/IDebugger.cs index ceb6f31..78669c6 100644 --- a/AwperativeKernel/Kernel/RequiredModules/IDebugger.cs +++ b/AwperativeKernel/Kernel/RequiredModules/IDebugger.cs @@ -17,13 +17,13 @@ public interface IDebugger public void Stop(); public void LogAction(string __message); - public void LogAction(string __message, IReadOnlyList __values, IReadOnlyList __args); + public void LogAction(string __message, IEnumerable __values, IEnumerable __args); public void LogWarning(string __message); - public void LogWarning(string __message, IReadOnlyList __values, IReadOnlyList __args); + public void LogWarning(string __message, IEnumerable __values, IEnumerable __args); public void LogError(string __message); - public void LogError(string __message, IReadOnlyList __values, IReadOnlyList __args); + public void LogError(string __message, IEnumerable __values, IEnumerable __args); diff --git a/AwperativeKernel/Kernel/RequiredModules/IModuleManager.cs b/AwperativeKernel/Kernel/RequiredModules/IModuleManager.cs index b80d675..b4683f7 100644 --- a/AwperativeKernel/Kernel/RequiredModules/IModuleManager.cs +++ b/AwperativeKernel/Kernel/RequiredModules/IModuleManager.cs @@ -7,5 +7,5 @@ namespace AwperativeKernel; public interface IModuleManager { - public IReadOnlyList GetDependencies(); + public IEnumerable GetDependencies(); } \ 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 26a1202..ff95b26 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+8c3803fcdf9411da13e462596847a88f1080bb39")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+41dbab5ce36d1e19917d80ba23482cbbd5b04533")] [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 49ebfc5..e5ec2db 100644 --- a/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.AssemblyInfoInputs.cache +++ b/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.AssemblyInfoInputs.cache @@ -1 +1 @@ -1401ec548e06fa205cbd38d50de2d7971689c7694c0af3dc509c2945921d606a +b1a9e115a38433219f1f2e46313d2b5f0dd905c9ce83715b972f620249d7097d diff --git a/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.csproj.CoreCompileInputs.cache b/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.csproj.CoreCompileInputs.cache index be3a4c0..d4a5a71 100644 --- a/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.csproj.CoreCompileInputs.cache +++ b/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -22dd22d60e6c8fbd5110065c2450e37bceb89fe776160bf2e51e6a6a8825b2b1 +5635b864dfc1ecaa0f2c52b65d178dd300857fd622e8afa48acfcadbd77f72d1 diff --git a/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.dll b/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.dll index 73c7ee2085e8d5de3fef5cfd10899ab575bdc345..84430ca16145ae5aa2a788bdea1357391401953a 100644 GIT binary patch literal 36864 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 z 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 literal 35328 zcmeHw3w%`7wf8z_&YYP!Gnr&&LK5EL>6n2Ko(4o95Fk@Nyz=9^VVRE)TEFB(`K2=RTI( zSKDr2@+l`;U71R!nt_RJhfv^-?!-6mGY`X6nM$-JA;`AUoA|P>Yw^wd%p;nghf496 z=s$nhHl5rw`)s1lRYdUO-}Q-9c_@U+_&-FtE7^b%w9E;fQh)WwP&n*{Gr=2Ik^;YT z@3_*`aJiPHX3BMN>O8p)No|np&{Pj!1FqyWA}cu^pum+Zht7!MO3nZpvBFmBRtQDU zV9c%OBqL_&M2+-~L(#K{C*+wJ)HjB?>3;VSXfY48<78Zng|0e2Q>T~!2zGdO=^ROQ7=fo?~YJ&yjc zzjst|qxqqw%!pVVAt5UlV}(Heo*+A2`%FP5W=P!kvhd`Q7OB!{G$tNW8+=!M!i5Mk zO8v1&DvlPTH=Qg%PhRgI{?2;$e@Z=*E`ps%Zy_qNVsmvfiJV|zp#7c+6H`Y}yVOY@ zg*uXggXN8)?FO^-0?X8svrzqn5%5mjFEg+pM!wt(99m`4TD0fp_7GG^OO_RzZ6;@< z;P;@}fEUdUMoUgZsZVP*iFL-Bc<>EB@|~GH3kdxx*EI4T_&WKhZUy<#H07lO#JEYd zp!FT6>8a+w!Gr-*jm)1%pc_jm=j0PwF3})0QMP|yXSW9O{8^BfK#h=*O`z_O+fJZ{ zN}#4BP`8>xrjtNTJAwWhdcA|~!IK1vv{`1)G*8%*n`x(tV~?!U%0I3tKHWH>qaQJ? z#E$40sfa6YuoeT!#z-N3wl+*!>WqO)PtM_(P}600sv%$b?Y)(sC@CZwnoAES?}m)? ziau?q;ow<0JN1wMCCy|btAAmHz7-kMz)Wy$lL81xtcI*fI+ejT566isig{rw)AX1J z(jqlq--;nH%DW-gRB}SE*rY4U$Sa#%6I~@Sx3E_KcpHmVOi|3zHS0>7DFg zM;;nEH##V`8Z8Iiiji3{LXS>B8NSmA@rdlfb66ZAi;jh*(1lcG zm<6#hHl5cWPGPPHChY{DC&?NLVn(r~KxnLFjob&FMnb2Rr<3c7PI$pE1E>^;k(bS= zl1f~M_rXYDAxdNOZds~Tf2`aiD__8imJ56nLS%ZAi&(o?mTW(H#A0yaWHxQ$56$Fa z2&6Ht*t%g0=H`aJ$qnK95MM{Tq7UOrTtE&(VUB7K;jmfoSvH>BD(IzpvBb5Wu7}ob z90z(7o05=mm5H};%UF1ne_S*ceUkAG_K0#7 zZ;>jEN}#_$=*l1&BWzri1g3P>OrBRdVGm6~ka^gblS21ZkD6ms1; zVfZ~0pQ{*J<)$5I8wn73P|~{PjKm^tQ{T#?Xr@;J87KER*7zi5g{87b#O5b)Gh^9o za!E=`;?~Lv#6n>`dOk`8y3Z9wSeOLD1t3iP%^QVb{X_}+H`LxiRM`85^Jqkx;5u-S z%i3_oT+U2w3WlzrF>%WeII=Cc|aAC@QLt~7lUN85zZ15(LOqomz=Dc z^Z_$ehKy$_qMLK0A@{El_J`s{G4Eqmi9a^P^psv;dL$CmK(B^!0@05>8c#LZBK{&T z6G@g_qt*zXg34~T37ZWh5gGhr7>S|LIEcwL0Ic_|U{{5i940D&!X#rc!DqVo zHeFQZ+HggYfnrgFWQ^Oe{etmz;y((vnNiHUn9Kv^w|sunr|@Bk(tncr=wu(hOU4!p zH2ai0lIybFnTh_ec481a!V~kGQB2p^y^Q70_j0EXEfJ`a3;YzND zE(9m0hd&BaVg=RT1JfSwlH{deV+L)&Mb=TngO+W%!xjka^q7cxUW8Gf`Iu|n1aKNBRXV_v2EjoFayfb_(pn1S9CCCIK$DhRnt zFNk3Ct!zJGMEoKDtS;nrQ{r6$7nZ4cx`EET&zYw#$>|865LO(Q1k(y*d44=`PI(h` zvH#<}A5tlAUGjW$1WdcPyfciQ%r$pH4$kf5{<>qA!84a}(NuLqX4s>AghQB|k9_cv zPx;6Sc|um!N9Z8?$m-*xGa;Szk*|-B)NR-`Zxn>w6TE2uEVNI*%5#x63|*l#o%yix zk4|UP_7{1{<2dT$E1p;b_-YFFmPpcleT6BBI4T7*okFu%HY9uWkERRAqr$@-n;Lej zuA3oqBhQHmA-f>6DdH(bPT)f;B#)3MnTFo+s3QG8j2LnE>VGNDt+qR1=~H28DVMV| zFGg5qct8TN>Tn>sk&6W(D^wt}QP$+F^Mj!vJHH^giJL@#O79S$fhe|K*2HJfc;H0I zsJsC6AwYd0Up7DsLxr=F5}-U;?EqE&pHK6ya{T{YTKLIHVwDpY`=4{8J&`$9XT!xq zPUinnef{4rV*lIR?}WZDwiPp5Lf;O8kQMf;aR`J0xp64KI25RH2!{Nj-~i(QC-OK1 z`;5aJ)XR=TL7#DuNg%la^T3CB;LFZ~>_}))o(DBFug4jO=V+lvLkKec>-5F3+Q4&y z7mGe)!fWs()EmlUqL*4`dJ95ioEgQU9HVhjtcx*!Ng%9wqg%mnt&k+70;1oXOZ1;} zj($wt�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 NMf(1~n*UKA_&**ENrnIb diff --git a/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.pdb b/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.pdb index 347b73b7ea5f66bb88bac8766d9fd5881c54062d..5104910a20f6fe3b8da6cbe49f5a254d3764bc5d 100644 GIT binary patch delta 9341 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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 1831c88e5e38d9d4242bd0c272a87f7391019af0..8609238f8a98000548b6e3a59d9903b616d731ad 100644 GIT binary patch literal 19456 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 diff --git a/AwperativeKernel/obj/rider.project.model.nuget.info b/AwperativeKernel/obj/rider.project.model.nuget.info index a14e091..88febf5 100644 --- a/AwperativeKernel/obj/rider.project.model.nuget.info +++ b/AwperativeKernel/obj/rider.project.model.nuget.info @@ -1 +1 @@ -17722975223225869 \ No newline at end of file +17722975227348769 \ No newline at end of file