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

@@ -4,7 +4,7 @@
<TargetFramework>net8.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<Nullable>disable</Nullable> <Nullable>disable</Nullable>
<Version>0.0.6</Version> <Version>0.0.7</Version>
<Description> </Description> <Description> </Description>
<Copyright>hzhang</Copyright> <Copyright>hzhang</Copyright>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> <GeneratePackageOnBuild>true</GeneratePackageOnBuild>

View File

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

View File

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

View File

@@ -1,8 +1,9 @@
using System.Numerics; using System.Numerics;
namespace Skeleton.Algebra.ScalarFieldStructure; namespace Skeleton.Algebra.FieldStructures;
/// <inheritdoc /> /// <inheritdoc />
[CustomFieldStructure]
public class ComplexFieldStructure : FieldStructure<Complex> public class ComplexFieldStructure : FieldStructure<Complex>
{ {
/// <summary> /// <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.Algebra.Extensions;
using Skeleton.DataStructure.Packs; using Skeleton.DataStructure.Packs;
namespace Skeleton.Algebra.ScalarFieldStructure; namespace Skeleton.Algebra.FieldStructures;
/// <summary> /// <summary>
/// operations / structure of the field /// operations / structure of the field
@@ -22,10 +22,6 @@ public abstract class FieldStructure<TScalar> : FieldStructure
/// <returns></returns> /// <returns></returns>
public static FieldStructure<TScalar> Dispatch() 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>(); return FieldStructureRegistry.GetOperation<TScalar>();
} }

View File

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

View File

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

View File

@@ -4,9 +4,9 @@ using Skeleton.Algebra.AdditionalProperties.Extensions;
using Skeleton.Algebra.AffineSpaces; using Skeleton.Algebra.AffineSpaces;
using Skeleton.Algebra.DimensionProviders; using Skeleton.Algebra.DimensionProviders;
using Skeleton.Algebra.Extensions; using Skeleton.Algebra.Extensions;
using Skeleton.Algebra.FieldStructures;
using Skeleton.Algebra.FixableObjects; using Skeleton.Algebra.FixableObjects;
using Skeleton.Algebra.Matrices.MatrixProperty; using Skeleton.Algebra.Matrices.MatrixProperty;
using Skeleton.Algebra.ScalarFieldStructure;
using Skeleton.Algebra.Vectors; using Skeleton.Algebra.Vectors;
using Skeleton.Algebra.VectorSpaces; using Skeleton.Algebra.VectorSpaces;
using Skeleton.DataStructure.Packs; using Skeleton.DataStructure.Packs;

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,7 +1,7 @@
using System.Collections; using System.Collections;
using Skeleton.Algebra.FieldStructures;
using Skeleton.Algebra.FixableObjects; using Skeleton.Algebra.FixableObjects;
using Skeleton.Algebra.Matrices; using Skeleton.Algebra.Matrices;
using Skeleton.Algebra.ScalarFieldStructure;
using Skeleton.Algebra.Vectors; using Skeleton.Algebra.Vectors;
using Skeleton.DataStructure.Packs; using Skeleton.DataStructure.Packs;

View File

@@ -1,6 +1,6 @@
using System.Numerics; using System.Numerics;
using Skeleton.Algebra.FieldStructures;
using Skeleton.Algebra.FixableObjects; using Skeleton.Algebra.FixableObjects;
using Skeleton.Algebra.ScalarFieldStructure;
using Skeleton.Algebra.Vectors; using Skeleton.Algebra.Vectors;
namespace Skeleton.Algebra; namespace Skeleton.Algebra;

View File

@@ -2,8 +2,8 @@ using System.Collections;
using System.Numerics; using System.Numerics;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using Skeleton.Algebra.Extensions; using Skeleton.Algebra.Extensions;
using Skeleton.Algebra.FieldStructures;
using Skeleton.Algebra.FixableObjects; using Skeleton.Algebra.FixableObjects;
using Skeleton.Algebra.ScalarFieldStructure;
namespace Skeleton.Algebra.Vectors; namespace Skeleton.Algebra.Vectors;

View File

@@ -1,6 +1,6 @@
using System.Numerics; using System.Numerics;
using Skeleton.Algebra.Extensions; using Skeleton.Algebra.Extensions;
using Skeleton.Algebra.ScalarFieldStructure; using Skeleton.Algebra.FieldStructures;
using Skeleton.Analysis.AnalyticFunctions.Implements; using Skeleton.Analysis.AnalyticFunctions.Implements;
using Skeleton.Analysis.BivariantFunctions.Real.Implements; using Skeleton.Analysis.BivariantFunctions.Real.Implements;
using Skeleton.DataStructure.Packs; using Skeleton.DataStructure.Packs;