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