71 lines
2.6 KiB
C#
71 lines
2.6 KiB
C#
|
#nullable enable // Auto-generated code requires an explicit '#nullable' directive in source.
|
||
|
#define Generate
|
||
|
|
||
|
using static System.Math;
|
||
|
using System.Text.Json;
|
||
|
using System.Text.Json.Serialization;
|
||
|
using InnovEnergy.Lib.Utils;
|
||
|
using System.CodeDom.Compiler;
|
||
|
|
||
|
namespace InnovEnergy.Lib.Units;
|
||
|
|
||
|
using T = Percent;
|
||
|
|
||
|
[GeneratedCode("generate.sh", "1")]
|
||
|
[JsonConverter(typeof(PercentConverter))]
|
||
|
public readonly partial struct Percent
|
||
|
{
|
||
|
public Decimal Value { get; }
|
||
|
public override String ToString() => Value.RoundToSignificantDigits(Units.DisplaySignificantDigits) + Unit;
|
||
|
|
||
|
// scalar multiplication
|
||
|
|
||
|
public static T operator *(Decimal scalar, T t) => new T(scalar * t.Value);
|
||
|
public static T operator *(T t, Decimal scalar) => new T(scalar * t.Value);
|
||
|
public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar);
|
||
|
|
||
|
// addition
|
||
|
|
||
|
public static T operator +(T left, T right) => new T(left.Value + right.Value);
|
||
|
public static T operator -(T left, T right) => new T(left.Value - right.Value);
|
||
|
public static T operator -(T t) => new T(-t.Value);
|
||
|
|
||
|
// compare
|
||
|
|
||
|
public static Boolean operator ==(T left, T right) => left.Value == right.Value;
|
||
|
public static Boolean operator !=(T left, T right) => left.Value != right.Value;
|
||
|
public static Boolean operator > (T left, T right) => left.Value > right.Value;
|
||
|
public static Boolean operator < (T left, T right) => left.Value < right.Value;
|
||
|
public static Boolean operator >=(T left, T right) => left.Value >= right.Value;
|
||
|
public static Boolean operator <=(T left, T right) => left.Value <= right.Value;
|
||
|
|
||
|
// conversion
|
||
|
|
||
|
public static implicit operator T(Decimal d) => new T(d);
|
||
|
public static implicit operator T(Double d) => new T((Decimal)d);
|
||
|
public static implicit operator T(Int32 i) => new T(i);
|
||
|
public static implicit operator Decimal(T t) => t.Value;
|
||
|
|
||
|
// equality
|
||
|
|
||
|
public Boolean Equals(T other) => Value == other.Value;
|
||
|
public override Boolean Equals(Object? obj) => obj is T other && Equals(other);
|
||
|
public override Int32 GetHashCode() => Value.GetHashCode();
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
internal class PercentConverter : JsonConverter<Percent>
|
||
|
{
|
||
|
public override Percent Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
||
|
{
|
||
|
return new Percent(reader.GetDecimal());
|
||
|
}
|
||
|
|
||
|
public override void Write(Utf8JsonWriter writer, Percent value, JsonSerializerOptions options)
|
||
|
{
|
||
|
var rounded = value.Value.RoundToSignificantDigits(Units.JsonSignificantDigits);
|
||
|
|
||
|
writer.WriteNumberValue(rounded);
|
||
|
}
|
||
|
}
|