diff --git a/CodeGen/Generators/QuantityRelationsParser.cs b/CodeGen/Generators/QuantityRelationsParser.cs index b0b0c133ec..58fca4086d 100644 --- a/CodeGen/Generators/QuantityRelationsParser.cs +++ b/CodeGen/Generators/QuantityRelationsParser.cs @@ -24,7 +24,7 @@ internal static class QuantityRelationsParser /// The relations are defined in UnitRelations.json /// Each defined relation can be applied multiple times to one or two quantities depending on the operator and the operands. /// - /// The format of a relation definition is "Quantity.Unit operator Quantity.Unit = Quantity.Unit" (See examples below). + /// The format of a relation definition is "Quantity.Unit = Quantity.Unit * Quantity.Unit" (See examples below). /// "double" can be used as a unitless operand. /// "1" can be used as the result operand to define inverse relations. /// @@ -82,8 +82,8 @@ public static void ParseAndApplyRelations(string rootDir, Quantity[] quantities) relations.Sort(); var duplicates = relations - .GroupBy(r => r.SortString) - .Where(g => g.Count() > 1) + .CountBy(r => r.SortString) + .Where(g => g.Value > 1) .Select(g => g.Key) .ToList(); @@ -94,8 +94,8 @@ public static void ParseAndApplyRelations(string rootDir, Quantity[] quantities) } var ambiguous = relations - .GroupBy(r => $"{r.LeftQuantity.Name} {r.Operator} {r.RightQuantity.Name}") - .Where(g => g.Count() > 1) + .CountBy(r => r.DisambiguationString) + .Where(g => g.Value > 1) .Select(g => g.Key) .ToList(); diff --git a/CodeGen/JsonTypes/QuantityRelation.cs b/CodeGen/JsonTypes/QuantityRelation.cs index 35e97a6bc0..23ab6a0d35 100644 --- a/CodeGen/JsonTypes/QuantityRelation.cs +++ b/CodeGen/JsonTypes/QuantityRelation.cs @@ -19,17 +19,16 @@ internal record QuantityRelation : IComparable public Quantity ResultQuantity = null!; public Unit ResultUnit = null!; - public string SortString => ResultQuantity.Name + PrependDot(ResultUnit.SingularName) - + " = " - + LeftQuantity.Name + PrependDot(LeftUnit.SingularName) - + " " + Operator + " " - + RightQuantity.Name + PrependDot(RightUnit.SingularName); + public string DisambiguationString => $"{LeftQuantity.Name} {Operator} {RightQuantity.Name}"; + + public string SortString => string.Concat( + ResultQuantity.Name, ResultUnit.SingularName, + LeftQuantity.Name, LeftUnit.SingularName, Operator, + RightQuantity.Name, RightUnit.SingularName); public int CompareTo(QuantityRelation? other) { - return string.Compare(SortString, other?.SortString, StringComparison.Ordinal); + return string.Compare(SortString, other?.SortString, StringComparison.OrdinalIgnoreCase); } - - private static string PrependDot(string? s) => s == null ? string.Empty : "." + s; } -} \ No newline at end of file +} diff --git a/UnitsNet/GeneratedCode/Quantities/Area.g.cs b/UnitsNet/GeneratedCode/Quantities/Area.g.cs index 4c97cd7e43..aacc3072c2 100644 --- a/UnitsNet/GeneratedCode/Quantities/Area.g.cs +++ b/UnitsNet/GeneratedCode/Quantities/Area.g.cs @@ -48,8 +48,8 @@ namespace UnitsNet IMultiplyOperators, IMultiplyOperators, IMultiplyOperators, - IMultiplyOperators, IMultiplyOperators, + IMultiplyOperators, IMultiplyOperators, IMultiplyOperators, IDivisionOperators, @@ -764,18 +764,18 @@ public ReciprocalArea Inverse() return LuminousIntensity.FromCandela(area.SquareMeters * luminance.CandelasPerSquareMeter); } - /// Get from * . - public static Mass operator *(Area area, AreaDensity areaDensity) - { - return Mass.FromKilograms(area.SquareMeters * areaDensity.KilogramsPerSquareMeter); - } - /// Get from * . public static MassFlow operator *(Area area, MassFlux massFlux) { return MassFlow.FromKilogramsPerSecond(area.SquareMeters * massFlux.KilogramsPerSecondPerSquareMeter); } + /// Get from * . + public static Mass operator *(Area area, AreaDensity areaDensity) + { + return Mass.FromKilograms(area.SquareMeters * areaDensity.KilogramsPerSquareMeter); + } + /// Get from * . public static Power operator *(Area area, HeatFlux heatFlux) { diff --git a/UnitsNet/GeneratedCode/Quantities/BrakeSpecificFuelConsumption.g.cs b/UnitsNet/GeneratedCode/Quantities/BrakeSpecificFuelConsumption.g.cs index 0712ae2f68..2e75b80058 100644 --- a/UnitsNet/GeneratedCode/Quantities/BrakeSpecificFuelConsumption.g.cs +++ b/UnitsNet/GeneratedCode/Quantities/BrakeSpecificFuelConsumption.g.cs @@ -40,8 +40,8 @@ namespace UnitsNet ILinearQuantity, #if NET7_0_OR_GREATER IDivisionOperators, - IMultiplyOperators, IMultiplyOperators, + IMultiplyOperators, IComparisonOperators, IParsable, #endif @@ -518,6 +518,12 @@ public static bool TryParseUnit([NotNullWhen(true)]string? str, IFormatProvider? #region Relational Operators + /// Get from * . + public static double operator *(BrakeSpecificFuelConsumption brakeSpecificFuelConsumption, SpecificEnergy specificEnergy) + { + return brakeSpecificFuelConsumption.KilogramsPerJoule * specificEnergy.JoulesPerKilogram; + } + /// Get from * . public static MassFlow operator *(BrakeSpecificFuelConsumption brakeSpecificFuelConsumption, Power power) { @@ -530,12 +536,6 @@ public static bool TryParseUnit([NotNullWhen(true)]string? str, IFormatProvider? return SpecificEnergy.FromJoulesPerKilogram(value / brakeSpecificFuelConsumption.KilogramsPerJoule); } - /// Get from * . - public static double operator *(BrakeSpecificFuelConsumption brakeSpecificFuelConsumption, SpecificEnergy specificEnergy) - { - return brakeSpecificFuelConsumption.KilogramsPerJoule * specificEnergy.JoulesPerKilogram; - } - #endregion #region Equality / IComparable diff --git a/UnitsNet/GeneratedCode/Quantities/Density.g.cs b/UnitsNet/GeneratedCode/Quantities/Density.g.cs index 9c91a1f337..7fa74ccf2d 100644 --- a/UnitsNet/GeneratedCode/Quantities/Density.g.cs +++ b/UnitsNet/GeneratedCode/Quantities/Density.g.cs @@ -46,10 +46,10 @@ namespace UnitsNet IMultiplyOperators, IMultiplyOperators, IMultiplyOperators, - IMultiplyOperators, IMultiplyOperators, IMultiplyOperators, IMultiplyOperators, + IMultiplyOperators, IMultiplyOperators, IComparisonOperators, IParsable, @@ -1400,12 +1400,6 @@ public SpecificVolume Inverse() return LinearDensity.FromKilogramsPerMeter(density.KilogramsPerCubicMeter * area.SquareMeters); } - /// Get from * . - public static Mass operator *(Density density, Volume volume) - { - return Mass.FromKilograms(density.KilogramsPerCubicMeter * volume.CubicMeters); - } - /// Get from * . public static MassConcentration operator *(Density density, VolumeConcentration volumeConcentration) { @@ -1424,6 +1418,12 @@ public SpecificVolume Inverse() return MassFlux.FromKilogramsPerSecondPerSquareMeter(density.KilogramsPerCubicMeter * speed.MetersPerSecond); } + /// Get from * . + public static Mass operator *(Density density, Volume volume) + { + return Mass.FromKilograms(density.KilogramsPerCubicMeter * volume.CubicMeters); + } + /// Get from * . public static SpecificWeight operator *(Density density, Acceleration acceleration) { diff --git a/UnitsNet/GeneratedCode/Quantities/Length.g.cs b/UnitsNet/GeneratedCode/Quantities/Length.g.cs index 414fe3f789..bdef2010dc 100644 --- a/UnitsNet/GeneratedCode/Quantities/Length.g.cs +++ b/UnitsNet/GeneratedCode/Quantities/Length.g.cs @@ -40,11 +40,11 @@ namespace UnitsNet ILinearQuantity, #if NET7_0_OR_GREATER IDivisionOperators, + IMultiplyOperators, + IMultiplyOperators, IMultiplyOperators, IMultiplyOperators, IDivisionOperators, - IMultiplyOperators, - IMultiplyOperators, IDivisionOperators, IMultiplyOperators, IMultiplyOperators, @@ -1168,6 +1168,18 @@ public ReciprocalLength Inverse() return ReciprocalLength.FromInverseMeters(1 / Meters); } + /// Get from * . + public static AreaDensity operator *(Length length, Density density) + { + return AreaDensity.FromKilogramsPerSquareMeter(length.Meters * density.KilogramsPerCubicMeter); + } + + /// Get from * . + public static AreaMomentOfInertia operator *(Length length, Volume volume) + { + return AreaMomentOfInertia.FromMetersToTheFourth(length.Meters * volume.CubicMeters); + } + /// Get from * . public static Area operator *(Length length, AreaPerLength areaPerLength) { @@ -1186,18 +1198,6 @@ public ReciprocalLength Inverse() return Area.FromSquareMeters(length.Meters / reciprocalLength.InverseMeters); } - /// Get from * . - public static AreaDensity operator *(Length length, Density density) - { - return AreaDensity.FromKilogramsPerSquareMeter(length.Meters * density.KilogramsPerCubicMeter); - } - - /// Get from * . - public static AreaMomentOfInertia operator *(Length length, Volume volume) - { - return AreaMomentOfInertia.FromMetersToTheFourth(length.Meters * volume.CubicMeters); - } - /// Get from / . public static Duration operator /(Length length, Speed speed) { diff --git a/UnitsNet/GeneratedCode/Quantities/LinearDensity.g.cs b/UnitsNet/GeneratedCode/Quantities/LinearDensity.g.cs index 3fc8d62ed5..3e764434c9 100644 --- a/UnitsNet/GeneratedCode/Quantities/LinearDensity.g.cs +++ b/UnitsNet/GeneratedCode/Quantities/LinearDensity.g.cs @@ -43,8 +43,8 @@ namespace UnitsNet ILinearQuantity, #if NET7_0_OR_GREATER IDivisionOperators, - IDivisionOperators, IDivisionOperators, + IDivisionOperators, IDivisionOperators, IMultiplyOperators, IDivisionOperators, @@ -765,18 +765,18 @@ public static bool TryParseUnit([NotNullWhen(true)]string? str, IFormatProvider? #region Relational Operators - /// Get from / . - public static Area operator /(LinearDensity linearDensity, Density density) - { - return Area.FromSquareMeters(linearDensity.KilogramsPerMeter / density.KilogramsPerCubicMeter); - } - /// Get from / . public static AreaDensity operator /(LinearDensity linearDensity, Length length) { return AreaDensity.FromKilogramsPerSquareMeter(linearDensity.KilogramsPerMeter / length.Meters); } + /// Get from / . + public static Area operator /(LinearDensity linearDensity, Density density) + { + return Area.FromSquareMeters(linearDensity.KilogramsPerMeter / density.KilogramsPerCubicMeter); + } + /// Get from / . public static Density operator /(LinearDensity linearDensity, Area area) { diff --git a/UnitsNet/GeneratedCode/Quantities/Mass.g.cs b/UnitsNet/GeneratedCode/Quantities/Mass.g.cs index c6596c311d..311ef73311 100644 --- a/UnitsNet/GeneratedCode/Quantities/Mass.g.cs +++ b/UnitsNet/GeneratedCode/Quantities/Mass.g.cs @@ -41,8 +41,8 @@ namespace UnitsNet #if NET7_0_OR_GREATER IDivisionOperators, IDivisionOperators, - IDivisionOperators, IDivisionOperators, + IDivisionOperators, IDivisionOperators, IDivisionOperators, IMultiplyOperators, @@ -50,9 +50,9 @@ namespace UnitsNet IMultiplyOperators, IDivisionOperators, IDivisionOperators, + IDivisionOperators, IMultiplyOperators, IDivisionOperators, - IDivisionOperators, IDivisionOperators, IMultiplyOperators, IDivisionOperators, @@ -986,18 +986,18 @@ public static bool TryParseUnit([NotNullWhen(true)]string? str, IFormatProvider? return AmountOfSubstance.FromMoles(mass.Kilograms / molarMass.KilogramsPerMole); } - /// Get from / . - public static Area operator /(Mass mass, AreaDensity areaDensity) - { - return Area.FromSquareMeters(mass.Kilograms / areaDensity.KilogramsPerSquareMeter); - } - /// Get from / . public static AreaDensity operator /(Mass mass, Area area) { return AreaDensity.FromKilogramsPerSquareMeter(mass.Kilograms / area.SquareMeters); } + /// Get from / . + public static Area operator /(Mass mass, AreaDensity areaDensity) + { + return Area.FromSquareMeters(mass.Kilograms / areaDensity.KilogramsPerSquareMeter); + } + /// Get from / . public static Density operator /(Mass mass, Volume volume) { @@ -1040,6 +1040,12 @@ public static bool TryParseUnit([NotNullWhen(true)]string? str, IFormatProvider? return LinearDensity.FromKilogramsPerMeter(mass.Kilograms / length.Meters); } + /// Get from / . + public static MassFlow operator /(Mass mass, Duration duration) + { + return MassFlow.FromKilogramsPerSecond(mass.Kilograms / duration.Seconds); + } + /// Get from * . public static Mass operator *(Mass mass, MassFraction massFraction) { @@ -1052,12 +1058,6 @@ public static bool TryParseUnit([NotNullWhen(true)]string? str, IFormatProvider? return Mass.FromKilograms(mass.Kilograms / massFraction.DecimalFractions); } - /// Get from / . - public static MassFlow operator /(Mass mass, Duration duration) - { - return MassFlow.FromKilogramsPerSecond(mass.Kilograms / duration.Seconds); - } - /// Get from / . public static MolarMass operator /(Mass mass, AmountOfSubstance amountOfSubstance) { diff --git a/UnitsNet/GeneratedCode/Quantities/MassConcentration.g.cs b/UnitsNet/GeneratedCode/Quantities/MassConcentration.g.cs index 0d57d2b4c7..3c57dd7316 100644 --- a/UnitsNet/GeneratedCode/Quantities/MassConcentration.g.cs +++ b/UnitsNet/GeneratedCode/Quantities/MassConcentration.g.cs @@ -45,8 +45,8 @@ namespace UnitsNet IDivisionOperators, IDivisionOperators, IMultiplyOperators, - IDivisionOperators, IDivisionOperators, + IDivisionOperators, IDivisionOperators, IComparisonOperators, IParsable, @@ -1272,18 +1272,18 @@ public static bool TryParseUnit([NotNullWhen(true)]string? str, IFormatProvider? return Mass.FromKilograms(massConcentration.KilogramsPerCubicMeter * volume.CubicMeters); } - /// Get from / . - public static MolarMass operator /(MassConcentration massConcentration, Molarity molarity) - { - return MolarMass.FromKilogramsPerMole(massConcentration.KilogramsPerCubicMeter / molarity.MolesPerCubicMeter); - } - /// Get from / . public static Molarity operator /(MassConcentration massConcentration, MolarMass molarMass) { return Molarity.FromMolesPerCubicMeter(massConcentration.KilogramsPerCubicMeter / molarMass.KilogramsPerMole); } + /// Get from / . + public static MolarMass operator /(MassConcentration massConcentration, Molarity molarity) + { + return MolarMass.FromKilogramsPerMole(massConcentration.KilogramsPerCubicMeter / molarity.MolesPerCubicMeter); + } + /// Get from / . public static VolumeConcentration operator /(MassConcentration massConcentration, Density density) { diff --git a/UnitsNet/GeneratedCode/Quantities/MassFlow.g.cs b/UnitsNet/GeneratedCode/Quantities/MassFlow.g.cs index fd5fc83419..935c4021ff 100644 --- a/UnitsNet/GeneratedCode/Quantities/MassFlow.g.cs +++ b/UnitsNet/GeneratedCode/Quantities/MassFlow.g.cs @@ -43,8 +43,8 @@ namespace UnitsNet IDivisionOperators, IDivisionOperators, IDivisionOperators, - IMultiplyOperators, IDivisionOperators, + IMultiplyOperators, IDivisionOperators, IDivisionOperators, IMultiplyOperators, @@ -1024,18 +1024,18 @@ public static bool TryParseUnit([NotNullWhen(true)]string? str, IFormatProvider? return Density.FromKilogramsPerCubicMeter(massFlow.KilogramsPerSecond / volumeFlow.CubicMetersPerSecond); } - /// Get from * . - public static Mass operator *(MassFlow massFlow, Duration duration) - { - return Mass.FromKilograms(massFlow.KilogramsPerSecond * duration.Seconds); - } - /// Get from / . public static MassFlux operator /(MassFlow massFlow, Area area) { return MassFlux.FromKilogramsPerSecondPerSquareMeter(massFlow.KilogramsPerSecond / area.SquareMeters); } + /// Get from * . + public static Mass operator *(MassFlow massFlow, Duration duration) + { + return Mass.FromKilograms(massFlow.KilogramsPerSecond * duration.Seconds); + } + /// Get from / . public static MolarFlow operator /(MassFlow massFlow, MolarMass molarMass) { diff --git a/UnitsNet/GeneratedCode/Quantities/MolarMass.g.cs b/UnitsNet/GeneratedCode/Quantities/MolarMass.g.cs index 8427543dba..8eba1030f9 100644 --- a/UnitsNet/GeneratedCode/Quantities/MolarMass.g.cs +++ b/UnitsNet/GeneratedCode/Quantities/MolarMass.g.cs @@ -40,9 +40,9 @@ namespace UnitsNet ILinearQuantity, #if NET7_0_OR_GREATER IDivisionOperators, - IMultiplyOperators, IMultiplyOperators, IMultiplyOperators, + IMultiplyOperators, IComparisonOperators, IParsable, #endif @@ -679,12 +679,6 @@ public static bool TryParseUnit([NotNullWhen(true)]string? str, IFormatProvider? #region Relational Operators - /// Get from * . - public static Mass operator *(MolarMass molarMass, AmountOfSubstance amountOfSubstance) - { - return Mass.FromKilograms(molarMass.KilogramsPerMole * amountOfSubstance.Moles); - } - /// Get from * . public static MassConcentration operator *(MolarMass molarMass, Molarity molarity) { @@ -697,6 +691,12 @@ public static bool TryParseUnit([NotNullWhen(true)]string? str, IFormatProvider? return MassFlow.FromKilogramsPerSecond(molarMass.KilogramsPerKilomole * molarFlow.KilomolesPerSecond); } + /// Get from * . + public static Mass operator *(MolarMass molarMass, AmountOfSubstance amountOfSubstance) + { + return Mass.FromKilograms(molarMass.KilogramsPerMole * amountOfSubstance.Moles); + } + #endregion #region Equality / IComparable diff --git a/UnitsNet/GeneratedCode/Quantities/SpecificEnergy.g.cs b/UnitsNet/GeneratedCode/Quantities/SpecificEnergy.g.cs index a8348b11bc..97ab24df78 100644 --- a/UnitsNet/GeneratedCode/Quantities/SpecificEnergy.g.cs +++ b/UnitsNet/GeneratedCode/Quantities/SpecificEnergy.g.cs @@ -43,12 +43,12 @@ namespace UnitsNet ILinearQuantity, #if NET7_0_OR_GREATER IDivisionOperators, + IMultiplyOperators, IMultiplyOperators, IMultiplyOperators, IDivisionOperators, IDivisionOperators, IDivisionOperators, - IMultiplyOperators, IComparisonOperators, IParsable, #endif @@ -963,6 +963,12 @@ public static bool TryParseUnit([NotNullWhen(true)]string? str, IFormatProvider? return BrakeSpecificFuelConsumption.FromKilogramsPerJoule(value / specificEnergy.JoulesPerKilogram); } + /// Get from * . + public static double operator *(SpecificEnergy specificEnergy, BrakeSpecificFuelConsumption brakeSpecificFuelConsumption) + { + return specificEnergy.JoulesPerKilogram * brakeSpecificFuelConsumption.KilogramsPerJoule; + } + /// Get from * . public static Energy operator *(SpecificEnergy specificEnergy, Mass mass) { @@ -993,12 +999,6 @@ public static bool TryParseUnit([NotNullWhen(true)]string? str, IFormatProvider? return TemperatureDelta.FromKelvins(specificEnergy.JoulesPerKilogram / specificEntropy.JoulesPerKilogramKelvin); } - /// Get from * . - public static double operator *(SpecificEnergy specificEnergy, BrakeSpecificFuelConsumption brakeSpecificFuelConsumption) - { - return specificEnergy.JoulesPerKilogram * brakeSpecificFuelConsumption.KilogramsPerJoule; - } - #endregion #region Equality / IComparable diff --git a/UnitsNet/GeneratedCode/Quantities/Volume.g.cs b/UnitsNet/GeneratedCode/Quantities/Volume.g.cs index 61ce6a93b4..0a95b29eae 100644 --- a/UnitsNet/GeneratedCode/Quantities/Volume.g.cs +++ b/UnitsNet/GeneratedCode/Quantities/Volume.g.cs @@ -41,9 +41,9 @@ namespace UnitsNet #if NET7_0_OR_GREATER IDivisionOperators, IMultiplyOperators, + IMultiplyOperators, IMultiplyOperators, IDivisionOperators, - IMultiplyOperators, IDivisionOperators, IMultiplyOperators, IMultiplyOperators, @@ -1368,6 +1368,12 @@ public static bool TryParseUnit([NotNullWhen(true)]string? str, IFormatProvider? return AmountOfSubstance.FromMoles(volume.CubicMeters * molarity.MolesPerCubicMeter); } + /// Get from * . + public static AreaMomentOfInertia operator *(Volume volume, Length length) + { + return AreaMomentOfInertia.FromMetersToTheFourth(volume.CubicMeters * length.Meters); + } + /// Get from * . public static Area operator *(Volume volume, ReciprocalLength reciprocalLength) { @@ -1380,12 +1386,6 @@ public static bool TryParseUnit([NotNullWhen(true)]string? str, IFormatProvider? return Area.FromSquareMeters(volume.CubicMeters / length.Meters); } - /// Get from * . - public static AreaMomentOfInertia operator *(Volume volume, Length length) - { - return AreaMomentOfInertia.FromMetersToTheFourth(volume.CubicMeters * length.Meters); - } - /// Get from / . public static Duration operator /(Volume volume, VolumeFlow volumeFlow) {