Files
QWERTYkez.Mensura/QWERTYkez.Mensura/Units/Volume.cs
melekhin 790a5f8e10 tests
2026-06-11 15:42:01 +07:00

68 lines
3.2 KiB
C#

namespace QWERTYkez.Mensura.Units;
/// <summary>
/// Base value is MilliMetersCubic
/// </summary>
[UnitGenerator, DebuggerDisplay("mm3 = {_MilliMetersCubic.ToString(\"0.###\")}, m3 = {MetersCubic.ToString(\"0.###\")}")]
public readonly partial record struct Volume
{
public static Volume _MilliMeterCubic { get; } = new() { _MilliMetersCubic = 1 };
[NotMapped, JsonIgnore, IgnoreDataMember] public double _MilliMetersCubic { get => _Value; init => _Value = value; }
public static Volume CentiMeterCubic { get; } = new() { CentiMetersCubic = 1 };
[NotMapped, JsonIgnore, IgnoreDataMember] public double CentiMetersCubic
{
get => VolumeConv.CentiMetersCubic.From(_Value);
init
{
_Value = VolumeConv.CentiMetersCubic.To(value);
}
}
public static Volume MeterCubic { get; } = new() { MetersCubic = 1 };
[NotMapped, JsonIgnore, IgnoreDataMember] public double MetersCubic
{
get => VolumeConv.MetersCubic.From(_Value);
init
{
_Value = VolumeConv.MetersCubic.To(value);
}
}
public Volume AddMilliMetersCubic(double value) => new(_Value + value);
public Volume AddCentiMetersCubic(double value) => new(_Value + VolumeConv.CentiMetersCubic.To(value));
public Volume AddMetersCubic(double value) => new(_Value + VolumeConv.MetersCubic.To(value));
}
public static class VolumeSqrtExtension
{
// === ReadOnlySpan
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Cbrt(
this ReadOnlySpan<Volume> units, Span<Length> destination) => units.Cbrt<Volume, Length>(destination);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Cbrt(
this ReadOnlySpan<Volume?> units, Span<Length?> destination) => units.Cbrt<Volume, Length>(destination);
// === Array ===
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static Length[] Cbrt(this Volume[] units) => units.Cbrt<Volume, Length>();
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static Length?[] Cbrt(this Volume?[] units) => units.Cbrt<Volume, Length>();
// === List<T> ===
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<Length> Cbrt(this List<Volume> units) => units.Cbrt<Volume, Length>();
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<Length?> Cbrt(this List<Volume?> units) => units.Cbrt<Volume, Length>();
// === IEnumerable<T> ===
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<Length> Cbrt(this IEnumerable<Volume> units) => units.Cbrt<Volume, Length>();
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<Length?> Cbrt(this IEnumerable<Volume?> units) => units.Cbrt<Volume, Length>();
}
internal readonly struct VolumeConv
{
private VolumeConv(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 VolumeConv MilliMetersCubic { get; } = new(1);
public static VolumeConv CentiMetersCubic { get; } = new(1000);
public static VolumeConv MetersCubic { get; } = new(1000000000);
}