add: auto register custom field

This commit is contained in:
h z
2024-12-12 12:16:22 +00:00
parent a4a3a5f5ba
commit 9b9433fe36
18 changed files with 66 additions and 20 deletions

View File

@@ -1,6 +1,6 @@
using System.Reflection;
using Skeleton.Algebra.DimensionProviders;
using Skeleton.Algebra.ScalarFieldStructure;
using Skeleton.Algebra.FieldStructures;
namespace Skeleton.Algebra;

View File

@@ -1,5 +1,5 @@
using System.Numerics;
using Skeleton.Algebra.ScalarFieldStructure;
using Skeleton.Algebra.FieldStructures;
using Skeleton.Utils.Helpers;
namespace Skeleton.Algebra.Extensions;

View File

@@ -1,8 +1,9 @@
using System.Numerics;
namespace Skeleton.Algebra.ScalarFieldStructure;
namespace Skeleton.Algebra.FieldStructures;
/// <inheritdoc />
[CustomFieldStructure]
public class ComplexFieldStructure : FieldStructure<Complex>
{
/// <summary>

View 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]);
}
}
}
}
}
}
}

View File

@@ -0,0 +1,6 @@
namespace Skeleton.Algebra.FieldStructures;
[AttributeUsage(AttributeTargets.Class)]
public class CustomFieldStructure : Attribute
{
}

View File

@@ -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>();
}

View File

@@ -1,4 +1,4 @@
namespace Skeleton.Algebra.ScalarFieldStructure;
namespace Skeleton.Algebra.FieldStructures;
/// <summary>
///

View File

@@ -1,8 +1,9 @@
using System.Numerics;
namespace Skeleton.Algebra.ScalarFieldStructure;
namespace Skeleton.Algebra.FieldStructures;
/// <inheritdoc />
[CustomFieldStructure]
public class RealFieldStructure : FieldStructure<double>
{
/// <summary>

View File

@@ -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;

View File

@@ -1,4 +1,4 @@
using Skeleton.Algebra.ScalarFieldStructure;
using Skeleton.Algebra.FieldStructures;
using Skeleton.Algebra.Vectors;
namespace Skeleton.Algebra.Matrices.MatrixProperty;

View File

@@ -1,5 +1,4 @@
using Skeleton.Algebra.FixableObjects;
using Skeleton.Algebra.ScalarFieldStructure;
namespace Skeleton.Algebra;

View File

@@ -1,5 +1,4 @@
using Skeleton.Algebra.FixableObjects;
using Skeleton.Algebra.ScalarFieldStructure;
using Skeleton.DataStructure.Packs.MatrixDecompositions;
namespace Skeleton.Algebra;

View File

@@ -1,4 +1,4 @@
using Skeleton.Algebra.ScalarFieldStructure;
using Skeleton.Algebra.FieldStructures;
using Skeleton.Algebra.VectorSpaces;
namespace Skeleton.Algebra;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;