1 // 2018 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 __SOURCE_NUMRANGE_TYPES_H__ 8 #define __SOURCE_NUMRANGE_TYPES_H__ 9 10 #include "unicode/numberformatter.h" 11 #include "unicode/numberrangeformatter.h" 12 #include "unicode/simpleformatter.h" 13 #include "number_types.h" 14 #include "number_decimalquantity.h" 15 #include "number_formatimpl.h" 16 #include "number_stringbuilder.h" 17 18 U_NAMESPACE_BEGIN namespace number { 19 namespace impl { 20 21 22 /** 23 * Class similar to UFormattedNumberData. 24 * 25 * Has incomplete magic number logic that will need to be finished 26 * if this is to be exposed as C API in the future. 27 */ 28 struct UFormattedNumberRangeData : public UMemory { 29 // The magic number to identify incoming objects. 30 // Reads in ASCII as "FDR" (FormatteDnumberRange with room at the end) 31 static constexpr int32_t kMagic = 0x46445200; 32 33 // Data members: 34 int32_t fMagic = kMagic; 35 DecimalQuantity quantity1; 36 DecimalQuantity quantity2; 37 NumberStringBuilder string; 38 UNumberRangeIdentityResult identityResult = UNUM_IDENTITY_RESULT_COUNT; 39 40 // No C conversion methods (no C API yet) 41 }; 42 43 44 class StandardPluralRanges : public UMemory { 45 public: 46 void initialize(const Locale& locale, UErrorCode& status); 47 StandardPlural::Form resolve(StandardPlural::Form first, StandardPlural::Form second) const; 48 49 /** Used for data loading. */ 50 void addPluralRange( 51 StandardPlural::Form first, 52 StandardPlural::Form second, 53 StandardPlural::Form result); 54 55 /** Used for data loading. */ 56 void setCapacity(int32_t length); 57 58 private: 59 struct StandardPluralRangeTriple { 60 StandardPlural::Form first; 61 StandardPlural::Form second; 62 StandardPlural::Form result; 63 }; 64 65 // TODO: An array is simple here, but it results in linear lookup time. 66 // Certain locales have 20-30 entries in this list. 67 // Consider changing to a smarter data structure. 68 typedef MaybeStackArray<StandardPluralRangeTriple, 3> PluralRangeTriples; 69 PluralRangeTriples fTriples; 70 int32_t fTriplesLen = 0; 71 }; 72 73 74 class NumberRangeFormatterImpl : public UMemory { 75 public: 76 NumberRangeFormatterImpl(const RangeMacroProps& macros, UErrorCode& status); 77 78 void format(UFormattedNumberRangeData& data, bool equalBeforeRounding, UErrorCode& status) const; 79 80 private: 81 NumberFormatterImpl formatterImpl1; 82 NumberFormatterImpl formatterImpl2; 83 bool fSameFormatters; 84 85 UNumberRangeCollapse fCollapse; 86 UNumberRangeIdentityFallback fIdentityFallback; 87 88 SimpleFormatter fRangeFormatter; 89 SimpleModifier fApproximatelyModifier; 90 91 StandardPluralRanges fPluralRanges; 92 93 void formatSingleValue(UFormattedNumberRangeData& data, 94 MicroProps& micros1, MicroProps& micros2, 95 UErrorCode& status) const; 96 97 void formatApproximately(UFormattedNumberRangeData& data, 98 MicroProps& micros1, MicroProps& micros2, 99 UErrorCode& status) const; 100 101 void formatRange(UFormattedNumberRangeData& data, 102 MicroProps& micros1, MicroProps& micros2, 103 UErrorCode& status) const; 104 105 const Modifier& resolveModifierPlurals(const Modifier& first, const Modifier& second) const; 106 }; 107 108 109 } // namespace impl 110 } // namespace number 111 U_NAMESPACE_END 112 113 #endif //__SOURCE_NUMRANGE_TYPES_H__ 114 #endif /* #if !UCONFIG_NO_FORMATTING */ 115