• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 && !UPRV_INCOMPLETE_CPP11_SUPPORT
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:
CompactDataSink(CompactData & data)43         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     int32_t numDigits;
56 };
57 
58 class CompactHandler : public MicroPropsGenerator, public UMemory {
59   public:
60     CompactHandler(CompactStyle compactStyle, const Locale &locale, const char *nsName,
61                    CompactType compactType, const PluralRules *rules,
62                    MutablePatternModifier *buildReference, const MicroPropsGenerator *parent,
63                    UErrorCode &status);
64 
65     ~CompactHandler() U_OVERRIDE;
66 
67     void
68     processQuantity(DecimalQuantity &quantity, MicroProps &micros, UErrorCode &status) const U_OVERRIDE;
69 
70   private:
71     const PluralRules *rules;
72     const MicroPropsGenerator *parent;
73     // Initial capacity of 12 for 0K, 00K, 000K, ...M, ...B, and ...T
74     MaybeStackArray<CompactModInfo, 12> precomputedMods;
75     int32_t precomputedModsLength = 0;
76     CompactData data;
77     ParsedPatternInfo unsafePatternInfo;
78     UBool safe;
79 
80     /** Used by the safe code path */
81     void precomputeAllModifiers(MutablePatternModifier &buildReference, UErrorCode &status);
82 };
83 
84 
85 } // namespace impl
86 } // namespace number
87 U_NAMESPACE_END
88 
89 #endif //__NUMBER_COMPACT_H__
90 
91 #endif /* #if !UCONFIG_NO_FORMATTING */
92