add: auto register custom field
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
using System.Reflection;
|
||||
using Skeleton.Algebra.DimensionProviders;
|
||||
using Skeleton.Algebra.ScalarFieldStructure;
|
||||
using Skeleton.Algebra.FieldStructures;
|
||||
|
||||
namespace Skeleton.Algebra;
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using System.Numerics;
|
||||
using Skeleton.Algebra.ScalarFieldStructure;
|
||||
using Skeleton.Algebra.FieldStructures;
|
||||
using Skeleton.Utils.Helpers;
|
||||
|
||||
namespace Skeleton.Algebra.Extensions;
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
using System.Numerics;
|
||||
|
||||
namespace Skeleton.Algebra.ScalarFieldStructure;
|
||||
namespace Skeleton.Algebra.FieldStructures;
|
||||
|
||||
/// <inheritdoc />
|
||||
[CustomFieldStructure]
|
||||
public class ComplexFieldStructure : FieldStructure<Complex>
|
||||
{
|
||||
/// <summary>
|
||||
44
src/Algebra/FieldStructures/CustomFieldAutoRegister.cs
Normal file
44
src/Algebra/FieldStructures/CustomFieldAutoRegister.cs
Normal file
@@ -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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
6
src/Algebra/FieldStructures/CustomFieldStructure.cs
Normal file
6
src/Algebra/FieldStructures/CustomFieldStructure.cs
Normal file
@@ -0,0 +1,6 @@
|
||||
namespace Skeleton.Algebra.FieldStructures;
|
||||
[AttributeUsage(AttributeTargets.Class)]
|
||||
public class CustomFieldStructure : Attribute
|
||||
{
|
||||
|
||||
}
|
||||
@@ -2,7 +2,7 @@ using System.Numerics;
|
||||
using Skeleton.Algebra.Extensions;
|
||||
using Skeleton.DataStructure.Packs;
|
||||
|
||||
namespace Skeleton.Algebra.ScalarFieldStructure;
|
||||
namespace Skeleton.Algebra.FieldStructures;
|
||||
|
||||
/// <summary>
|
||||
/// operations / structure of the field
|
||||
@@ -22,10 +22,6 @@ public abstract class FieldStructure<TScalar> : FieldStructure
|
||||
/// <returns></returns>
|
||||
public static FieldStructure<TScalar> Dispatch()
|
||||
{
|
||||
if (typeof(TScalar) == typeof(double))
|
||||
return (RealFieldStructure.Structure as FieldStructure<TScalar>)!;
|
||||
if (typeof(TScalar) == typeof(Complex))
|
||||
return (ComplexFieldStructure.Structure as FieldStructure<TScalar>)!;
|
||||
return FieldStructureRegistry.GetOperation<TScalar>();
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace Skeleton.Algebra.ScalarFieldStructure;
|
||||
namespace Skeleton.Algebra.FieldStructures;
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
@@ -1,8 +1,9 @@
|
||||
using System.Numerics;
|
||||
|
||||
namespace Skeleton.Algebra.ScalarFieldStructure;
|
||||
namespace Skeleton.Algebra.FieldStructures;
|
||||
|
||||
/// <inheritdoc />
|
||||
[CustomFieldStructure]
|
||||
public class RealFieldStructure : FieldStructure<double>
|
||||
{
|
||||
/// <summary>
|
||||
@@ -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;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using Skeleton.Algebra.ScalarFieldStructure;
|
||||
using Skeleton.Algebra.FieldStructures;
|
||||
using Skeleton.Algebra.Vectors;
|
||||
|
||||
namespace Skeleton.Algebra.Matrices.MatrixProperty;
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using Skeleton.Algebra.FixableObjects;
|
||||
using Skeleton.Algebra.ScalarFieldStructure;
|
||||
|
||||
namespace Skeleton.Algebra;
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using Skeleton.Algebra.FixableObjects;
|
||||
using Skeleton.Algebra.ScalarFieldStructure;
|
||||
using Skeleton.DataStructure.Packs.MatrixDecompositions;
|
||||
|
||||
namespace Skeleton.Algebra;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using Skeleton.Algebra.ScalarFieldStructure;
|
||||
using Skeleton.Algebra.FieldStructures;
|
||||
using Skeleton.Algebra.VectorSpaces;
|
||||
|
||||
namespace Skeleton.Algebra;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user