number_compact.h 2.7 KB

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