1*0e209d39SAndroid Build Coastguard Worker // © 2020 and later: Unicode, Inc. and others. 2*0e209d39SAndroid Build Coastguard Worker // License & terms of use: http://www.unicode.org/copyright.html 3*0e209d39SAndroid Build Coastguard Worker 4*0e209d39SAndroid Build Coastguard Worker #include "unicode/utypes.h" 5*0e209d39SAndroid Build Coastguard Worker 6*0e209d39SAndroid Build Coastguard Worker #if !UCONFIG_NO_FORMATTING 7*0e209d39SAndroid Build Coastguard Worker #ifndef __NUMBER_USAGEPREFS_H__ 8*0e209d39SAndroid Build Coastguard Worker #define __NUMBER_USAGEPREFS_H__ 9*0e209d39SAndroid Build Coastguard Worker 10*0e209d39SAndroid Build Coastguard Worker #include "cmemory.h" 11*0e209d39SAndroid Build Coastguard Worker #include "number_types.h" 12*0e209d39SAndroid Build Coastguard Worker #include "unicode/listformatter.h" 13*0e209d39SAndroid Build Coastguard Worker #include "unicode/localpointer.h" 14*0e209d39SAndroid Build Coastguard Worker #include "unicode/locid.h" 15*0e209d39SAndroid Build Coastguard Worker #include "unicode/measunit.h" 16*0e209d39SAndroid Build Coastguard Worker #include "unicode/stringpiece.h" 17*0e209d39SAndroid Build Coastguard Worker #include "unicode/uobject.h" 18*0e209d39SAndroid Build Coastguard Worker #include "units_converter.h" 19*0e209d39SAndroid Build Coastguard Worker #include "units_router.h" 20*0e209d39SAndroid Build Coastguard Worker 21*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN 22*0e209d39SAndroid Build Coastguard Worker 23*0e209d39SAndroid Build Coastguard Worker using ::icu::units::ComplexUnitsConverter; 24*0e209d39SAndroid Build Coastguard Worker using ::icu::units::UnitsRouter; 25*0e209d39SAndroid Build Coastguard Worker 26*0e209d39SAndroid Build Coastguard Worker namespace number::impl { 27*0e209d39SAndroid Build Coastguard Worker 28*0e209d39SAndroid Build Coastguard Worker /** 29*0e209d39SAndroid Build Coastguard Worker * A MicroPropsGenerator which uses UnitsRouter to produce output converted to a 30*0e209d39SAndroid Build Coastguard Worker * MeasureUnit appropriate for a particular localized usage: see 31*0e209d39SAndroid Build Coastguard Worker * NumberFormatterSettings::usage(). 32*0e209d39SAndroid Build Coastguard Worker */ 33*0e209d39SAndroid Build Coastguard Worker class U_I18N_API UsagePrefsHandler : public MicroPropsGenerator, public UMemory { 34*0e209d39SAndroid Build Coastguard Worker public: 35*0e209d39SAndroid Build Coastguard Worker UsagePrefsHandler(const Locale &locale, const MeasureUnit &inputUnit, const StringPiece usage, 36*0e209d39SAndroid Build Coastguard Worker const MicroPropsGenerator *parent, UErrorCode &status); 37*0e209d39SAndroid Build Coastguard Worker 38*0e209d39SAndroid Build Coastguard Worker /** 39*0e209d39SAndroid Build Coastguard Worker * Obtains the appropriate output value, MeasureUnit and 40*0e209d39SAndroid Build Coastguard Worker * rounding/precision behaviour from the UnitsRouter. 41*0e209d39SAndroid Build Coastguard Worker * 42*0e209d39SAndroid Build Coastguard Worker * The output unit is passed on to the LongNameHandler via 43*0e209d39SAndroid Build Coastguard Worker * micros.outputUnit. 44*0e209d39SAndroid Build Coastguard Worker */ 45*0e209d39SAndroid Build Coastguard Worker void processQuantity(DecimalQuantity &quantity, MicroProps µs, 46*0e209d39SAndroid Build Coastguard Worker UErrorCode &status) const override; 47*0e209d39SAndroid Build Coastguard Worker 48*0e209d39SAndroid Build Coastguard Worker /** 49*0e209d39SAndroid Build Coastguard Worker * Returns the list of possible output units, i.e. the full set of 50*0e209d39SAndroid Build Coastguard Worker * preferences, for the localized, usage-specific unit preferences. 51*0e209d39SAndroid Build Coastguard Worker * 52*0e209d39SAndroid Build Coastguard Worker * The returned pointer should be valid for the lifetime of the 53*0e209d39SAndroid Build Coastguard Worker * UsagePrefsHandler instance. 54*0e209d39SAndroid Build Coastguard Worker */ getOutputUnits()55*0e209d39SAndroid Build Coastguard Worker const MaybeStackVector<MeasureUnit> *getOutputUnits() const { 56*0e209d39SAndroid Build Coastguard Worker return fUnitsRouter.getOutputUnits(); 57*0e209d39SAndroid Build Coastguard Worker } 58*0e209d39SAndroid Build Coastguard Worker 59*0e209d39SAndroid Build Coastguard Worker private: 60*0e209d39SAndroid Build Coastguard Worker UnitsRouter fUnitsRouter; 61*0e209d39SAndroid Build Coastguard Worker const MicroPropsGenerator *fParent; 62*0e209d39SAndroid Build Coastguard Worker }; 63*0e209d39SAndroid Build Coastguard Worker 64*0e209d39SAndroid Build Coastguard Worker } // namespace number::impl 65*0e209d39SAndroid Build Coastguard Worker 66*0e209d39SAndroid Build Coastguard Worker // Export explicit template instantiations of LocalPointerBase and LocalPointer. 67*0e209d39SAndroid Build Coastguard Worker // This is required when building DLLs for Windows. (See datefmt.h, 68*0e209d39SAndroid Build Coastguard Worker // collationiterator.h, erarules.h and others for similar examples.) 69*0e209d39SAndroid Build Coastguard Worker // 70*0e209d39SAndroid Build Coastguard Worker // Note: These need to be outside of the number::impl namespace, or Clang will 71*0e209d39SAndroid Build Coastguard Worker // generate a compile error. 72*0e209d39SAndroid Build Coastguard Worker #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN 73*0e209d39SAndroid Build Coastguard Worker #if defined(_MSC_VER) 74*0e209d39SAndroid Build Coastguard Worker // Ignore warning 4661 as LocalPointerBase does not use operator== or operator!= 75*0e209d39SAndroid Build Coastguard Worker #pragma warning(push) 76*0e209d39SAndroid Build Coastguard Worker #pragma warning(disable: 4661) 77*0e209d39SAndroid Build Coastguard Worker #endif 78*0e209d39SAndroid Build Coastguard Worker template class U_I18N_API LocalPointerBase<ComplexUnitsConverter>; 79*0e209d39SAndroid Build Coastguard Worker template class U_I18N_API LocalPointer<ComplexUnitsConverter>; 80*0e209d39SAndroid Build Coastguard Worker #if defined(_MSC_VER) 81*0e209d39SAndroid Build Coastguard Worker #pragma warning(pop) 82*0e209d39SAndroid Build Coastguard Worker #endif 83*0e209d39SAndroid Build Coastguard Worker #endif 84*0e209d39SAndroid Build Coastguard Worker 85*0e209d39SAndroid Build Coastguard Worker namespace number::impl { 86*0e209d39SAndroid Build Coastguard Worker 87*0e209d39SAndroid Build Coastguard Worker /** 88*0e209d39SAndroid Build Coastguard Worker * A MicroPropsGenerator which converts a measurement from one MeasureUnit to 89*0e209d39SAndroid Build Coastguard Worker * another. In particular, the output MeasureUnit may be a mixed unit. (The 90*0e209d39SAndroid Build Coastguard Worker * input unit may not be a mixed unit.) 91*0e209d39SAndroid Build Coastguard Worker */ 92*0e209d39SAndroid Build Coastguard Worker class U_I18N_API UnitConversionHandler : public MicroPropsGenerator, public UMemory { 93*0e209d39SAndroid Build Coastguard Worker public: 94*0e209d39SAndroid Build Coastguard Worker /** 95*0e209d39SAndroid Build Coastguard Worker * Constructor. 96*0e209d39SAndroid Build Coastguard Worker * 97*0e209d39SAndroid Build Coastguard Worker * @param targetUnit Specifies the output MeasureUnit. The input MeasureUnit 98*0e209d39SAndroid Build Coastguard Worker * is derived from it: in case of a mixed unit, the biggest unit is 99*0e209d39SAndroid Build Coastguard Worker * taken as the input unit. If not a mixed unit, the input unit will be 100*0e209d39SAndroid Build Coastguard Worker * the same as the output unit and no unit conversion takes place. 101*0e209d39SAndroid Build Coastguard Worker * @param parent The parent MicroPropsGenerator. 102*0e209d39SAndroid Build Coastguard Worker * @param status Receives status. 103*0e209d39SAndroid Build Coastguard Worker */ 104*0e209d39SAndroid Build Coastguard Worker UnitConversionHandler(const MeasureUnit &targetUnit, const MicroPropsGenerator *parent, 105*0e209d39SAndroid Build Coastguard Worker UErrorCode &status); 106*0e209d39SAndroid Build Coastguard Worker 107*0e209d39SAndroid Build Coastguard Worker /** 108*0e209d39SAndroid Build Coastguard Worker * Obtains the appropriate output values from the Unit Converter. 109*0e209d39SAndroid Build Coastguard Worker */ 110*0e209d39SAndroid Build Coastguard Worker void processQuantity(DecimalQuantity &quantity, MicroProps µs, 111*0e209d39SAndroid Build Coastguard Worker UErrorCode &status) const override; 112*0e209d39SAndroid Build Coastguard Worker private: 113*0e209d39SAndroid Build Coastguard Worker MeasureUnit fOutputUnit; 114*0e209d39SAndroid Build Coastguard Worker LocalPointer<ComplexUnitsConverter> fUnitConverter; 115*0e209d39SAndroid Build Coastguard Worker const MicroPropsGenerator *fParent; 116*0e209d39SAndroid Build Coastguard Worker }; 117*0e209d39SAndroid Build Coastguard Worker 118*0e209d39SAndroid Build Coastguard Worker } // namespace number::impl 119*0e209d39SAndroid Build Coastguard Worker 120*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END 121*0e209d39SAndroid Build Coastguard Worker 122*0e209d39SAndroid Build Coastguard Worker #endif // __NUMBER_USAGEPREFS_H__ 123*0e209d39SAndroid Build Coastguard Worker #endif /* #if !UCONFIG_NO_FORMATTING */ 124