12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- // © 2017 and later: Unicode, Inc. and others.
- // License & terms of use: http://www.unicode.org/copyright.html
- #include "unicode/utypes.h"
- #if !UCONFIG_NO_FORMATTING
- #ifndef __NUMBER_COMPACT_H__
- #define __NUMBER_COMPACT_H__
- #include "standardplural.h"
- #include "number_types.h"
- #include "unicode/unum.h"
- #include "uvector.h"
- #include "resource.h"
- #include "number_patternmodifier.h"
- U_NAMESPACE_BEGIN namespace number {
- namespace impl {
- static const int32_t COMPACT_MAX_DIGITS = 15;
- class CompactData : public MultiplierProducer {
- public:
- CompactData();
- void populate(const Locale &locale, const char *nsName, CompactStyle compactStyle,
- CompactType compactType, UErrorCode &status);
- int32_t getMultiplier(int32_t magnitude) const U_OVERRIDE;
- const UChar *getPattern(int32_t magnitude, StandardPlural::Form plural) const;
- void getUniquePatterns(UVector &output, UErrorCode &status) const;
- private:
- const UChar *patterns[(COMPACT_MAX_DIGITS + 1) * StandardPlural::COUNT];
- int8_t multipliers[COMPACT_MAX_DIGITS + 1];
- int8_t largestMagnitude;
- UBool isEmpty;
- class CompactDataSink : public ResourceSink {
- public:
- explicit CompactDataSink(CompactData &data) : data(data) {}
- void put(const char *key, ResourceValue &value, UBool /*noFallback*/, UErrorCode &status) U_OVERRIDE;
- private:
- CompactData &data;
- };
- };
- struct CompactModInfo {
- const ImmutablePatternModifier *mod;
- const UChar* patternString;
- };
- class CompactHandler : public MicroPropsGenerator, public UMemory {
- public:
- CompactHandler(
- CompactStyle compactStyle,
- const Locale &locale,
- const char *nsName,
- CompactType compactType,
- const PluralRules *rules,
- MutablePatternModifier *buildReference,
- bool safe,
- const MicroPropsGenerator *parent,
- UErrorCode &status);
- ~CompactHandler() U_OVERRIDE;
- void
- processQuantity(DecimalQuantity &quantity, MicroProps µs, UErrorCode &status) const U_OVERRIDE;
- private:
- const PluralRules *rules;
- const MicroPropsGenerator *parent;
- // Initial capacity of 12 for 0K, 00K, 000K, ...M, ...B, and ...T
- MaybeStackArray<CompactModInfo, 12> precomputedMods;
- int32_t precomputedModsLength = 0;
- CompactData data;
- ParsedPatternInfo unsafePatternInfo;
- MutablePatternModifier* unsafePatternModifier;
- UBool safe;
- /** Used by the safe code path */
- void precomputeAllModifiers(MutablePatternModifier &buildReference, UErrorCode &status);
- };
- } // namespace impl
- } // namespace number
- U_NAMESPACE_END
- #endif //__NUMBER_COMPACT_H__
- #endif /* #if !UCONFIG_NO_FORMATTING */
|