xref: /aosp_15_r20/external/icu/libicu/cts_headers/units_data.h (revision 0e209d3975ff4a8c132096b14b0e9364a753506e)
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