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
14U_NAMESPACE_BEGIN namespace numparse {
15namespace 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
24class 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
49class 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
66class 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
80class 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
96class 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
109class 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
125class 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
138class 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
152class 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
170U_NAMESPACE_END
171
172#endif //__NUMPARSE_SYMBOLS_H__
173#endif /* #if !UCONFIG_NO_FORMATTING */
174