From: Younies Mahmoud Date: Tue, 14 Apr 2020 13:52:51 +0000 (+0200) Subject: fix compound basic unit X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7530062336a111e7c6c21fd9bd99630e1edbe180;p=icu fix compound basic unit --- diff --git a/icu4c/source/i18n/unitconverter.cpp b/icu4c/source/i18n/unitconverter.cpp index 9fef63848f2..5d8c82048a6 100644 --- a/icu4c/source/i18n/unitconverter.cpp +++ b/icu4c/source/i18n/unitconverter.cpp @@ -30,11 +30,12 @@ extractConversionInfo(StringPiece source, } /** - * Extracts the compound base unit of a compound unit (`source`). For example, if the source unit is `square-mile-per-hour`, the compound base unit will be `square-meter-per-second` + * Extracts the compound base unit of a compound unit (`source`). For example, if the source unit is + * `square-mile-per-hour`, the compound base unit will be `square-meter-per-second` */ MeasureUnit extractCompoundBaseUnit(const MeasureUnit &source, - const MaybeStackVector &conversionRateInfoList, - UErrorCode &status) { + const MaybeStackVector &conversionRateInfoList, + UErrorCode &status) { MeasureUnit result; int32_t count; const auto singleUnits = source.splitToSingleUnits(count, status); @@ -55,11 +56,15 @@ MeasureUnit extractCompoundBaseUnit(const MeasureUnit &source, // Multiply the power of the singleUnit by the power of the baseUnit. For example, square-hectare // must be p4-meter. (NOTE: hectare --> square-meter) - auto baseUnit = MeasureUnit::forIdentifier(rateInfo->baseUnit.toStringPiece(), status); - auto singleBaseUnit = SingleUnitImpl::forMeasureUnit(baseUnit, status); - singleBaseUnit.dimensionality *= singleUnit.getDimensionality(status); - - result = result.product(singleBaseUnit.build(status), status); + auto compoundBaseUnit = MeasureUnit::forIdentifier(rateInfo->baseUnit.toStringPiece(), status); + int32_t baseUnitsCounts; + const auto singleBaseUnits = compoundBaseUnit.splitToSingleUnits(baseUnitsCounts, status); + for (int j = 0; j < baseUnitsCounts; j++) { + auto singleBaseUnit = SingleUnitImpl::forMeasureUnit(singleBaseUnits[j], status); + singleBaseUnit.dimensionality *= singleUnit.getDimensionality(status); + + result = result.product(singleBaseUnit.build(status), status); + } } return result; @@ -67,9 +72,9 @@ MeasureUnit extractCompoundBaseUnit(const MeasureUnit &source, } // namespace -UnitsConvertibilityState U_I18N_API -checkConvertibility(const MeasureUnit &source, const MeasureUnit &target, - const MaybeStackVector &conversionRateInfoList, UErrorCode &status) { +UnitsConvertibilityState U_I18N_API checkConvertibility( + const MeasureUnit &source, const MeasureUnit &target, + const MaybeStackVector &conversionRateInfoList, UErrorCode &status) { auto sourceBaseUnit = extractCompoundBaseUnit(source, conversionRateInfoList, status); auto targetBaseUnit = extractCompoundBaseUnit(target, conversionRateInfoList, status); diff --git a/icu4c/source/test/depstest/dependencies.txt b/icu4c/source/test/depstest/dependencies.txt index 022b144d39f..e39ab5f8b4e 100644 --- a/icu4c/source/test/depstest/dependencies.txt +++ b/icu4c/source/test/depstest/dependencies.txt @@ -1063,7 +1063,7 @@ group: sharedbreakiterator breakiterator group: units_extra - measunit_extra.o + measunit_extra.o unitsdata.o unitconverter.o deps units ucharstriebuilder ucharstrie uclean_i18n diff --git a/icu4c/source/test/intltest/unitstest.cpp b/icu4c/source/test/intltest/unitstest.cpp index 990a4e662dc..1175a405390 100644 --- a/icu4c/source/test/intltest/unitstest.cpp +++ b/icu4c/source/test/intltest/unitstest.cpp @@ -75,7 +75,6 @@ void UnitsTest::testConversionCapability() { {"kilometer-per-second", "foot-per-second", CONVERTIBLE}, // {"square-hectare", "p4-foot", CONVERTIBLE}, // {"square-kilometer-per-second", "second-per-square-meter", RECIPROCAL}, // - // BEGIN: a copy of tests from unitsTest.txt {"g-force", "meter-per-square-second", CONVERTIBLE}, // {"ohm", "kilogram-square-meter-square-ampere-per-cubic-second", CONVERTIBLE}, // {"electronvolt", "kilogram-square-meter-per-square-second", CONVERTIBLE}, // @@ -116,7 +115,6 @@ void UnitsTest::testConversionCapability() { {"ofhg", "kilogram-square-second-per-square-meter", CONVERTIBLE}, // {"knot", "meter-per-second", CONVERTIBLE}, // {"volt", "kilogram-square-meter-ampere-per-cubic-second", CONVERTIBLE}, // - // END: a copy of tests from unitsTest.txt }; for (const auto &testCase : testCases) {