/src/mozilla-central/intl/icu/source/i18n/number_compact.h
Line | Count | Source (jump to first uncovered line) |
1 | | // © 2017 and later: Unicode, Inc. and others. |
2 | | // License & terms of use: http://www.unicode.org/copyright.html |
3 | | |
4 | | #include "unicode/utypes.h" |
5 | | |
6 | | #if !UCONFIG_NO_FORMATTING |
7 | | #ifndef __NUMBER_COMPACT_H__ |
8 | | #define __NUMBER_COMPACT_H__ |
9 | | |
10 | | #include "standardplural.h" |
11 | | #include "number_types.h" |
12 | | #include "unicode/unum.h" |
13 | | #include "uvector.h" |
14 | | #include "resource.h" |
15 | | #include "number_patternmodifier.h" |
16 | | |
17 | | U_NAMESPACE_BEGIN namespace number { |
18 | | namespace impl { |
19 | | |
20 | | static const int32_t COMPACT_MAX_DIGITS = 15; |
21 | | |
22 | | class CompactData : public MultiplierProducer { |
23 | | public: |
24 | | CompactData(); |
25 | | |
26 | | void populate(const Locale &locale, const char *nsName, CompactStyle compactStyle, |
27 | | CompactType compactType, UErrorCode &status); |
28 | | |
29 | | int32_t getMultiplier(int32_t magnitude) const U_OVERRIDE; |
30 | | |
31 | | const UChar *getPattern(int32_t magnitude, StandardPlural::Form plural) const; |
32 | | |
33 | | void getUniquePatterns(UVector &output, UErrorCode &status) const; |
34 | | |
35 | | private: |
36 | | const UChar *patterns[(COMPACT_MAX_DIGITS + 1) * StandardPlural::COUNT]; |
37 | | int8_t multipliers[COMPACT_MAX_DIGITS + 1]; |
38 | | int8_t largestMagnitude; |
39 | | UBool isEmpty; |
40 | | |
41 | | class CompactDataSink : public ResourceSink { |
42 | | public: |
43 | 0 | explicit CompactDataSink(CompactData &data) : data(data) {} |
44 | | |
45 | | void put(const char *key, ResourceValue &value, UBool /*noFallback*/, UErrorCode &status) U_OVERRIDE; |
46 | | |
47 | | private: |
48 | | CompactData &data; |
49 | | }; |
50 | | }; |
51 | | |
52 | | struct CompactModInfo { |
53 | | const ImmutablePatternModifier *mod; |
54 | | const UChar* patternString; |
55 | | }; |
56 | | |
57 | | class CompactHandler : public MicroPropsGenerator, public UMemory { |
58 | | public: |
59 | | CompactHandler(CompactStyle compactStyle, const Locale &locale, const char *nsName, |
60 | | CompactType compactType, const PluralRules *rules, |
61 | | MutablePatternModifier *buildReference, const MicroPropsGenerator *parent, |
62 | | UErrorCode &status); |
63 | | |
64 | | ~CompactHandler() U_OVERRIDE; |
65 | | |
66 | | void |
67 | | processQuantity(DecimalQuantity &quantity, MicroProps µs, UErrorCode &status) const U_OVERRIDE; |
68 | | |
69 | | private: |
70 | | const PluralRules *rules; |
71 | | const MicroPropsGenerator *parent; |
72 | | // Initial capacity of 12 for 0K, 00K, 000K, ...M, ...B, and ...T |
73 | | MaybeStackArray<CompactModInfo, 12> precomputedMods; |
74 | | int32_t precomputedModsLength = 0; |
75 | | CompactData data; |
76 | | ParsedPatternInfo unsafePatternInfo; |
77 | | UBool safe; |
78 | | |
79 | | /** Used by the safe code path */ |
80 | | void precomputeAllModifiers(MutablePatternModifier &buildReference, UErrorCode &status); |
81 | | }; |
82 | | |
83 | | |
84 | | } // namespace impl |
85 | | } // namespace number |
86 | | U_NAMESPACE_END |
87 | | |
88 | | #endif //__NUMBER_COMPACT_H__ |
89 | | |
90 | | #endif /* #if !UCONFIG_NO_FORMATTING */ |