]> granicus.if.org Git - icu/commitdiff
Fixes to make complexunitsconverter and unitconverter compile again.
authorHugo van der Merwe <17109322+hugovdm@users.noreply.github.com>
Wed, 25 Mar 2020 10:35:08 +0000 (11:35 +0100)
committerHugo van der Merwe <17109322+hugovdm@users.noreply.github.com>
Wed, 25 Mar 2020 10:36:10 +0000 (11:36 +0100)
icu4c/source/i18n/complexunitsconverter.cpp
icu4c/source/i18n/unitconverter.cpp
icu4c/source/i18n/unitconverter.h

index 5a0a0879e7438e6878aa300f3869874fa343897c..e9dae22388db6d06735eefc1adc2b9675a309c68 100644 (file)
@@ -18,9 +18,10 @@ U_NAMESPACE_BEGIN
 ComplexUnitsConverter::ComplexUnitsConverter(const MeasureUnit inputUnit, const MeasureUnit outputUnits,
                                              const MaybeStackVector<ConversionRateInfo> &ratesInfo,
                                              UErrorCode &status) {
-    auto singleUnits = outputUnits.splitToSingleUnits(status);
+    int32_t length;
+    auto singleUnits = outputUnits.splitToSingleUnits(length, status);
     MaybeStackVector<MeasureUnit> singleUnitsInOrder;
-    for (int i = 0, n = singleUnits.length(); i < n; ++i) {
+    for (int i = 0; i < length; ++i) {
         // TODO(younies): ensure units being in order in phase 2. Now, the units in order by default.
         singleUnitsInOrder.emplaceBack(singleUnits[i]);
     }
@@ -59,7 +60,7 @@ UBool ComplexUnitsConverter::greaterThanOrEqual(double quantity, double limit) c
     U_ASSERT(unitConverters_.length() > 0);
 
     // first quantity is the biggest one.
-    double newQuantity = (*unitConverters_[0]).convert(quantity);
+    double newQuantity = unitConverters_[0]->convert(quantity);
 
     return newQuantity >= limit;
 }
@@ -72,12 +73,18 @@ MaybeStackVector<Measure> ComplexUnitsConverter::convert(double quantity, UError
         if (i < n - 1) { // not last element
             int64_t newQuantity = quantity;
             Formattable formattableNewQuantity(newQuantity);
-            result.emplaceBack(Measure(formattableNewQuantity, units_[i], status));
+            // Measure wants to own its MeasureUnit. For now, this copies it.
+            // TODO(younies): consider whether ownership transfer would be
+            // reasonable? (If not, just delete this comment?)
+            result.emplaceBack(formattableNewQuantity, new MeasureUnit(*units_[i]), status);
 
             quantity -= newQuantity;
         } else { // Last element
             Formattable formattableQuantity(quantity);
-            result.emplaceBack(Measure(formattableQuantity, units_[i], status));
+            // Measure wants to own its MeasureUnit. For now, this copies it.
+            //  TODO(younies): consider whether ownership transfer would be
+            //  reasonable? (If not, just delete this comment?)
+           result.emplaceBack(formattableQuantity, new MeasureUnit(*units_[i]), status);
         }
     }
 
index 32761f4af35644f571bfe5c80632b3fb1e02cd23..7366613ab65eb036a0c25f90c6da5f6b8e385356 100644 (file)
@@ -427,27 +427,26 @@ StringPiece getTarget(StringPiece source, const MaybeStackVector<ConversionRateI
 MeasureUnit extractTarget(MeasureUnit source, const MaybeStackVector<ConversionRateInfo> &ratesInfo,
                           UErrorCode &status) {
     MeasureUnit result; // Empty unit.
-    auto singleUnits = source.splitToSingleUnits(status);
+    int32_t singleUnitsLength;
+    auto singleUnits = source.splitToSingleUnits(singleUnitsLength, status);
 
-    for (int i = 0; i < singleUnits.length(); i++) {
+    for (int i = 0; i < singleUnitsLength; i++) {
         const auto &singleUnit = singleUnits[i];
         StringPiece target = getTarget(singleUnit.getIdentifier(), ratesInfo, status);
 
         if (U_FAILURE(status)) return result;
 
         MeasureUnit targetUnit = MeasureUnit::forIdentifier(target, status);
-        auto targetSingleUnits = targetUnit.splitToSingleUnits(status);
+        int32_t targetSingleUnitsLength;
+        auto targetSingleUnits = targetUnit.splitToSingleUnits(targetSingleUnitsLength, status);
         if (U_FAILURE(status)) return result;
 
-        for (int i = 0, n = targetSingleUnits.length(); i < n; ++i) {
-            auto tempTargetUnit = TempSingleUnit::forMeasureUnit(targetSingleUnits[i], status);
-            tempTargetUnit.dimensionality = singleUnit.getDimensionality(status);
+        for (int i = 0; i < targetSingleUnitsLength; ++i) {
+            auto targetUnit =
+                targetSingleUnits[i].withDimensionality(singleUnit.getDimensionality(status), status);
             if (U_FAILURE(status)) return result;
 
-            auto targetUnits = tempTargetUnit.build(status);
-            if (U_FAILURE(status)) return result;
-
-            result = result.product(targetUnits, status);
+            result = result.product(targetUnit, status);
             if (U_FAILURE(status)) return result;
         }
     }
@@ -484,7 +483,7 @@ UnitConverter::UnitConverter(MeasureUnit source, MeasureUnit target,
                        ratesInfo, status);
 }
 
-double UnitConverter::convert(double inputValue) {
+double UnitConverter::convert(double inputValue) const {
     double result =
         inputValue + conversionRate_.sourceOffset; // Reset the input to the target zero index.
     // Convert the quantity to from the source scale to the target scale.
index 9549f5ee383af14fbea6343172706e5d4383be54..0963b1ec9d616bc141e9dccd8aa18f73a53bc986 100644 (file)
@@ -55,7 +55,7 @@ class U_I18N_API UnitConverter {
      * @param output_value the value that holds the result of the conversion.
      * @param status
      */
-    double convert(double inputValue);
+    double convert(double inputValue) const;
 
   private:
     ConversionRate conversionRate_;