]> granicus.if.org Git - icu/commitdiff
Drop StubUnitsRouter, modify UnitsRouter as needed.
authorHugo van der Merwe <17109322+hugovdm@users.noreply.github.com>
Fri, 26 Jun 2020 09:01:00 +0000 (11:01 +0200)
committerHugo van der Merwe <17109322+hugovdm@users.noreply.github.com>
Fri, 26 Jun 2020 09:06:50 +0000 (11:06 +0200)
icu4c/source/i18n/number_fluent.cpp
icu4c/source/i18n/number_formatimpl.cpp
icu4c/source/i18n/number_formatimpl.h
icu4c/source/i18n/number_usageprefs.h
icu4c/source/i18n/unicode/numberformatter.h
icu4c/source/i18n/unitsrouter.cpp
icu4c/source/i18n/unitsrouter.h
icu4c/source/i18n/unitsrouter_stub.h [deleted file]

index da0c50385daa1ef10472f0322cc960ebe8bda35a..fa1d6fe1022848a4a5216a56198ab69688eef2c8 100644 (file)
@@ -293,56 +293,6 @@ Derived NumberFormatterSettings<Derived>::usage(const StringPiece usage) const&
     return copy;
 }
 
-/////////////////////////////////////////////////////////
-
-// TODO(units): the StubUnitsRouter should be deleted soon, as we switch to
-// using the proper UnitsRouter - so it's just temporarily hanging out in
-// number_fluent.cpp
-StubUnitsRouter::StubUnitsRouter(MeasureUnit inputUnit, StringPiece region,
-                                 StringPiece usage, UErrorCode &status)
-    : fRegion(region, status) {
-    if (usage.compare("road") != 0) {
-        status = U_UNSUPPORTED_ERROR;
-    }
-    if (inputUnit != MeasureUnit::getMeter()) {
-        status = U_UNSUPPORTED_ERROR;
-    }
-}
-
-MaybeStackVector<Measure> StubUnitsRouter::route(double quantity, UErrorCode &status) const {
-    MeasureUnit unit;
-    MaybeStackVector<Measure> result;
-    if (uprv_strcmp(fRegion.data(), "GB") == 0) {
-        unit = MeasureUnit::getYard();
-        quantity *= 1.09361;
-    } else if (uprv_strcmp(fRegion.data(), "US") == 0) {
-        unit = MeasureUnit::getFoot();
-        quantity *= 3.28084;
-    } else {
-        unit = MeasureUnit::getMeter();
-    }
-    Formattable num(quantity);
-    result.emplaceBack(num, new MeasureUnit(unit), status);
-    return result;
-}
-
-MaybeStackVector<MeasureUnit> StubUnitsRouter::getOutputUnits() const {
-    MaybeStackVector<MeasureUnit> result;
-    if (uprv_strcmp(fRegion.data(), "GB") == 0) {
-        result.emplaceBack(MeasureUnit::getMile());
-        result.emplaceBack(MeasureUnit::getYard());
-    } else if (uprv_strcmp(fRegion.data(), "US") == 0) {
-        result.emplaceBack(MeasureUnit::getMile());
-        result.emplaceBack(MeasureUnit::getFoot());
-    } else {
-        result.emplaceBack(MeasureUnit::getKilometer());
-        result.emplaceBack(MeasureUnit::getMeter());
-    }
-    return result;
-}
-
-/////////////////////////////////////////////////////////
-
 template<typename Derived>
 Derived NumberFormatterSettings<Derived>::usage(const StringPiece usage)&& {
     Derived move(std::move(*this));
index dc8307c5afacc21bbb8cf20d75927324dff43e40..3385c3c0525735bb92a0459efa29a6d4e46ad7bf 100644 (file)
@@ -240,7 +240,7 @@ NumberFormatterImpl::macrosToMicroGenerator(const MacroProps& macros, bool safe,
         chain = fUsagePrefsHandler.getAlias();
         // TODO(units): this doesn't handle mixed units yet, caring only about
         // the first output unit:
-        resolvedUnit = *usagePrefsHandler->getOutputUnits()[0];
+        resolvedUnit = *(*usagePrefsHandler->getOutputUnits())[0];
     } else {
         resolvedUnit = macros.unit;
     }
@@ -363,7 +363,7 @@ NumberFormatterImpl::macrosToMicroGenerator(const MacroProps& macros, bool safe,
     if (isCldrUnit) {
         if (macros.usage.isSet()) {
             fLongNameMultiplexer.adoptInstead(LongNameMultiplexer::forMeasureUnits(
-                macros.locale, fUsagePrefsHandler->getOutputUnits(), unitWidth,
+                macros.locale, *fUsagePrefsHandler->getOutputUnits(), unitWidth,
                 resolvePluralRules(macros.rules, macros.locale, status), chain, status));
             chain = fLongNameMultiplexer.getAlias();
         } else {
index 2d9a1e7031037b90a0da36b5a90b1bdaa8e2a170..2f82acb638fc1444dd20f427a57b0cbac375075c 100644 (file)
@@ -16,7 +16,6 @@
 #include "number_longnames.h"
 #include "number_compact.h"
 #include "number_microprops.h"
-#include "unitsrouter_stub.h"  // WIP/TODO(hugovdm)
 
 U_NAMESPACE_BEGIN namespace number {
 namespace impl {
index 2c524dd810360930ffb95bc43cbd662d7582d898..06ee1e56a4b26062fa711ad2242df5e5254d7965 100644 (file)
@@ -7,7 +7,7 @@
 
 #include "cmemory.h"
 #include "number_types.h"
-#include "unitsrouter_stub.h"
+#include "unitsrouter.h"
 
 U_NAMESPACE_BEGIN namespace number {
 namespace impl {
@@ -33,13 +33,12 @@ class U_I18N_API UsagePrefsHandler : public MicroPropsGenerator, public UMemory
      * Returns the list of possible output units, i.e. the full set of
      * preferences, for the localized, usage-specific unit preferences.
      */
-    MaybeStackVector<MeasureUnit> getOutputUnits() const {
+    const MaybeStackVector<MeasureUnit> *getOutputUnits() const {
         return fUnitsRouter.getOutputUnits();
     }
 
   private:
-    // TODO(units): use UnitsRouter, throw away StubUnitsRouter.
-    StubUnitsRouter fUnitsRouter;
+    UnitsRouter fUnitsRouter;
     const MicroPropsGenerator *fParent;
 };
 
index 3186880d5d0f16dd7eef29eb845c2b19a5fbb2be..e6b4967a58138505f58d4efead6a559f3dd51d89 100644 (file)
@@ -770,10 +770,9 @@ class U_I18N_API Precision : public UMemory {
     // To allow access to the skeleton generation code:
     friend class impl::GeneratorHelpers;
 
-    // TODO(units): revisit when improving StubUnitsRouter. Do we still need
-    // this once Precision is returned by UnitsRouter? For now, while
-    // UnitsRouter and StubUnitsRouter don't return Precision, we allow access
-    // to Precision constructor from UsagePrefsHandler:
+    // TODO(units): revisit when UnitsRouter is changed: do we still need this
+    // once Precision is returned by UnitsRouter? For now, we allow access to
+    // Precision constructor from UsagePrefsHandler:
     friend class impl::UsagePrefsHandler;
 };
 
index 9f787ce82e6dbd723834127ea1b7c5ce9d0175f6..5d6445962f13d80dcc45f1e7daf004c4e3b1b838 100644 (file)
@@ -41,6 +41,7 @@ UnitsRouter::UnitsRouter(MeasureUnit inputUnit, StringPiece region, StringPiece
             return;
         }
 
+        outputUnits_.emplaceBackAndCheckErrorCode(status, complexTargetUnit);
         converterPreferences_.emplaceBackAndCheckErrorCode(status, inputUnit, complexTargetUnit,
                                                            preference.geq, conversionRates, status);
         if (U_FAILURE(status)) {
@@ -49,7 +50,7 @@ UnitsRouter::UnitsRouter(MeasureUnit inputUnit, StringPiece region, StringPiece
     }
 }
 
-MaybeStackVector<Measure> UnitsRouter::route(double quantity, UErrorCode &status) {
+MaybeStackVector<Measure> UnitsRouter::route(double quantity, UErrorCode &status) const {
     for (int i = 0, n = converterPreferences_.length(); i < n; i++) {
         const auto &converterPreference = *converterPreferences_[i];
 
@@ -63,6 +64,10 @@ MaybeStackVector<Measure> UnitsRouter::route(double quantity, UErrorCode &status
     return lastConverter.convert(quantity, status);
 }
 
+const MaybeStackVector<MeasureUnit> *UnitsRouter::getOutputUnits() const {
+    return &outputUnits_;
+}
+
 U_NAMESPACE_END
 
 #endif /* #if !UCONFIG_NO_FORMATTING */
index 1b29d9d8f3a3a79ebb78f3cb1123cd3b08d9143a..5f226a1e22adce43651aa83dff3f0158a3c0c3b7 100644 (file)
@@ -75,9 +75,12 @@ class U_I18N_API UnitsRouter {
   public:
     UnitsRouter(MeasureUnit inputUnit, StringPiece locale, StringPiece usage, UErrorCode &status);
 
-    MaybeStackVector<Measure> route(double quantity, UErrorCode &status);
+    MaybeStackVector<Measure> route(double quantity, UErrorCode &status) const;
+
+    const MaybeStackVector<MeasureUnit> *getOutputUnits() const;
 
   private:
+    MaybeStackVector<MeasureUnit> outputUnits_;
     MaybeStackVector<ConverterPreference> converterPreferences_;
 };
 
diff --git a/icu4c/source/i18n/unitsrouter_stub.h b/icu4c/source/i18n/unitsrouter_stub.h
deleted file mode 100644 (file)
index 0380199..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-// © 2020 and later: Unicode, Inc. and others.
-// License & terms of use: http://www.unicode.org/copyright.html
-
-// TODO(units): delete this file! Use the proper UnitsRouter instead. Since this
-// is a temporary stubbed out version, I've not given it its own .cpp file: the
-// actual code is tresspassing in number_fluent.cpp.
-
-// #include "unicode/utypes.h"
-
-#if !UCONFIG_NO_FORMATTING
-#ifndef __UNITSROUTER_H__
-#define __UNITSROUTER_H__
-
-#include <limits>
-
-#include "charstr.h" // CharString
-#include "cmemory.h"
-// #include "complexunitsconverter.h"
-#include "unicode/errorcode.h"
-#include "unicode/locid.h"
-#include "unicode/measunit.h"
-#include "unicode/measure.h"
-#include "unicode/stringpiece.h"
-#include "unitsdata.h"
-
-U_NAMESPACE_BEGIN
-
-class U_I18N_API StubUnitsRouter : public UMemory {
-  public:
-    // As found in UnitsRouter
-    StubUnitsRouter(MeasureUnit inputUnit, StringPiece region, StringPiece usage,
-                    UErrorCode &status);
-
-    // TODO(units): API under reconsideration: going via Measure may be
-    // excessive when we need a double; MaybeStackVector<Measure> might also not
-    // be what we want for dealing with Mixed, given that a MeasureUnit can, on
-    // its own, represent mixed units. (i.e. do we want to have Measure support
-    // multi-valued mixed-units?)
-    MaybeStackVector<Measure> route(double quantity, UErrorCode &status) const;
-
-    MaybeStackVector<MeasureUnit> getOutputUnits() const;
-
-  private:
-    // Stubbed out:
-    // MaybeStackVector<ConverterPreference> converterPreferences_;
-
-    // Locale fStubLocale;
-    CharString fRegion;
-};
-
-U_NAMESPACE_END
-
-#endif //__UNITSROUTER_H__
-
-#endif /* #if !UCONFIG_NO_FORMATTING */