1*0e209d39SAndroid Build Coastguard Worker // © 2018 and later: Unicode, Inc. and others. 2*0e209d39SAndroid Build Coastguard Worker // License & terms of use: http://www.unicode.org/copyright.html 3*0e209d39SAndroid Build Coastguard Worker 4*0e209d39SAndroid Build Coastguard Worker #include "unicode/utypes.h" 5*0e209d39SAndroid Build Coastguard Worker 6*0e209d39SAndroid Build Coastguard Worker #if !UCONFIG_NO_FORMATTING 7*0e209d39SAndroid Build Coastguard Worker #ifndef __NUMPARSE_IMPL_H__ 8*0e209d39SAndroid Build Coastguard Worker #define __NUMPARSE_IMPL_H__ 9*0e209d39SAndroid Build Coastguard Worker 10*0e209d39SAndroid Build Coastguard Worker #include "numparse_types.h" 11*0e209d39SAndroid Build Coastguard Worker #include "numparse_decimal.h" 12*0e209d39SAndroid Build Coastguard Worker #include "numparse_symbols.h" 13*0e209d39SAndroid Build Coastguard Worker #include "numparse_scientific.h" 14*0e209d39SAndroid Build Coastguard Worker #include "unicode/uniset.h" 15*0e209d39SAndroid Build Coastguard Worker #include "numparse_currency.h" 16*0e209d39SAndroid Build Coastguard Worker #include "numparse_affixes.h" 17*0e209d39SAndroid Build Coastguard Worker #include "number_decimfmtprops.h" 18*0e209d39SAndroid Build Coastguard Worker #include "unicode/localpointer.h" 19*0e209d39SAndroid Build Coastguard Worker #include "numparse_validators.h" 20*0e209d39SAndroid Build Coastguard Worker #include "number_multiplier.h" 21*0e209d39SAndroid Build Coastguard Worker #include "string_segment.h" 22*0e209d39SAndroid Build Coastguard Worker 23*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN 24*0e209d39SAndroid Build Coastguard Worker 25*0e209d39SAndroid Build Coastguard Worker // Export an explicit template instantiation of the MaybeStackArray that is used as a data member of NumberParserImpl. 26*0e209d39SAndroid Build Coastguard Worker // When building DLLs for Windows this is required even though no direct access to the MaybeStackArray leaks out of the i18n library. 27*0e209d39SAndroid Build Coastguard Worker // (See numparse_compositions.h, numparse_affixes.h, datefmt.h, and others for similar examples.) 28*0e209d39SAndroid Build Coastguard Worker #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN 29*0e209d39SAndroid Build Coastguard Worker template class U_I18N_API MaybeStackArray<const numparse::impl::NumberParseMatcher*, 10>; 30*0e209d39SAndroid Build Coastguard Worker #endif 31*0e209d39SAndroid Build Coastguard Worker 32*0e209d39SAndroid Build Coastguard Worker namespace numparse::impl { 33*0e209d39SAndroid Build Coastguard Worker 34*0e209d39SAndroid Build Coastguard Worker // Exported as U_I18N_API for tests 35*0e209d39SAndroid Build Coastguard Worker class U_I18N_API NumberParserImpl : public MutableMatcherCollection, public UMemory { 36*0e209d39SAndroid Build Coastguard Worker public: 37*0e209d39SAndroid Build Coastguard Worker virtual ~NumberParserImpl(); 38*0e209d39SAndroid Build Coastguard Worker 39*0e209d39SAndroid Build Coastguard Worker static NumberParserImpl* createSimpleParser(const Locale& locale, const UnicodeString& patternString, 40*0e209d39SAndroid Build Coastguard Worker parse_flags_t parseFlags, UErrorCode& status); 41*0e209d39SAndroid Build Coastguard Worker 42*0e209d39SAndroid Build Coastguard Worker static NumberParserImpl* createParserFromProperties( 43*0e209d39SAndroid Build Coastguard Worker const number::impl::DecimalFormatProperties& properties, const DecimalFormatSymbols& symbols, 44*0e209d39SAndroid Build Coastguard Worker bool parseCurrency, UErrorCode& status); 45*0e209d39SAndroid Build Coastguard Worker 46*0e209d39SAndroid Build Coastguard Worker /** 47*0e209d39SAndroid Build Coastguard Worker * Does NOT take ownership of the matcher. The matcher MUST remain valid for the lifespan of the 48*0e209d39SAndroid Build Coastguard Worker * NumberParserImpl. 49*0e209d39SAndroid Build Coastguard Worker * @param matcher The matcher to reference. 50*0e209d39SAndroid Build Coastguard Worker */ 51*0e209d39SAndroid Build Coastguard Worker void addMatcher(NumberParseMatcher& matcher) override; 52*0e209d39SAndroid Build Coastguard Worker 53*0e209d39SAndroid Build Coastguard Worker void freeze(); 54*0e209d39SAndroid Build Coastguard Worker 55*0e209d39SAndroid Build Coastguard Worker parse_flags_t getParseFlags() const; 56*0e209d39SAndroid Build Coastguard Worker 57*0e209d39SAndroid Build Coastguard Worker void parse(const UnicodeString& input, bool greedy, ParsedNumber& result, UErrorCode& status) const; 58*0e209d39SAndroid Build Coastguard Worker 59*0e209d39SAndroid Build Coastguard Worker void parse(const UnicodeString& input, int32_t start, bool greedy, ParsedNumber& result, 60*0e209d39SAndroid Build Coastguard Worker UErrorCode& status) const; 61*0e209d39SAndroid Build Coastguard Worker 62*0e209d39SAndroid Build Coastguard Worker UnicodeString toString() const; 63*0e209d39SAndroid Build Coastguard Worker 64*0e209d39SAndroid Build Coastguard Worker private: 65*0e209d39SAndroid Build Coastguard Worker parse_flags_t fParseFlags; 66*0e209d39SAndroid Build Coastguard Worker int32_t fNumMatchers = 0; 67*0e209d39SAndroid Build Coastguard Worker // NOTE: The stack capacity for fMatchers and fLeads should be the same 68*0e209d39SAndroid Build Coastguard Worker MaybeStackArray<const NumberParseMatcher*, 10> fMatchers; 69*0e209d39SAndroid Build Coastguard Worker bool fFrozen = false; 70*0e209d39SAndroid Build Coastguard Worker 71*0e209d39SAndroid Build Coastguard Worker // WARNING: All of these matchers start in an undefined state (default-constructed). 72*0e209d39SAndroid Build Coastguard Worker // You must use an assignment operator on them before using. 73*0e209d39SAndroid Build Coastguard Worker struct { 74*0e209d39SAndroid Build Coastguard Worker IgnorablesMatcher ignorables; 75*0e209d39SAndroid Build Coastguard Worker InfinityMatcher infinity; 76*0e209d39SAndroid Build Coastguard Worker MinusSignMatcher minusSign; 77*0e209d39SAndroid Build Coastguard Worker NanMatcher nan; 78*0e209d39SAndroid Build Coastguard Worker PaddingMatcher padding; 79*0e209d39SAndroid Build Coastguard Worker PercentMatcher percent; 80*0e209d39SAndroid Build Coastguard Worker PermilleMatcher permille; 81*0e209d39SAndroid Build Coastguard Worker PlusSignMatcher plusSign; 82*0e209d39SAndroid Build Coastguard Worker DecimalMatcher decimal; 83*0e209d39SAndroid Build Coastguard Worker ScientificMatcher scientific; 84*0e209d39SAndroid Build Coastguard Worker CombinedCurrencyMatcher currency; 85*0e209d39SAndroid Build Coastguard Worker AffixMatcherWarehouse affixMatcherWarehouse; 86*0e209d39SAndroid Build Coastguard Worker AffixTokenMatcherWarehouse affixTokenMatcherWarehouse; 87*0e209d39SAndroid Build Coastguard Worker } fLocalMatchers; 88*0e209d39SAndroid Build Coastguard Worker struct { 89*0e209d39SAndroid Build Coastguard Worker RequireAffixValidator affix; 90*0e209d39SAndroid Build Coastguard Worker RequireCurrencyValidator currency; 91*0e209d39SAndroid Build Coastguard Worker RequireDecimalSeparatorValidator decimalSeparator; 92*0e209d39SAndroid Build Coastguard Worker RequireNumberValidator number; 93*0e209d39SAndroid Build Coastguard Worker MultiplierParseHandler multiplier; 94*0e209d39SAndroid Build Coastguard Worker } fLocalValidators; 95*0e209d39SAndroid Build Coastguard Worker 96*0e209d39SAndroid Build Coastguard Worker explicit NumberParserImpl(parse_flags_t parseFlags); 97*0e209d39SAndroid Build Coastguard Worker 98*0e209d39SAndroid Build Coastguard Worker void parseGreedy(StringSegment& segment, ParsedNumber& result, UErrorCode& status) const; 99*0e209d39SAndroid Build Coastguard Worker 100*0e209d39SAndroid Build Coastguard Worker void parseLongestRecursive( 101*0e209d39SAndroid Build Coastguard Worker StringSegment& segment, ParsedNumber& result, int32_t recursionLevels, UErrorCode& status) const; 102*0e209d39SAndroid Build Coastguard Worker }; 103*0e209d39SAndroid Build Coastguard Worker 104*0e209d39SAndroid Build Coastguard Worker } // namespace numparse::impl 105*0e209d39SAndroid Build Coastguard Worker 106*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END 107*0e209d39SAndroid Build Coastguard Worker 108*0e209d39SAndroid Build Coastguard Worker #endif //__NUMPARSE_IMPL_H__ 109*0e209d39SAndroid Build Coastguard Worker #endif /* #if !UCONFIG_NO_FORMATTING */ 110