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 __UNITS_DATA_H__ 8*0e209d39SAndroid Build Coastguard Worker #define __UNITS_DATA_H__ 9*0e209d39SAndroid Build Coastguard Worker 10*0e209d39SAndroid Build Coastguard Worker #include <limits> 11*0e209d39SAndroid Build Coastguard Worker 12*0e209d39SAndroid Build Coastguard Worker #include "charstr.h" 13*0e209d39SAndroid Build Coastguard Worker #include "cmemory.h" 14*0e209d39SAndroid Build Coastguard Worker #include "unicode/stringpiece.h" 15*0e209d39SAndroid Build Coastguard Worker #include "unicode/uobject.h" 16*0e209d39SAndroid Build Coastguard Worker 17*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN 18*0e209d39SAndroid Build Coastguard Worker namespace units { 19*0e209d39SAndroid Build Coastguard Worker 20*0e209d39SAndroid Build Coastguard Worker /** 21*0e209d39SAndroid Build Coastguard Worker * Encapsulates "convertUnits" information from units resources, specifying how 22*0e209d39SAndroid Build Coastguard Worker * to convert from one unit to another. 23*0e209d39SAndroid Build Coastguard Worker * 24*0e209d39SAndroid Build Coastguard Worker * Information in this class is still in the form of strings: symbolic constants 25*0e209d39SAndroid Build Coastguard Worker * need to be interpreted. Rationale: symbols can cancel out for higher 26*0e209d39SAndroid Build Coastguard Worker * precision conversion - going from feet to inches should cancel out the 27*0e209d39SAndroid Build Coastguard Worker * `ft_to_m` constant. 28*0e209d39SAndroid Build Coastguard Worker */ 29*0e209d39SAndroid Build Coastguard Worker class U_I18N_API ConversionRateInfo : public UMemory { 30*0e209d39SAndroid Build Coastguard Worker public: ConversionRateInfo()31*0e209d39SAndroid Build Coastguard Worker ConversionRateInfo() {} ConversionRateInfo(StringPiece sourceUnit,StringPiece baseUnit,StringPiece factor,StringPiece offset,UErrorCode & status)32*0e209d39SAndroid Build Coastguard Worker ConversionRateInfo(StringPiece sourceUnit, StringPiece baseUnit, StringPiece factor, 33*0e209d39SAndroid Build Coastguard Worker StringPiece offset, UErrorCode &status) 34*0e209d39SAndroid Build Coastguard Worker : sourceUnit(), baseUnit(), factor(), offset(), specialMappingName() { 35*0e209d39SAndroid Build Coastguard Worker this->sourceUnit.append(sourceUnit, status); 36*0e209d39SAndroid Build Coastguard Worker this->baseUnit.append(baseUnit, status); 37*0e209d39SAndroid Build Coastguard Worker this->factor.append(factor, status); 38*0e209d39SAndroid Build Coastguard Worker this->offset.append(offset, status); 39*0e209d39SAndroid Build Coastguard Worker } 40*0e209d39SAndroid Build Coastguard Worker CharString sourceUnit; 41*0e209d39SAndroid Build Coastguard Worker CharString baseUnit; 42*0e209d39SAndroid Build Coastguard Worker CharString factor; 43*0e209d39SAndroid Build Coastguard Worker CharString offset; 44*0e209d39SAndroid Build Coastguard Worker CharString specialMappingName; // the name of a special mapping used instead of factor + optional offset. 45*0e209d39SAndroid Build Coastguard Worker CharString systems; 46*0e209d39SAndroid Build Coastguard Worker }; 47*0e209d39SAndroid Build Coastguard Worker 48*0e209d39SAndroid Build Coastguard Worker } // namespace units 49*0e209d39SAndroid Build Coastguard Worker 50*0e209d39SAndroid Build Coastguard Worker // Export explicit template instantiations of MaybeStackArray, MemoryPool and 51*0e209d39SAndroid Build Coastguard Worker // MaybeStackVector. This is required when building DLLs for Windows. (See 52*0e209d39SAndroid Build Coastguard Worker // datefmt.h, collationiterator.h, erarules.h and others for similar examples.) 53*0e209d39SAndroid Build Coastguard Worker // 54*0e209d39SAndroid Build Coastguard Worker // Note: These need to be outside of the units namespace, or Clang will generate 55*0e209d39SAndroid Build Coastguard Worker // a compile error. 56*0e209d39SAndroid Build Coastguard Worker #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN 57*0e209d39SAndroid Build Coastguard Worker template class U_I18N_API MaybeStackArray<units::ConversionRateInfo*, 8>; 58*0e209d39SAndroid Build Coastguard Worker template class U_I18N_API MemoryPool<units::ConversionRateInfo, 8>; 59*0e209d39SAndroid Build Coastguard Worker template class U_I18N_API MaybeStackVector<units::ConversionRateInfo, 8>; 60*0e209d39SAndroid Build Coastguard Worker #endif 61*0e209d39SAndroid Build Coastguard Worker 62*0e209d39SAndroid Build Coastguard Worker namespace units { 63*0e209d39SAndroid Build Coastguard Worker 64*0e209d39SAndroid Build Coastguard Worker /** 65*0e209d39SAndroid Build Coastguard Worker * Returns ConversionRateInfo for all supported conversions. 66*0e209d39SAndroid Build Coastguard Worker * 67*0e209d39SAndroid Build Coastguard Worker * @param result Receives the set of conversion rates. 68*0e209d39SAndroid Build Coastguard Worker * @param status Receives status. 69*0e209d39SAndroid Build Coastguard Worker */ 70*0e209d39SAndroid Build Coastguard Worker void U_I18N_API getAllConversionRates(MaybeStackVector<ConversionRateInfo> &result, UErrorCode &status); 71*0e209d39SAndroid Build Coastguard Worker 72*0e209d39SAndroid Build Coastguard Worker /** 73*0e209d39SAndroid Build Coastguard Worker * Contains all the supported conversion rates. 74*0e209d39SAndroid Build Coastguard Worker */ 75*0e209d39SAndroid Build Coastguard Worker class U_I18N_API ConversionRates { 76*0e209d39SAndroid Build Coastguard Worker public: 77*0e209d39SAndroid Build Coastguard Worker /** 78*0e209d39SAndroid Build Coastguard Worker * Constructor 79*0e209d39SAndroid Build Coastguard Worker * 80*0e209d39SAndroid Build Coastguard Worker * @param status Receives status. 81*0e209d39SAndroid Build Coastguard Worker */ ConversionRates(UErrorCode & status)82*0e209d39SAndroid Build Coastguard Worker ConversionRates(UErrorCode &status) { getAllConversionRates(conversionInfo_, status); } 83*0e209d39SAndroid Build Coastguard Worker 84*0e209d39SAndroid Build Coastguard Worker /** 85*0e209d39SAndroid Build Coastguard Worker * Returns a pointer to the conversion rate info that match the `source`. 86*0e209d39SAndroid Build Coastguard Worker * 87*0e209d39SAndroid Build Coastguard Worker * @param source Contains the source. 88*0e209d39SAndroid Build Coastguard Worker * @param status Receives status. 89*0e209d39SAndroid Build Coastguard Worker */ 90*0e209d39SAndroid Build Coastguard Worker const ConversionRateInfo *extractConversionInfo(StringPiece source, UErrorCode &status) const; 91*0e209d39SAndroid Build Coastguard Worker 92*0e209d39SAndroid Build Coastguard Worker private: 93*0e209d39SAndroid Build Coastguard Worker MaybeStackVector<ConversionRateInfo> conversionInfo_; 94*0e209d39SAndroid Build Coastguard Worker }; 95*0e209d39SAndroid Build Coastguard Worker 96*0e209d39SAndroid Build Coastguard Worker // Encapsulates unitPreferenceData information from units resources, specifying 97*0e209d39SAndroid Build Coastguard Worker // a sequence of output unit preferences. 98*0e209d39SAndroid Build Coastguard Worker struct U_I18N_API UnitPreference : public UMemory { 99*0e209d39SAndroid Build Coastguard Worker // Set geq to 1.0 by default UnitPreferenceUnitPreference100*0e209d39SAndroid Build Coastguard Worker UnitPreference() : geq(1.0) {} 101*0e209d39SAndroid Build Coastguard Worker CharString unit; 102*0e209d39SAndroid Build Coastguard Worker double geq; 103*0e209d39SAndroid Build Coastguard Worker UnicodeString skeleton; 104*0e209d39SAndroid Build Coastguard Worker UnitPreferenceUnitPreference105*0e209d39SAndroid Build Coastguard Worker UnitPreference(const UnitPreference &other) { 106*0e209d39SAndroid Build Coastguard Worker UErrorCode status = U_ZERO_ERROR; 107*0e209d39SAndroid Build Coastguard Worker this->unit.append(other.unit, status); 108*0e209d39SAndroid Build Coastguard Worker this->geq = other.geq; 109*0e209d39SAndroid Build Coastguard Worker this->skeleton = other.skeleton; 110*0e209d39SAndroid Build Coastguard Worker } 111*0e209d39SAndroid Build Coastguard Worker }; 112*0e209d39SAndroid Build Coastguard Worker 113*0e209d39SAndroid Build Coastguard Worker /** 114*0e209d39SAndroid Build Coastguard Worker * Metadata about the preferences in UnitPreferences::unitPrefs_. 115*0e209d39SAndroid Build Coastguard Worker * 116*0e209d39SAndroid Build Coastguard Worker * This class owns all of its data. 117*0e209d39SAndroid Build Coastguard Worker * 118*0e209d39SAndroid Build Coastguard Worker * UnitPreferenceMetadata lives in the anonymous namespace, because it should 119*0e209d39SAndroid Build Coastguard Worker * only be useful to internal code and unit testing code. 120*0e209d39SAndroid Build Coastguard Worker */ 121*0e209d39SAndroid Build Coastguard Worker class U_I18N_API UnitPreferenceMetadata : public UMemory { 122*0e209d39SAndroid Build Coastguard Worker public: UnitPreferenceMetadata()123*0e209d39SAndroid Build Coastguard Worker UnitPreferenceMetadata() {} 124*0e209d39SAndroid Build Coastguard Worker // Constructor, makes copies of the parameters passed to it. 125*0e209d39SAndroid Build Coastguard Worker UnitPreferenceMetadata(StringPiece category, StringPiece usage, StringPiece region, 126*0e209d39SAndroid Build Coastguard Worker int32_t prefsOffset, int32_t prefsCount, UErrorCode &status); 127*0e209d39SAndroid Build Coastguard Worker 128*0e209d39SAndroid Build Coastguard Worker // Unit category (e.g. "length", "mass", "electric-capacitance"). 129*0e209d39SAndroid Build Coastguard Worker CharString category; 130*0e209d39SAndroid Build Coastguard Worker // Usage (e.g. "road", "vehicle-fuel", "blood-glucose"). Every category 131*0e209d39SAndroid Build Coastguard Worker // should have an entry for "default" usage. TODO(hugovdm): add a test for 132*0e209d39SAndroid Build Coastguard Worker // this. 133*0e209d39SAndroid Build Coastguard Worker CharString usage; 134*0e209d39SAndroid Build Coastguard Worker // Region code (e.g. "US", "CZ", "001"). Every usage should have an entry 135*0e209d39SAndroid Build Coastguard Worker // for the "001" region ("world"). TODO(hugovdm): add a test for this. 136*0e209d39SAndroid Build Coastguard Worker CharString region; 137*0e209d39SAndroid Build Coastguard Worker // Offset into the UnitPreferences::unitPrefs_ list where the relevant 138*0e209d39SAndroid Build Coastguard Worker // preferences are found. 139*0e209d39SAndroid Build Coastguard Worker int32_t prefsOffset; 140*0e209d39SAndroid Build Coastguard Worker // The number of preferences that form this set. 141*0e209d39SAndroid Build Coastguard Worker int32_t prefsCount; 142*0e209d39SAndroid Build Coastguard Worker 143*0e209d39SAndroid Build Coastguard Worker int32_t compareTo(const UnitPreferenceMetadata &other) const; 144*0e209d39SAndroid Build Coastguard Worker int32_t compareTo(const UnitPreferenceMetadata &other, bool *foundCategory, bool *foundUsage, 145*0e209d39SAndroid Build Coastguard Worker bool *foundRegion) const; 146*0e209d39SAndroid Build Coastguard Worker }; 147*0e209d39SAndroid Build Coastguard Worker 148*0e209d39SAndroid Build Coastguard Worker } // namespace units 149*0e209d39SAndroid Build Coastguard Worker 150*0e209d39SAndroid Build Coastguard Worker // Export explicit template instantiations of MaybeStackArray, MemoryPool and 151*0e209d39SAndroid Build Coastguard Worker // MaybeStackVector. This is required when building DLLs for Windows. (See 152*0e209d39SAndroid Build Coastguard Worker // datefmt.h, collationiterator.h, erarules.h and others for similar examples.) 153*0e209d39SAndroid Build Coastguard Worker // 154*0e209d39SAndroid Build Coastguard Worker // Note: These need to be outside of the units namespace, or Clang will generate 155*0e209d39SAndroid Build Coastguard Worker // a compile error. 156*0e209d39SAndroid Build Coastguard Worker #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN 157*0e209d39SAndroid Build Coastguard Worker template class U_I18N_API MaybeStackArray<units::UnitPreferenceMetadata*, 8>; 158*0e209d39SAndroid Build Coastguard Worker template class U_I18N_API MemoryPool<units::UnitPreferenceMetadata, 8>; 159*0e209d39SAndroid Build Coastguard Worker template class U_I18N_API MaybeStackVector<units::UnitPreferenceMetadata, 8>; 160*0e209d39SAndroid Build Coastguard Worker template class U_I18N_API MaybeStackArray<units::UnitPreference*, 8>; 161*0e209d39SAndroid Build Coastguard Worker template class U_I18N_API MemoryPool<units::UnitPreference, 8>; 162*0e209d39SAndroid Build Coastguard Worker template class U_I18N_API MaybeStackVector<units::UnitPreference, 8>; 163*0e209d39SAndroid Build Coastguard Worker #endif 164*0e209d39SAndroid Build Coastguard Worker 165*0e209d39SAndroid Build Coastguard Worker namespace units { 166*0e209d39SAndroid Build Coastguard Worker 167*0e209d39SAndroid Build Coastguard Worker /** 168*0e209d39SAndroid Build Coastguard Worker * Unit Preferences information for various locales and usages. 169*0e209d39SAndroid Build Coastguard Worker */ 170*0e209d39SAndroid Build Coastguard Worker class U_I18N_API UnitPreferences { 171*0e209d39SAndroid Build Coastguard Worker public: 172*0e209d39SAndroid Build Coastguard Worker /** 173*0e209d39SAndroid Build Coastguard Worker * Constructor, loads all the preference data. 174*0e209d39SAndroid Build Coastguard Worker * 175*0e209d39SAndroid Build Coastguard Worker * @param status Receives status. 176*0e209d39SAndroid Build Coastguard Worker */ 177*0e209d39SAndroid Build Coastguard Worker UnitPreferences(UErrorCode &status); 178*0e209d39SAndroid Build Coastguard Worker 179*0e209d39SAndroid Build Coastguard Worker /** 180*0e209d39SAndroid Build Coastguard Worker * Returns the set of unit preferences in the particular category that best 181*0e209d39SAndroid Build Coastguard Worker * matches the specified usage and region. 182*0e209d39SAndroid Build Coastguard Worker * 183*0e209d39SAndroid Build Coastguard Worker * If region can't be found, falls back to global (001). If usage can't be 184*0e209d39SAndroid Build Coastguard Worker * found, falls back to "default". 185*0e209d39SAndroid Build Coastguard Worker * 186*0e209d39SAndroid Build Coastguard Worker * @param category The category within which to look up usage and region. 187*0e209d39SAndroid Build Coastguard Worker * (TODO(hugovdm): improve docs on how to find the category, once the lookup 188*0e209d39SAndroid Build Coastguard Worker * function is added.) 189*0e209d39SAndroid Build Coastguard Worker * @param usage The usage parameter. (TODO(hugovdm): improve this 190*0e209d39SAndroid Build Coastguard Worker * documentation. Add reference to some list of usages we support.) If the 191*0e209d39SAndroid Build Coastguard Worker * given usage is not found, the method automatically falls back to 192*0e209d39SAndroid Build Coastguard Worker * "default". 193*0e209d39SAndroid Build Coastguard Worker * @param region The region whose preferences are desired. If there are no 194*0e209d39SAndroid Build Coastguard Worker * specific preferences for the requested region, the method automatically 195*0e209d39SAndroid Build Coastguard Worker * falls back to region "001" ("world"). 196*0e209d39SAndroid Build Coastguard Worker * @param outPreferences A pointer into an array of preferences: essentially 197*0e209d39SAndroid Build Coastguard Worker * an array slice in combination with preferenceCount. 198*0e209d39SAndroid Build Coastguard Worker * @param preferenceCount The number of unit preferences that belong to the 199*0e209d39SAndroid Build Coastguard Worker * result set. 200*0e209d39SAndroid Build Coastguard Worker * @param status Receives status. 201*0e209d39SAndroid Build Coastguard Worker */ 202*0e209d39SAndroid Build Coastguard Worker MaybeStackVector<UnitPreference> getPreferencesFor(StringPiece category, StringPiece usage, 203*0e209d39SAndroid Build Coastguard Worker const Locale &locale, 204*0e209d39SAndroid Build Coastguard Worker 205*0e209d39SAndroid Build Coastguard Worker UErrorCode &status) const; 206*0e209d39SAndroid Build Coastguard Worker 207*0e209d39SAndroid Build Coastguard Worker protected: 208*0e209d39SAndroid Build Coastguard Worker // Metadata about the sets of preferences, this is the index for looking up 209*0e209d39SAndroid Build Coastguard Worker // preferences in the unitPrefs_ list. 210*0e209d39SAndroid Build Coastguard Worker MaybeStackVector<UnitPreferenceMetadata> metadata_; 211*0e209d39SAndroid Build Coastguard Worker // All the preferences as a flat list: which usage and region preferences 212*0e209d39SAndroid Build Coastguard Worker // are associated with is stored in `metadata_`. 213*0e209d39SAndroid Build Coastguard Worker MaybeStackVector<UnitPreference> unitPrefs_; 214*0e209d39SAndroid Build Coastguard Worker }; 215*0e209d39SAndroid Build Coastguard Worker 216*0e209d39SAndroid Build Coastguard Worker } // namespace units 217*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END 218*0e209d39SAndroid Build Coastguard Worker 219*0e209d39SAndroid Build Coastguard Worker #endif //__UNITS_DATA_H__ 220*0e209d39SAndroid Build Coastguard Worker 221*0e209d39SAndroid Build Coastguard Worker #endif /* #if !UCONFIG_NO_FORMATTING */ 222