Files
QWERTYkez.Mensura/QWERTYkez.Mensura/Units/Mass.cs
melekhin 4ff3cc7042 26,06,05
2026-06-05 12:13:35 +07:00

58 lines
2.0 KiB
C#

namespace QWERTYkez.Mensura.Units;
/// <summary>
/// Base value is Grams
/// </summary>
[UnitGenerator, DebuggerDisplay("gr = {_Grams.ToString(\"0.###\")}, kg = {KiloGrams.ToString(\"0.###\")}")]
public readonly partial record struct Mass
{
public static Mass Gram { get; } = new() { _Grams = 1 };
[NotMapped, JsonIgnore] public double _Grams { get => _Value; init => _Value = value; }
public static Mass KiloGram { get; } = new() { KiloGrams = 1 };
[NotMapped, JsonIgnore] public double KiloGrams
{
get => MassConv.KiloGrams.From(_Value);
init
{
_Value = MassConv.KiloGrams.To(value);
}
}
public static Mass Centner { get; } = new() { Centners = 1 };
[NotMapped, JsonIgnore] public double Centners
{
get => MassConv.Centners.From(_Value);
init
{
_Value = MassConv.Centners.To(value);
}
}
public static Mass Ton { get; } = new() { Tons = 1 };
[NotMapped, JsonIgnore] public double Tons
{
get => MassConv.Tons.From(_Value);
init
{
_Value = MassConv.Tons.To(value);
}
}
public Mass AddGrams(double value) => new(_Value + value);
public Mass AddKiloGrams(double value) => new(_Value + MassConv.KiloGrams.To(value));
public Mass AddCentners(double value) => new(_Value + MassConv.Centners.To(value));
public Mass AddTons(double value) => new(_Value + MassConv.Tons.To(value));
}
internal readonly struct MassConv
{
private MassConv(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 MassConv Grams { get; } = new(1);
public static MassConv KiloGrams { get; } = new(1000);
public static MassConv Centners { get; } = new(100000);
public static MassConv Tons { get; } = new(1000000);
}