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));
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;
}
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 {
#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 {
#include "cmemory.h"
#include "number_types.h"
-#include "unitsrouter_stub.h"
+#include "unitsrouter.h"
U_NAMESPACE_BEGIN namespace number {
namespace impl {
* 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;
};
// 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;
};
return;
}
+ outputUnits_.emplaceBackAndCheckErrorCode(status, complexTargetUnit);
converterPreferences_.emplaceBackAndCheckErrorCode(status, inputUnit, complexTargetUnit,
preference.geq, conversionRates, status);
if (U_FAILURE(status)) {
}
}
-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];
return lastConverter.convert(quantity, status);
}
+const MaybeStackVector<MeasureUnit> *UnitsRouter::getOutputUnits() const {
+ return &outputUnits_;
+}
+
U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
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_;
};
+++ /dev/null
-// © 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 */