diff --git a/Skeleton.csproj b/Skeleton.csproj index 7782305..4fe1078 100644 --- a/Skeleton.csproj +++ b/Skeleton.csproj @@ -4,7 +4,7 @@ net8.0 enable disable - 0.0.6 + 0.0.7 hzhang true diff --git a/src/Algebra/CategoryOf.cs b/src/Algebra/CategoryOf.cs index d23932c..faeb12c 100644 --- a/src/Algebra/CategoryOf.cs +++ b/src/Algebra/CategoryOf.cs @@ -1,6 +1,6 @@ using System.Reflection; using Skeleton.Algebra.DimensionProviders; -using Skeleton.Algebra.ScalarFieldStructure; +using Skeleton.Algebra.FieldStructures; namespace Skeleton.Algebra; diff --git a/src/Algebra/Extensions/GeneralExt.cs b/src/Algebra/Extensions/GeneralExt.cs index f60c4d9..8aa623e 100644 --- a/src/Algebra/Extensions/GeneralExt.cs +++ b/src/Algebra/Extensions/GeneralExt.cs @@ -1,5 +1,5 @@ using System.Numerics; -using Skeleton.Algebra.ScalarFieldStructure; +using Skeleton.Algebra.FieldStructures; using Skeleton.Utils.Helpers; namespace Skeleton.Algebra.Extensions; diff --git a/src/Algebra/ScalarFieldStructure/ComplexFieldStructure.cs b/src/Algebra/FieldStructures/ComplexFieldStructure.cs similarity index 98% rename from src/Algebra/ScalarFieldStructure/ComplexFieldStructure.cs rename to src/Algebra/FieldStructures/ComplexFieldStructure.cs index d7749d4..74f512f 100644 --- a/src/Algebra/ScalarFieldStructure/ComplexFieldStructure.cs +++ b/src/Algebra/FieldStructures/ComplexFieldStructure.cs @@ -1,8 +1,9 @@ using System.Numerics; -namespace Skeleton.Algebra.ScalarFieldStructure; +namespace Skeleton.Algebra.FieldStructures; /// +[CustomFieldStructure] public class ComplexFieldStructure : FieldStructure { /// diff --git a/src/Algebra/FieldStructures/CustomFieldAutoRegister.cs b/src/Algebra/FieldStructures/CustomFieldAutoRegister.cs new file mode 100644 index 0000000..00fcc59 --- /dev/null +++ b/src/Algebra/FieldStructures/CustomFieldAutoRegister.cs @@ -0,0 +1,44 @@ +using System.Diagnostics.CodeAnalysis; +using System.Reflection; +using System.Runtime.CompilerServices; + +namespace Skeleton.Algebra.FieldStructures; + +public static class CustomFieldAutoRegister +{ + [SuppressMessage( + "Style", + "CA2255: The ModuleInitializer attribute should not be used in libraries", + Justification = "Intended for automatic field structure registration")] + [ModuleInitializer] + internal static void Initialize() + { + Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); + foreach (Assembly assembly in assemblies) + { + foreach (Type type in assembly.GetTypes()) + { + if (type.GetCustomAttribute(typeof(CustomFieldStructure)) != null) + { + Type baseType = type.BaseType; + if (baseType != null + && baseType.IsGenericType + && baseType.GetGenericTypeDefinition() == typeof(FieldStructure<>) + ) + { + Type tField = baseType.GetGenericArguments()[0]; + var instance = Activator.CreateInstance(type); + var registerMethod = typeof(FieldStructureRegistry) + .GetMethods(BindingFlags.Static | BindingFlags.Public) + .FirstOrDefault(m => m.Name == "Register" && m.IsGenericMethod); + if (registerMethod != null) + { + var genericRegister = registerMethod.MakeGenericMethod(tField); + genericRegister.Invoke(null, [instance]); + } + } + } + } + } + } +} \ No newline at end of file diff --git a/src/Algebra/FieldStructures/CustomFieldStructure.cs b/src/Algebra/FieldStructures/CustomFieldStructure.cs new file mode 100644 index 0000000..55774e1 --- /dev/null +++ b/src/Algebra/FieldStructures/CustomFieldStructure.cs @@ -0,0 +1,6 @@ +namespace Skeleton.Algebra.FieldStructures; +[AttributeUsage(AttributeTargets.Class)] +public class CustomFieldStructure : Attribute +{ + +} \ No newline at end of file diff --git a/src/Algebra/ScalarFieldStructure/FieldStructure.cs b/src/Algebra/FieldStructures/FieldStructure.cs similarity index 97% rename from src/Algebra/ScalarFieldStructure/FieldStructure.cs rename to src/Algebra/FieldStructures/FieldStructure.cs index c48b969..19ebe09 100644 --- a/src/Algebra/ScalarFieldStructure/FieldStructure.cs +++ b/src/Algebra/FieldStructures/FieldStructure.cs @@ -2,7 +2,7 @@ using System.Numerics; using Skeleton.Algebra.Extensions; using Skeleton.DataStructure.Packs; -namespace Skeleton.Algebra.ScalarFieldStructure; +namespace Skeleton.Algebra.FieldStructures; /// /// operations / structure of the field @@ -22,10 +22,6 @@ public abstract class FieldStructure : FieldStructure /// public static FieldStructure Dispatch() { - if (typeof(TScalar) == typeof(double)) - return (RealFieldStructure.Structure as FieldStructure)!; - if (typeof(TScalar) == typeof(Complex)) - return (ComplexFieldStructure.Structure as FieldStructure)!; return FieldStructureRegistry.GetOperation(); } diff --git a/src/Algebra/ScalarFieldStructure/FieldStructureRegistry.cs b/src/Algebra/FieldStructures/FieldStructureRegistry.cs similarity index 92% rename from src/Algebra/ScalarFieldStructure/FieldStructureRegistry.cs rename to src/Algebra/FieldStructures/FieldStructureRegistry.cs index f35fdcd..a8c0e37 100644 --- a/src/Algebra/ScalarFieldStructure/FieldStructureRegistry.cs +++ b/src/Algebra/FieldStructures/FieldStructureRegistry.cs @@ -1,4 +1,4 @@ -namespace Skeleton.Algebra.ScalarFieldStructure; +namespace Skeleton.Algebra.FieldStructures; /// /// diff --git a/src/Algebra/ScalarFieldStructure/RealFieldStructure.cs b/src/Algebra/FieldStructures/RealFieldStructure.cs similarity index 97% rename from src/Algebra/ScalarFieldStructure/RealFieldStructure.cs rename to src/Algebra/FieldStructures/RealFieldStructure.cs index a8de10e..e214944 100644 --- a/src/Algebra/ScalarFieldStructure/RealFieldStructure.cs +++ b/src/Algebra/FieldStructures/RealFieldStructure.cs @@ -1,8 +1,9 @@ using System.Numerics; -namespace Skeleton.Algebra.ScalarFieldStructure; +namespace Skeleton.Algebra.FieldStructures; /// +[CustomFieldStructure] public class RealFieldStructure : FieldStructure { /// diff --git a/src/Algebra/Matrices/Matrix.cs b/src/Algebra/Matrices/Matrix.cs index 862606f..6d7eb3d 100644 --- a/src/Algebra/Matrices/Matrix.cs +++ b/src/Algebra/Matrices/Matrix.cs @@ -4,9 +4,9 @@ using Skeleton.Algebra.AdditionalProperties.Extensions; using Skeleton.Algebra.AffineSpaces; using Skeleton.Algebra.DimensionProviders; using Skeleton.Algebra.Extensions; +using Skeleton.Algebra.FieldStructures; using Skeleton.Algebra.FixableObjects; using Skeleton.Algebra.Matrices.MatrixProperty; -using Skeleton.Algebra.ScalarFieldStructure; using Skeleton.Algebra.Vectors; using Skeleton.Algebra.VectorSpaces; using Skeleton.DataStructure.Packs; diff --git a/src/Algebra/Matrices/MatrixProperty/MatrixProperty.cs b/src/Algebra/Matrices/MatrixProperty/MatrixProperty.cs index 01075ab..48b1107 100644 --- a/src/Algebra/Matrices/MatrixProperty/MatrixProperty.cs +++ b/src/Algebra/Matrices/MatrixProperty/MatrixProperty.cs @@ -1,4 +1,4 @@ -using Skeleton.Algebra.ScalarFieldStructure; +using Skeleton.Algebra.FieldStructures; using Skeleton.Algebra.Vectors; namespace Skeleton.Algebra.Matrices.MatrixProperty; diff --git a/src/Algebra/Matrices/NormalMatrices/FDiagonalMatrix.cs b/src/Algebra/Matrices/NormalMatrices/FDiagonalMatrix.cs index 735b758..ccef98b 100644 --- a/src/Algebra/Matrices/NormalMatrices/FDiagonalMatrix.cs +++ b/src/Algebra/Matrices/NormalMatrices/FDiagonalMatrix.cs @@ -1,5 +1,4 @@ using Skeleton.Algebra.FixableObjects; -using Skeleton.Algebra.ScalarFieldStructure; namespace Skeleton.Algebra; diff --git a/src/Algebra/Matrices/NormalMatrices/FNormalMatrix.cs b/src/Algebra/Matrices/NormalMatrices/FNormalMatrix.cs index ac0c066..e97b7b0 100644 --- a/src/Algebra/Matrices/NormalMatrices/FNormalMatrix.cs +++ b/src/Algebra/Matrices/NormalMatrices/FNormalMatrix.cs @@ -1,5 +1,4 @@ using Skeleton.Algebra.FixableObjects; -using Skeleton.Algebra.ScalarFieldStructure; using Skeleton.DataStructure.Packs.MatrixDecompositions; namespace Skeleton.Algebra; diff --git a/src/Algebra/VectorSpaces/FVectorSpace.cs b/src/Algebra/VectorSpaces/FVectorSpace.cs index 6871aa9..a6f09a6 100644 --- a/src/Algebra/VectorSpaces/FVectorSpace.cs +++ b/src/Algebra/VectorSpaces/FVectorSpace.cs @@ -1,4 +1,4 @@ -using Skeleton.Algebra.ScalarFieldStructure; +using Skeleton.Algebra.FieldStructures; using Skeleton.Algebra.VectorSpaces; namespace Skeleton.Algebra; diff --git a/src/Algebra/VectorSpaces/VectorSpace.cs b/src/Algebra/VectorSpaces/VectorSpace.cs index f5abe1c..f5c0a22 100644 --- a/src/Algebra/VectorSpaces/VectorSpace.cs +++ b/src/Algebra/VectorSpaces/VectorSpace.cs @@ -1,7 +1,7 @@ using System.Collections; +using Skeleton.Algebra.FieldStructures; using Skeleton.Algebra.FixableObjects; using Skeleton.Algebra.Matrices; -using Skeleton.Algebra.ScalarFieldStructure; using Skeleton.Algebra.Vectors; using Skeleton.DataStructure.Packs; diff --git a/src/Algebra/Vectors/FVector.cs b/src/Algebra/Vectors/FVector.cs index 50073af..2df7ab3 100644 --- a/src/Algebra/Vectors/FVector.cs +++ b/src/Algebra/Vectors/FVector.cs @@ -1,6 +1,6 @@ using System.Numerics; +using Skeleton.Algebra.FieldStructures; using Skeleton.Algebra.FixableObjects; -using Skeleton.Algebra.ScalarFieldStructure; using Skeleton.Algebra.Vectors; namespace Skeleton.Algebra; diff --git a/src/Algebra/Vectors/Vector.cs b/src/Algebra/Vectors/Vector.cs index bd8e98e..3d17d7a 100644 --- a/src/Algebra/Vectors/Vector.cs +++ b/src/Algebra/Vectors/Vector.cs @@ -2,8 +2,8 @@ using System.Collections; using System.Numerics; using System.Runtime.CompilerServices; using Skeleton.Algebra.Extensions; +using Skeleton.Algebra.FieldStructures; using Skeleton.Algebra.FixableObjects; -using Skeleton.Algebra.ScalarFieldStructure; namespace Skeleton.Algebra.Vectors; diff --git a/src/Analysis/AnalyticFunctions/Polynomials/Implements/Polynomial.cs b/src/Analysis/AnalyticFunctions/Polynomials/Implements/Polynomial.cs index 9dd3538..ae0691a 100644 --- a/src/Analysis/AnalyticFunctions/Polynomials/Implements/Polynomial.cs +++ b/src/Analysis/AnalyticFunctions/Polynomials/Implements/Polynomial.cs @@ -1,6 +1,6 @@ using System.Numerics; using Skeleton.Algebra.Extensions; -using Skeleton.Algebra.ScalarFieldStructure; +using Skeleton.Algebra.FieldStructures; using Skeleton.Analysis.AnalyticFunctions.Implements; using Skeleton.Analysis.BivariantFunctions.Real.Implements; using Skeleton.DataStructure.Packs;