mirror of
https://github.com/unicode-org/icu.git
synced 2025-04-08 06:53:45 +00:00
ICU-20568 Have macrosToMicroGenerator do input unit calculation.
This moves input unit calculation out of UnitConversionHandler making it simpler and clearer, and localises the "MacroProps interpretation" work in macrosToMicroGenerator, where it belongs.
This commit is contained in:
parent
5a42118a6f
commit
c84ded050a
4 changed files with 22 additions and 25 deletions
|
@ -250,7 +250,10 @@ NumberFormatterImpl::macrosToMicroGenerator(const MacroProps& macros, bool safe,
|
|||
fUsagePrefsHandler.adoptInsteadAndCheckErrorCode(usagePrefsHandler, status);
|
||||
chain = fUsagePrefsHandler.getAlias();
|
||||
} else if (isMixedUnit) {
|
||||
auto unitConversionHandler = new UnitConversionHandler(macros.unit, chain, status);
|
||||
MeasureUnitImpl temp;
|
||||
const MeasureUnitImpl &outputUnit = MeasureUnitImpl::forMeasureUnit(macros.unit, temp, status);
|
||||
auto unitConversionHandler =
|
||||
new UnitConversionHandler(outputUnit.units[0]->build(status), macros.unit, chain, status);
|
||||
fUnitConversionHandler.adoptInsteadAndCheckErrorCode(unitConversionHandler, status);
|
||||
chain = fUnitConversionHandler.getAlias();
|
||||
}
|
||||
|
|
|
@ -200,21 +200,14 @@ Precision UsagePrefsHandler::parseSkeletonToPrecision(icu::UnicodeString precisi
|
|||
return macros.precision;
|
||||
}
|
||||
|
||||
UnitConversionHandler::UnitConversionHandler(const MeasureUnit &unit, const MicroPropsGenerator *parent,
|
||||
UErrorCode &status)
|
||||
: fOutputUnit(unit), fParent(parent) {
|
||||
MeasureUnitImpl temp;
|
||||
const MeasureUnitImpl &outputUnit = MeasureUnitImpl::forMeasureUnit(unit, temp, status);
|
||||
const MeasureUnitImpl *inputUnit = &outputUnit;
|
||||
MaybeStackVector<MeasureUnitImpl> singleUnits;
|
||||
U_ASSERT(outputUnit.complexity == UMEASURE_UNIT_MIXED);
|
||||
// When we wish to support unit conversion, replace the above assert with this if:
|
||||
// if (outputUnit.complexity == UMEASURE_UNIT_MIXED) {
|
||||
{
|
||||
singleUnits = outputUnit.extractIndividualUnits(status);
|
||||
U_ASSERT(singleUnits.length() > 0);
|
||||
inputUnit = singleUnits[0];
|
||||
}
|
||||
UnitConversionHandler::UnitConversionHandler(const MeasureUnit &inputUnit, const MeasureUnit &outputUnit,
|
||||
const MicroPropsGenerator *parent, UErrorCode &status)
|
||||
: fOutputUnit(outputUnit), fParent(parent) {
|
||||
MeasureUnitImpl tempInput, tempOutput;
|
||||
const MeasureUnitImpl &inputUnitImpl = MeasureUnitImpl::forMeasureUnit(inputUnit, tempInput, status);
|
||||
const MeasureUnitImpl &outputUnitImpl =
|
||||
MeasureUnitImpl::forMeasureUnit(outputUnit, tempOutput, status);
|
||||
|
||||
// TODO: this should become an initOnce thing? Review with other
|
||||
// ConversionRates usages.
|
||||
ConversionRates conversionRates(status);
|
||||
|
@ -222,7 +215,7 @@ UnitConversionHandler::UnitConversionHandler(const MeasureUnit &unit, const Micr
|
|||
return;
|
||||
}
|
||||
fUnitConverter.adoptInsteadAndCheckErrorCode(
|
||||
new ComplexUnitsConverter(*inputUnit, outputUnit, conversionRates, status), status);
|
||||
new ComplexUnitsConverter(inputUnitImpl, outputUnitImpl, conversionRates, status), status);
|
||||
}
|
||||
|
||||
void UnitConversionHandler::processQuantity(DecimalQuantity &quantity, MicroProps µs,
|
||||
|
|
|
@ -90,22 +90,23 @@ namespace number {
|
|||
namespace impl {
|
||||
|
||||
/**
|
||||
* A MicroPropsGenerator which converts a measurement from a simple MeasureUnit
|
||||
* to a Mixed MeasureUnit.
|
||||
* A MicroPropsGenerator which converts a measurement from one MeasureUnit to
|
||||
* another. In particular, the output MeasureUnit may be a mixed unit. (The
|
||||
* input unit may not be a mixed unit.)
|
||||
*/
|
||||
class U_I18N_API UnitConversionHandler : public MicroPropsGenerator, public UMemory {
|
||||
public:
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param unit Specifies both the input and output MeasureUnit: if it is a
|
||||
* MIXED unit, the input MeasureUnit will be just the biggest unit of
|
||||
* the sequence.
|
||||
* @param inputUnit Specifies the input MeasureUnit. Mixed units are not
|
||||
* supported as input (because input is just a single decimal quantity).
|
||||
* @param outputUnit Specifies the output MeasureUnit.
|
||||
* @param parent The parent MicroPropsGenerator.
|
||||
* @param status Receives status.
|
||||
*/
|
||||
UnitConversionHandler(const MeasureUnit &unit, const MicroPropsGenerator *parent,
|
||||
UErrorCode &status);
|
||||
UnitConversionHandler(const MeasureUnit &inputUnit, const MeasureUnit &outputUnit,
|
||||
const MicroPropsGenerator *parent, UErrorCode &status);
|
||||
|
||||
/**
|
||||
* Obtains the appropriate output values from the Unit Converter.
|
||||
|
|
|
@ -447,7 +447,7 @@ class U_I18N_API MeasureUnit: public UObject {
|
|||
|
||||
#ifndef U_HIDE_DRAFT_API
|
||||
/**
|
||||
* Gets the list of SINGLE units contained within a MIXED of COMPOUND unit.
|
||||
* Gets the list of SINGLE units contained within a MIXED or COMPOUND unit.
|
||||
*
|
||||
* Examples:
|
||||
* - Given "meter-kilogram-per-second", three units will be returned: "meter",
|
||||
|
|
Loading…
Add table
Reference in a new issue