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_SYMBOLS_H__ 8*0e209d39SAndroid Build Coastguard Worker #define __NUMPARSE_SYMBOLS_H__ 9*0e209d39SAndroid Build Coastguard Worker 10*0e209d39SAndroid Build Coastguard Worker #include "numparse_types.h" 11*0e209d39SAndroid Build Coastguard Worker #include "unicode/uniset.h" 12*0e209d39SAndroid Build Coastguard Worker #include "static_unicode_sets.h" 13*0e209d39SAndroid Build Coastguard Worker 14*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN 15*0e209d39SAndroid Build Coastguard Worker namespace numparse::impl { 16*0e209d39SAndroid Build Coastguard Worker 17*0e209d39SAndroid Build Coastguard Worker /** 18*0e209d39SAndroid Build Coastguard Worker * A base class for many matchers that performs a simple match against a UnicodeString and/or UnicodeSet. 19*0e209d39SAndroid Build Coastguard Worker * 20*0e209d39SAndroid Build Coastguard Worker * @author sffc 21*0e209d39SAndroid Build Coastguard Worker */ 22*0e209d39SAndroid Build Coastguard Worker // Exported as U_I18N_API for tests 23*0e209d39SAndroid Build Coastguard Worker class U_I18N_API SymbolMatcher : public NumberParseMatcher, public UMemory { 24*0e209d39SAndroid Build Coastguard Worker public: 25*0e209d39SAndroid Build Coastguard Worker SymbolMatcher() = default; // WARNING: Leaves the object in an unusable state 26*0e209d39SAndroid Build Coastguard Worker 27*0e209d39SAndroid Build Coastguard Worker const UnicodeSet* getSet() const; 28*0e209d39SAndroid Build Coastguard Worker 29*0e209d39SAndroid Build Coastguard Worker bool match(StringSegment& segment, ParsedNumber& result, UErrorCode& status) const override; 30*0e209d39SAndroid Build Coastguard Worker 31*0e209d39SAndroid Build Coastguard Worker bool smokeTest(const StringSegment& segment) const override; 32*0e209d39SAndroid Build Coastguard Worker 33*0e209d39SAndroid Build Coastguard Worker UnicodeString toString() const override; 34*0e209d39SAndroid Build Coastguard Worker 35*0e209d39SAndroid Build Coastguard Worker virtual bool isDisabled(const ParsedNumber& result) const = 0; 36*0e209d39SAndroid Build Coastguard Worker 37*0e209d39SAndroid Build Coastguard Worker virtual void accept(StringSegment& segment, ParsedNumber& result) const = 0; 38*0e209d39SAndroid Build Coastguard Worker 39*0e209d39SAndroid Build Coastguard Worker protected: 40*0e209d39SAndroid Build Coastguard Worker UnicodeString fString; 41*0e209d39SAndroid Build Coastguard Worker const UnicodeSet* fUniSet; // a reference from numparse_unisets.h; never owned 42*0e209d39SAndroid Build Coastguard Worker 43*0e209d39SAndroid Build Coastguard Worker SymbolMatcher(const UnicodeString& symbolString, unisets::Key key); 44*0e209d39SAndroid Build Coastguard Worker }; 45*0e209d39SAndroid Build Coastguard Worker 46*0e209d39SAndroid Build Coastguard Worker 47*0e209d39SAndroid Build Coastguard Worker // Exported as U_I18N_API for tests 48*0e209d39SAndroid Build Coastguard Worker class U_I18N_API IgnorablesMatcher : public SymbolMatcher { 49*0e209d39SAndroid Build Coastguard Worker public: 50*0e209d39SAndroid Build Coastguard Worker IgnorablesMatcher() = default; // WARNING: Leaves the object in an unusable state 51*0e209d39SAndroid Build Coastguard Worker 52*0e209d39SAndroid Build Coastguard Worker IgnorablesMatcher(parse_flags_t parseFlags); 53*0e209d39SAndroid Build Coastguard Worker 54*0e209d39SAndroid Build Coastguard Worker bool isFlexible() const override; 55*0e209d39SAndroid Build Coastguard Worker 56*0e209d39SAndroid Build Coastguard Worker UnicodeString toString() const override; 57*0e209d39SAndroid Build Coastguard Worker 58*0e209d39SAndroid Build Coastguard Worker protected: 59*0e209d39SAndroid Build Coastguard Worker bool isDisabled(const ParsedNumber& result) const override; 60*0e209d39SAndroid Build Coastguard Worker 61*0e209d39SAndroid Build Coastguard Worker void accept(StringSegment& segment, ParsedNumber& result) const override; 62*0e209d39SAndroid Build Coastguard Worker }; 63*0e209d39SAndroid Build Coastguard Worker 64*0e209d39SAndroid Build Coastguard Worker 65*0e209d39SAndroid Build Coastguard Worker class InfinityMatcher : public SymbolMatcher { 66*0e209d39SAndroid Build Coastguard Worker public: 67*0e209d39SAndroid Build Coastguard Worker InfinityMatcher() = default; // WARNING: Leaves the object in an unusable state 68*0e209d39SAndroid Build Coastguard Worker 69*0e209d39SAndroid Build Coastguard Worker InfinityMatcher(const DecimalFormatSymbols& dfs); 70*0e209d39SAndroid Build Coastguard Worker 71*0e209d39SAndroid Build Coastguard Worker protected: 72*0e209d39SAndroid Build Coastguard Worker bool isDisabled(const ParsedNumber& result) const override; 73*0e209d39SAndroid Build Coastguard Worker 74*0e209d39SAndroid Build Coastguard Worker void accept(StringSegment& segment, ParsedNumber& result) const override; 75*0e209d39SAndroid Build Coastguard Worker }; 76*0e209d39SAndroid Build Coastguard Worker 77*0e209d39SAndroid Build Coastguard Worker 78*0e209d39SAndroid Build Coastguard Worker // Exported as U_I18N_API for tests 79*0e209d39SAndroid Build Coastguard Worker class U_I18N_API MinusSignMatcher : public SymbolMatcher { 80*0e209d39SAndroid Build Coastguard Worker public: 81*0e209d39SAndroid Build Coastguard Worker MinusSignMatcher() = default; // WARNING: Leaves the object in an unusable state 82*0e209d39SAndroid Build Coastguard Worker 83*0e209d39SAndroid Build Coastguard Worker MinusSignMatcher(const DecimalFormatSymbols& dfs, bool allowTrailing); 84*0e209d39SAndroid Build Coastguard Worker 85*0e209d39SAndroid Build Coastguard Worker protected: 86*0e209d39SAndroid Build Coastguard Worker bool isDisabled(const ParsedNumber& result) const override; 87*0e209d39SAndroid Build Coastguard Worker 88*0e209d39SAndroid Build Coastguard Worker void accept(StringSegment& segment, ParsedNumber& result) const override; 89*0e209d39SAndroid Build Coastguard Worker 90*0e209d39SAndroid Build Coastguard Worker private: 91*0e209d39SAndroid Build Coastguard Worker bool fAllowTrailing; 92*0e209d39SAndroid Build Coastguard Worker }; 93*0e209d39SAndroid Build Coastguard Worker 94*0e209d39SAndroid Build Coastguard Worker 95*0e209d39SAndroid Build Coastguard Worker class NanMatcher : public SymbolMatcher { 96*0e209d39SAndroid Build Coastguard Worker public: 97*0e209d39SAndroid Build Coastguard Worker NanMatcher() = default; // WARNING: Leaves the object in an unusable state 98*0e209d39SAndroid Build Coastguard Worker 99*0e209d39SAndroid Build Coastguard Worker NanMatcher(const DecimalFormatSymbols& dfs); 100*0e209d39SAndroid Build Coastguard Worker 101*0e209d39SAndroid Build Coastguard Worker protected: 102*0e209d39SAndroid Build Coastguard Worker bool isDisabled(const ParsedNumber& result) const override; 103*0e209d39SAndroid Build Coastguard Worker 104*0e209d39SAndroid Build Coastguard Worker void accept(StringSegment& segment, ParsedNumber& result) const override; 105*0e209d39SAndroid Build Coastguard Worker }; 106*0e209d39SAndroid Build Coastguard Worker 107*0e209d39SAndroid Build Coastguard Worker 108*0e209d39SAndroid Build Coastguard Worker class PaddingMatcher : public SymbolMatcher { 109*0e209d39SAndroid Build Coastguard Worker public: 110*0e209d39SAndroid Build Coastguard Worker PaddingMatcher() = default; // WARNING: Leaves the object in an unusable state 111*0e209d39SAndroid Build Coastguard Worker 112*0e209d39SAndroid Build Coastguard Worker PaddingMatcher(const UnicodeString& padString); 113*0e209d39SAndroid Build Coastguard Worker 114*0e209d39SAndroid Build Coastguard Worker bool isFlexible() const override; 115*0e209d39SAndroid Build Coastguard Worker 116*0e209d39SAndroid Build Coastguard Worker protected: 117*0e209d39SAndroid Build Coastguard Worker bool isDisabled(const ParsedNumber& result) const override; 118*0e209d39SAndroid Build Coastguard Worker 119*0e209d39SAndroid Build Coastguard Worker void accept(StringSegment& segment, ParsedNumber& result) const override; 120*0e209d39SAndroid Build Coastguard Worker }; 121*0e209d39SAndroid Build Coastguard Worker 122*0e209d39SAndroid Build Coastguard Worker 123*0e209d39SAndroid Build Coastguard Worker // Exported as U_I18N_API for tests 124*0e209d39SAndroid Build Coastguard Worker class U_I18N_API PercentMatcher : public SymbolMatcher { 125*0e209d39SAndroid Build Coastguard Worker public: 126*0e209d39SAndroid Build Coastguard Worker PercentMatcher() = default; // WARNING: Leaves the object in an unusable state 127*0e209d39SAndroid Build Coastguard Worker 128*0e209d39SAndroid Build Coastguard Worker PercentMatcher(const DecimalFormatSymbols& dfs); 129*0e209d39SAndroid Build Coastguard Worker 130*0e209d39SAndroid Build Coastguard Worker protected: 131*0e209d39SAndroid Build Coastguard Worker bool isDisabled(const ParsedNumber& result) const override; 132*0e209d39SAndroid Build Coastguard Worker 133*0e209d39SAndroid Build Coastguard Worker void accept(StringSegment& segment, ParsedNumber& result) const override; 134*0e209d39SAndroid Build Coastguard Worker }; 135*0e209d39SAndroid Build Coastguard Worker 136*0e209d39SAndroid Build Coastguard Worker // Exported as U_I18N_API for tests 137*0e209d39SAndroid Build Coastguard Worker class U_I18N_API PermilleMatcher : public SymbolMatcher { 138*0e209d39SAndroid Build Coastguard Worker public: 139*0e209d39SAndroid Build Coastguard Worker PermilleMatcher() = default; // WARNING: Leaves the object in an unusable state 140*0e209d39SAndroid Build Coastguard Worker 141*0e209d39SAndroid Build Coastguard Worker PermilleMatcher(const DecimalFormatSymbols& dfs); 142*0e209d39SAndroid Build Coastguard Worker 143*0e209d39SAndroid Build Coastguard Worker protected: 144*0e209d39SAndroid Build Coastguard Worker bool isDisabled(const ParsedNumber& result) const override; 145*0e209d39SAndroid Build Coastguard Worker 146*0e209d39SAndroid Build Coastguard Worker void accept(StringSegment& segment, ParsedNumber& result) const override; 147*0e209d39SAndroid Build Coastguard Worker }; 148*0e209d39SAndroid Build Coastguard Worker 149*0e209d39SAndroid Build Coastguard Worker 150*0e209d39SAndroid Build Coastguard Worker // Exported as U_I18N_API for tests 151*0e209d39SAndroid Build Coastguard Worker class U_I18N_API PlusSignMatcher : public SymbolMatcher { 152*0e209d39SAndroid Build Coastguard Worker public: 153*0e209d39SAndroid Build Coastguard Worker PlusSignMatcher() = default; // WARNING: Leaves the object in an unusable state 154*0e209d39SAndroid Build Coastguard Worker 155*0e209d39SAndroid Build Coastguard Worker PlusSignMatcher(const DecimalFormatSymbols& dfs, bool allowTrailing); 156*0e209d39SAndroid Build Coastguard Worker 157*0e209d39SAndroid Build Coastguard Worker protected: 158*0e209d39SAndroid Build Coastguard Worker bool isDisabled(const ParsedNumber& result) const override; 159*0e209d39SAndroid Build Coastguard Worker 160*0e209d39SAndroid Build Coastguard Worker void accept(StringSegment& segment, ParsedNumber& result) const override; 161*0e209d39SAndroid Build Coastguard Worker 162*0e209d39SAndroid Build Coastguard Worker private: 163*0e209d39SAndroid Build Coastguard Worker bool fAllowTrailing; 164*0e209d39SAndroid Build Coastguard Worker }; 165*0e209d39SAndroid Build Coastguard Worker 166*0e209d39SAndroid Build Coastguard Worker } // namespace numparse::impl 167*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END 168*0e209d39SAndroid Build Coastguard Worker 169*0e209d39SAndroid Build Coastguard Worker #endif //__NUMPARSE_SYMBOLS_H__ 170*0e209d39SAndroid Build Coastguard Worker #endif /* #if !UCONFIG_NO_FORMATTING */ 171