Home | History | Annotate | Download | only in i18n
      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:
     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