diff --git a/QWERTYkez.Mensura.Generator/ComplexUnitGenerator.cs b/QWERTYkez.Mensura.Generator/ComplexUnitGenerator.cs index 34d2f13..bfa01a1 100644 --- a/QWERTYkez.Mensura.Generator/ComplexUnitGenerator.cs +++ b/QWERTYkez.Mensura.Generator/ComplexUnitGenerator.cs @@ -195,7 +195,7 @@ using System.Runtime.Serialization; namespace QWERTYkez.Mensura.Units; [JsonConverter(typeof(UnitJsonConverter<{typeNameZ}>))] -public readonly partial record struct {typeNameZ} : IEquatable<{typeNameZ}>, IMensuraUnit +public readonly partial record struct {typeNameZ} : IEquatable<{typeNameZ}>, IMensuraUnit, IMensuraUnit<{typeNameZ}> { [JsonInclude, DataMember, JsonPropertyName(""v""), Obsolete] // для JSON / EF на случай сбоев, если пробелма с _Value @@ -212,6 +212,16 @@ public readonly partial record struct {typeNameZ} : IEquatable<{typeNameZ}>, IMe public static explicit operator double({typeNameZ} unit) => unit._Value; + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public {typeNameZ} Abs() => new(Math.Abs(_Value)); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal R Pow2_Internal() where R : struct, IMensuraUnit, IEquatable => (_Value * _Value).ToUnit(); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal R Sqrt_Internal() where R : struct, IMensuraUnit, IEquatable => Math.Sqrt(_Value).ToUnit(); + + [JsonIgnore, IgnoreDataMember] public bool IsPositive => _Value >= 0; [JsonIgnore, IgnoreDataMember] public bool IsGreaterThanZero => _Value > 0; [JsonIgnore, IgnoreDataMember] public bool IsNegative => double.IsNegative(_Value); diff --git a/QWERTYkez.Mensura.Generator/UnitGenerator.cs b/QWERTYkez.Mensura.Generator/UnitGenerator.cs index 31ae805..06117aa 100644 --- a/QWERTYkez.Mensura.Generator/UnitGenerator.cs +++ b/QWERTYkez.Mensura.Generator/UnitGenerator.cs @@ -144,7 +144,7 @@ using System.Runtime.Serialization; namespace QWERTYkez.Mensura.Units; [JsonConverter(typeof(UnitJsonConverter<{typeName}>))] -public readonly partial record struct {typeName} : IEquatable<{typeName}>, IMensuraUnit +public readonly partial record struct {typeName} : IEquatable<{typeName}>, IMensuraUnit, IMensuraUnit<{typeName}> { [JsonInclude, DataMember, JsonPropertyName(""v""), Obsolete] // для JSON / EF на случай сбоев, если пробелма с _Value internal double Value { get => _Value; init => _Value = value; } diff --git a/QWERTYkez.Mensura/IMensuraUnit.cs b/QWERTYkez.Mensura/IMensuraUnit.cs index e25e866..37d9ab0 100644 --- a/QWERTYkez.Mensura/IMensuraUnit.cs +++ b/QWERTYkez.Mensura/IMensuraUnit.cs @@ -1,3 +1,19 @@ namespace QWERTYkez.Mensura; -public interface IMensuraUnit { } \ No newline at end of file +public interface IMensuraUnit +{ + [JsonIgnore, IgnoreDataMember] public bool IsPositive { get; } + [JsonIgnore, IgnoreDataMember] public bool IsGreaterThanZero { get; } + [JsonIgnore, IgnoreDataMember] public bool IsNegative { get; } + [JsonIgnore, IgnoreDataMember] public bool IsZero { get; } + [JsonIgnore, IgnoreDataMember] public bool IsNaN { get; } + [JsonIgnore, IgnoreDataMember] public bool IsFinite { get; } + [JsonIgnore, IgnoreDataMember] public bool IsInfinity { get; } + [JsonIgnore, IgnoreDataMember] public bool IsPositiveInfinity { get; } + [JsonIgnore, IgnoreDataMember] public bool IsNegativeInfinity { get; } +} + +internal interface IMensuraUnit where U : struct, IMensuraUnit, IEquatable +{ + public U Abs(); +} \ No newline at end of file