diff --git a/CodeGen/Generators/QuantityRelationsParser.cs b/CodeGen/Generators/QuantityRelationsParser.cs index 22cf9e6711..175e84d232 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). /// "QuantityValue" 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 aa0d260a42..92d5ae8b28 100644 --- a/UnitsNet/GeneratedCode/Quantities/Area.g.cs +++ b/UnitsNet/GeneratedCode/Quantities/Area.g.cs @@ -51,8 +51,8 @@ namespace UnitsNet IMultiplyOperators, IMultiplyOperators, IMultiplyOperators, - IMultiplyOperators, IMultiplyOperators, + IMultiplyOperators, IMultiplyOperators, IMultiplyOperators, IDivisionOperators, @@ -768,18 +768,18 @@ public ReciprocalArea Inverse() return MagneticFlux.FromWebers(area.SquareMeters * magneticField.Teslas); } - /// 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/Density.g.cs b/UnitsNet/GeneratedCode/Quantities/Density.g.cs index 12bcb74776..585d700b43 100644 --- a/UnitsNet/GeneratedCode/Quantities/Density.g.cs +++ b/UnitsNet/GeneratedCode/Quantities/Density.g.cs @@ -45,10 +45,10 @@ namespace UnitsNet IMultiplyOperators, IMultiplyOperators, IMultiplyOperators, - IMultiplyOperators, IMultiplyOperators, IMultiplyOperators, IMultiplyOperators, + IMultiplyOperators, IMultiplyOperators, IComparisonOperators, IParsable, @@ -1375,12 +1375,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) { @@ -1399,6 +1393,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 16a371ea2f..275a00a924 100644 --- a/UnitsNet/GeneratedCode/Quantities/Length.g.cs +++ b/UnitsNet/GeneratedCode/Quantities/Length.g.cs @@ -39,11 +39,11 @@ namespace UnitsNet ILinearQuantity, #if NET7_0_OR_GREATER IDivisionOperators, + IMultiplyOperators, + IMultiplyOperators, IMultiplyOperators, IMultiplyOperators, IDivisionOperators, - IMultiplyOperators, - IMultiplyOperators, IDivisionOperators, IMultiplyOperators, IMultiplyOperators, @@ -1146,6 +1146,18 @@ public ReciprocalLength Inverse() return UnitConverter.Default.ConvertTo(Value, Unit, ReciprocalLength.Info); } + /// 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) { @@ -1164,18 +1176,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 c7574aa917..4e5911d991 100644 --- a/UnitsNet/GeneratedCode/Quantities/LinearDensity.g.cs +++ b/UnitsNet/GeneratedCode/Quantities/LinearDensity.g.cs @@ -42,8 +42,8 @@ namespace UnitsNet ILinearQuantity, #if NET7_0_OR_GREATER IDivisionOperators, - IDivisionOperators, IDivisionOperators, + IDivisionOperators, IDivisionOperators, IMultiplyOperators, IDivisionOperators, @@ -740,18 +740,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 2edc7888c8..e91524a168 100644 --- a/UnitsNet/GeneratedCode/Quantities/Mass.g.cs +++ b/UnitsNet/GeneratedCode/Quantities/Mass.g.cs @@ -40,8 +40,8 @@ namespace UnitsNet #if NET7_0_OR_GREATER IDivisionOperators, IDivisionOperators, - IDivisionOperators, IDivisionOperators, + IDivisionOperators, IDivisionOperators, IDivisionOperators, IMultiplyOperators, @@ -49,9 +49,9 @@ namespace UnitsNet IMultiplyOperators, IDivisionOperators, IDivisionOperators, + IDivisionOperators, IMultiplyOperators, IDivisionOperators, - IDivisionOperators, IDivisionOperators, IMultiplyOperators, IDivisionOperators, @@ -961,18 +961,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) { @@ -1015,6 +1015,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) { @@ -1027,12 +1033,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 082670e65b..c898085c07 100644 --- a/UnitsNet/GeneratedCode/Quantities/MassConcentration.g.cs +++ b/UnitsNet/GeneratedCode/Quantities/MassConcentration.g.cs @@ -44,8 +44,8 @@ namespace UnitsNet IDivisionOperators, IDivisionOperators, IMultiplyOperators, - IDivisionOperators, IDivisionOperators, + IDivisionOperators, IDivisionOperators, IComparisonOperators, IParsable, @@ -1247,18 +1247,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 4c419aa3d0..3789b145fe 100644 --- a/UnitsNet/GeneratedCode/Quantities/MassFlow.g.cs +++ b/UnitsNet/GeneratedCode/Quantities/MassFlow.g.cs @@ -42,8 +42,8 @@ namespace UnitsNet IDivisionOperators, IDivisionOperators, IDivisionOperators, - IMultiplyOperators, IDivisionOperators, + IMultiplyOperators, IDivisionOperators, IDivisionOperators, IMultiplyOperators, @@ -999,18 +999,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 244f88bb56..61d2c79e4a 100644 --- a/UnitsNet/GeneratedCode/Quantities/MolarMass.g.cs +++ b/UnitsNet/GeneratedCode/Quantities/MolarMass.g.cs @@ -39,9 +39,9 @@ namespace UnitsNet ILinearQuantity, #if NET7_0_OR_GREATER IDivisionOperators, - IMultiplyOperators, IMultiplyOperators, IMultiplyOperators, + IMultiplyOperators, IComparisonOperators, IParsable, #endif @@ -670,12 +670,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) { @@ -688,6 +682,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/TemperatureDelta.g.cs b/UnitsNet/GeneratedCode/Quantities/TemperatureDelta.g.cs index 778664bc53..d64bc8db52 100644 --- a/UnitsNet/GeneratedCode/Quantities/TemperatureDelta.g.cs +++ b/UnitsNet/GeneratedCode/Quantities/TemperatureDelta.g.cs @@ -40,8 +40,8 @@ namespace UnitsNet #if NET7_0_OR_GREATER IDivisionOperators, IDivisionOperators, - IMultiplyOperators, IMultiplyOperators, + IMultiplyOperators, IMultiplyOperators, IDivisionOperators, IDivisionOperators, @@ -606,18 +606,18 @@ public static bool TryParseUnit([NotNullWhen(true)]string? str, IFormatProvider? return Duration.FromSeconds(temperatureDelta.DegreesCelsius / temperatureChangeRate.DegreesCelsiusPerSecond); } - /// Get from * . - public static Energy operator *(TemperatureDelta temperatureDelta, Entropy entropy) - { - return Energy.FromJoules(temperatureDelta.Kelvins * entropy.JoulesPerKelvin); - } - /// Get from * . public static EnergyDensity operator *(TemperatureDelta temperatureDelta, VolumetricHeatCapacity volumetricHeatCapacity) { return EnergyDensity.FromJoulesPerCubicMeter(temperatureDelta.Kelvins * volumetricHeatCapacity.JoulesPerCubicMeterKelvin); } + /// Get from * . + public static Energy operator *(TemperatureDelta temperatureDelta, Entropy entropy) + { + return Energy.FromJoules(temperatureDelta.Kelvins * entropy.JoulesPerKelvin); + } + /// Get from * . public static HeatFlux operator *(TemperatureDelta temperatureDelta, HeatTransferCoefficient heatTransferCoefficient) { diff --git a/UnitsNet/GeneratedCode/Quantities/Volume.g.cs b/UnitsNet/GeneratedCode/Quantities/Volume.g.cs index eb80dce22d..de7a1f97de 100644 --- a/UnitsNet/GeneratedCode/Quantities/Volume.g.cs +++ b/UnitsNet/GeneratedCode/Quantities/Volume.g.cs @@ -40,9 +40,9 @@ namespace UnitsNet #if NET7_0_OR_GREATER IDivisionOperators, IMultiplyOperators, + IMultiplyOperators, IMultiplyOperators, IDivisionOperators, - IMultiplyOperators, IDivisionOperators, IMultiplyOperators, IMultiplyOperators, @@ -1329,6 +1329,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) { @@ -1341,12 +1347,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) {