tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

number_compact.h (2775B)


      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
     18 namespace number::impl {
     19 
     20 static const int32_t COMPACT_MAX_DIGITS = 20;
     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 override;
     30 
     31    const char16_t *getPattern(
     32        int32_t magnitude,
     33        const PluralRules *rules,
     34        const DecimalQuantity &dq) const;
     35 
     36    void getUniquePatterns(UVector &output, UErrorCode &status) const;
     37 
     38  private:
     39    const char16_t *patterns[(COMPACT_MAX_DIGITS + 1) * StandardPlural::COUNT];
     40    int8_t multipliers[COMPACT_MAX_DIGITS + 1];
     41    int8_t largestMagnitude;
     42    UBool isEmpty;
     43 
     44    class CompactDataSink : public ResourceSink {
     45      public:
     46        explicit CompactDataSink(CompactData &data) : data(data) {}
     47 
     48        void put(const char *key, ResourceValue &value, UBool /*noFallback*/, UErrorCode &status) override;
     49 
     50      private:
     51        CompactData &data;
     52    };
     53 };
     54 
     55 struct CompactModInfo {
     56    const ImmutablePatternModifier *mod;
     57    const char16_t* patternString;
     58 };
     59 
     60 class CompactHandler : public MicroPropsGenerator, public UMemory {
     61  public:
     62    CompactHandler(
     63            CompactStyle compactStyle,
     64            const Locale &locale,
     65            const char *nsName,
     66            CompactType compactType,
     67            const PluralRules *rules,
     68            MutablePatternModifier *buildReference,
     69            bool safe,
     70            const MicroPropsGenerator *parent,
     71            UErrorCode &status);
     72 
     73    ~CompactHandler() override;
     74 
     75    void
     76    processQuantity(DecimalQuantity &quantity, MicroProps &micros, UErrorCode &status) const override;
     77 
     78  private:
     79    const PluralRules *rules;
     80    const MicroPropsGenerator *parent;
     81    // Initial capacity of 12 for 0K, 00K, 000K, ...M, ...B, and ...T
     82    MaybeStackArray<CompactModInfo, 12> precomputedMods;
     83    int32_t precomputedModsLength = 0;
     84    CompactData data;
     85    ParsedPatternInfo unsafePatternInfo;
     86    MutablePatternModifier* unsafePatternModifier;
     87    UBool safe;
     88 
     89    /** Used by the safe code path */
     90    void precomputeAllModifiers(MutablePatternModifier &buildReference, UErrorCode &status);
     91 };
     92 
     93 } // namespace number::impl
     94 U_NAMESPACE_END
     95 
     96 #endif //__NUMBER_COMPACT_H__
     97 
     98 #endif /* #if !UCONFIG_NO_FORMATTING */