Files
QWERTYkez.Mensura/QWERTYkez.Mensura/Units/Area.cs
melekhin ba77411c4a pogon...
2026-05-29 16:45:24 +07:00

78 lines
2.8 KiB
C#

namespace QWERTYkez.Mensura.Units;
/// <summary>
/// Base value is MilliMetersSquared
/// </summary>
[UnitOperatorsGenerator, DebuggerDisplay("mm2 = {_MilliMetersSquared.ToString(\"0.###\")}, m2 = {MetersSquared.ToString(\"0.###\")}")]
public readonly partial record struct Area
{
[NotMapped, JsonIgnore] public double _MilliMetersSquared { get => MilliMetersSquared; init => MilliMetersSquared = value; }
public static Area MilliMeterSquared { get; } = new() { MilliMetersSquared = 1 };
[NotMapped, JsonIgnore] public double MilliMetersSquared
{
get => _Value;
init
{
_Value = value;
}
}
public static Area CentiMeterSquared { get; } = new() { CentiMetersSquared = 1 };
[NotMapped, JsonIgnore] public double CentiMetersSquared
{
get => AreaConv.CentiMetersSquared.From(_Value);
init
{
_Value = AreaConv.CentiMetersSquared.To(value);
}
}
public static Area MeterSquared { get; } = new() { MetersSquared = 1 };
[NotMapped, JsonIgnore] public double MetersSquared
{
get => AreaConv.MetersSquared.From(_Value);
init
{
_Value = AreaConv.MetersSquared.To(value);
}
}
public static Area Hector { get; } = new() { Hectors = 1 };
[NotMapped, JsonIgnore] public double Hectors
{
get => AreaConv.Hectors.From(_Value);
init
{
_Value = AreaConv.Hectors.To(value);
}
}
public static Area KiloMeterSquared { get; } = new() { KiloMetersSquared = 1 };
[NotMapped, JsonIgnore] public double KiloMetersSquared
{
get => AreaConv.KiloMetersSquared.From(_Value);
init
{
_Value = AreaConv.KiloMetersSquared.To(value);
}
}
public Area AddMilliMetersSquared(double value) => new(_Value + value);
public Area AddCentiMetersSquared(double value) => new(_Value + AreaConv.CentiMetersSquared.To(value));
public Area AddMetersSquared(double value) => new(_Value + AreaConv.MetersSquared.To(value));
public Area AddHectors(double value) => new(_Value + AreaConv.Hectors.To(value));
public Area AddKiloMetersSquared(double value) => new(_Value + AreaConv.KiloMetersSquared.To(value));
}
internal readonly struct AreaConv
{
private AreaConv(double multiplicator) => this.Multiplicator = multiplicator;
public double To(double value) => value * Multiplicator;
public double From(double value) => value / Multiplicator;
public double Multiplicator { get; init; }
public static AreaConv MilliMetersSquared { get; } = new(1);
public static AreaConv CentiMetersSquared { get; } = new(100);
public static AreaConv MetersSquared { get; } = new(1000000);
public static AreaConv Hectors { get; } = new(10000000000);
public static AreaConv KiloMetersSquared { get; } = new(1000000000000);
}