68 lines
3.2 KiB
C#
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);
|
|
} |