From 53924d007adf34e223dd38f38b38a7863c482c15 Mon Sep 17 00:00:00 2001 From: Tristan Milnthorp Date: Thu, 16 Mar 2023 15:44:52 -0400 Subject: [PATCH] Show example of more targeted conversion functions --- .../UnitsNetGen/QuantityGenerator.cs | 17 ++++++++++++++++- CodeGen/JsonTypes/Conversions.cs | 19 +++++++++++++++++++ CodeGen/JsonTypes/Unit.cs | 1 + Common/UnitDefinitions/Mass.json | 6 ++++++ UnitsNet/GeneratedCode/Quantities/Mass.g.cs | 2 ++ 5 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 CodeGen/JsonTypes/Conversions.cs diff --git a/CodeGen/Generators/UnitsNetGen/QuantityGenerator.cs b/CodeGen/Generators/UnitsNetGen/QuantityGenerator.cs index c597b72f08..bdafb2544e 100644 --- a/CodeGen/Generators/UnitsNetGen/QuantityGenerator.cs +++ b/CodeGen/Generators/UnitsNetGen/QuantityGenerator.cs @@ -1020,7 +1020,22 @@ private bool TryToUnit({_quantity.Name}Unit unit, [NotNullWhen(true)] out {_quan }} {_quantity.Name}? convertedOrNull = (Unit, unit) switch - {{ + {{"); + + foreach(Unit unit in _quantity.Units) + { + foreach(var conversion in unit.Conversions) + { + var func2 = conversion.Formula.Replace("{x}", "_value"); + Writer.WL($@" + ({_quantity.Name}Unit.{unit.SingularName}, {_unitEnumName}.{conversion.Target}) => new {_quantity.Name}({func2}, {_unitEnumName}.{conversion.Target}),"); + } + } + + if(_quantity.Units.Any(unit => unit.Conversions.Any())) + Writer.WL(); + + Writer.WL($@" // {_quantity.Name}Unit -> BaseUnit"); foreach (Unit unit in _quantity.Units) diff --git a/CodeGen/JsonTypes/Conversions.cs b/CodeGen/JsonTypes/Conversions.cs new file mode 100644 index 0000000000..ddaf70ad03 --- /dev/null +++ b/CodeGen/JsonTypes/Conversions.cs @@ -0,0 +1,19 @@ +// Licensed under MIT No Attribution, see LICENSE file at the root. +// Copyright 2013 Andreas Gullberg Larsen (andreas.larsen84@gmail.com). Maintained at https://github.com/angularsen/UnitsNet. + +using System; + +namespace CodeGen.JsonTypes +{ + internal class Conversions + { + // 0649 Field is never assigned to +#pragma warning disable 0649 + + public string Target = null!; + public string Formula = null!; + + // 0649 Field is never assigned to +#pragma warning restore 0649 + } +} diff --git a/CodeGen/JsonTypes/Unit.cs b/CodeGen/JsonTypes/Unit.cs index 4a775c08f9..8b6cb00803 100644 --- a/CodeGen/JsonTypes/Unit.cs +++ b/CodeGen/JsonTypes/Unit.cs @@ -11,6 +11,7 @@ internal class Unit #pragma warning disable 0649 public BaseUnits? BaseUnits; + public Conversions[] Conversions = Array.Empty(); public string FromBaseToUnitFunc = null!; public string FromUnitToBaseFunc = null!; public Localization[] Localization = Array.Empty(); diff --git a/Common/UnitDefinitions/Mass.json b/Common/UnitDefinitions/Mass.json index be44e2bb63..52f30e94b0 100644 --- a/Common/UnitDefinitions/Mass.json +++ b/Common/UnitDefinitions/Mass.json @@ -136,6 +136,12 @@ "BaseUnits": { "M": "Ounce" }, + "Conversions": [ + { + "Target": "Pound", + "Formula": "{x} / 16.0" + } + ], "FromUnitToBaseFunc": "{x} * 0.028349523125", "FromBaseToUnitFunc": "{x} / 0.028349523125", "XmlDocSummary": "The international avoirdupois ounce (abbreviated oz) is defined as exactly 28.349523125 g under the international yard and pound agreement of 1959, signed by the United States and countries of the Commonwealth of Nations. 16 oz make up an avoirdupois pound.", diff --git a/UnitsNet/GeneratedCode/Quantities/Mass.g.cs b/UnitsNet/GeneratedCode/Quantities/Mass.g.cs index 03c15d8131..bb1652ec44 100644 --- a/UnitsNet/GeneratedCode/Quantities/Mass.g.cs +++ b/UnitsNet/GeneratedCode/Quantities/Mass.g.cs @@ -1197,6 +1197,8 @@ private bool TryToUnit(MassUnit unit, [NotNullWhen(true)] out Mass? converted) Mass? convertedOrNull = (Unit, unit) switch { + (MassUnit.Ounce, MassUnit.Pound) => new Mass(_value / 16.0, MassUnit.Pound), + // MassUnit -> BaseUnit (MassUnit.Centigram, MassUnit.Kilogram) => new Mass((_value / 1e3) * 1e-2d, MassUnit.Kilogram), (MassUnit.Decagram, MassUnit.Kilogram) => new Mass((_value / 1e3) * 1e1d, MassUnit.Kilogram),