]>
Commit | Line | Data |
---|---|---|
0f5d89e8 A |
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_NUMPARSE_COMPOSITIONS__ | |
8 | #define __SOURCE_NUMPARSE_COMPOSITIONS__ | |
9 | ||
10 | #include "numparse_types.h" | |
11 | ||
12 | U_NAMESPACE_BEGIN | |
13 | ||
14 | // Export an explicit template instantiation of the MaybeStackArray that is used as a data member of ArraySeriesMatcher. | |
15 | // When building DLLs for Windows this is required even though no direct access to the MaybeStackArray leaks out of the i18n library. | |
16 | // (See digitlst.h, pluralaffix.h, datefmt.h, and others for similar examples.) | |
17 | #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN | |
18 | template class U_I18N_API MaybeStackArray<const numparse::impl::NumberParseMatcher*, 3>; | |
19 | #endif | |
20 | ||
21 | namespace numparse { | |
22 | namespace impl { | |
23 | ||
24 | /** | |
25 | * Base class for AnyMatcher and SeriesMatcher. | |
26 | */ | |
27 | // Exported as U_I18N_API for tests | |
28 | class U_I18N_API CompositionMatcher : public NumberParseMatcher { | |
29 | protected: | |
30 | // No construction except by subclasses! | |
31 | CompositionMatcher() = default; | |
32 | ||
33 | // To be overridden by subclasses (used for iteration): | |
34 | virtual const NumberParseMatcher* const* begin() const = 0; | |
35 | ||
36 | // To be overridden by subclasses (used for iteration): | |
37 | virtual const NumberParseMatcher* const* end() const = 0; | |
38 | }; | |
39 | ||
40 | ||
41 | // NOTE: AnyMatcher is no longer being used. The previous definition is shown below. | |
42 | // The implementation can be found in SVN source control, deleted around March 30, 2018. | |
43 | ///** | |
44 | // * Composes a number of matchers, and succeeds if any of the matchers succeed. Always greedily chooses | |
45 | // * the first matcher in the list to succeed. | |
46 | // * | |
47 | // * NOTE: In C++, this is a base class, unlike ICU4J, which uses a factory-style interface. | |
48 | // * | |
49 | // * @author sffc | |
50 | // * @see SeriesMatcher | |
51 | // */ | |
52 | //class AnyMatcher : public CompositionMatcher { | |
53 | // public: | |
54 | // bool match(StringSegment& segment, ParsedNumber& result, UErrorCode& status) const override; | |
55 | // | |
56 | // bool smokeTest(const StringSegment& segment) const override; | |
57 | // | |
58 | // void postProcess(ParsedNumber& result) const override; | |
59 | // | |
60 | // protected: | |
61 | // // No construction except by subclasses! | |
62 | // AnyMatcher() = default; | |
63 | //}; | |
64 | ||
65 | ||
66 | /** | |
67 | * Composes a number of matchers, running one after another. Matches the input string only if all of the | |
68 | * matchers in the series succeed. Performs greedy matches within the context of the series. | |
69 | * | |
70 | * @author sffc | |
71 | * @see AnyMatcher | |
72 | */ | |
73 | // Exported as U_I18N_API for tests | |
74 | class U_I18N_API SeriesMatcher : public CompositionMatcher { | |
75 | public: | |
76 | bool match(StringSegment& segment, ParsedNumber& result, UErrorCode& status) const override; | |
77 | ||
78 | bool smokeTest(const StringSegment& segment) const override; | |
79 | ||
80 | void postProcess(ParsedNumber& result) const override; | |
81 | ||
82 | virtual int32_t length() const = 0; | |
83 | ||
84 | protected: | |
85 | // No construction except by subclasses! | |
86 | SeriesMatcher() = default; | |
87 | }; | |
88 | ||
89 | /** | |
90 | * An implementation of SeriesMatcher that references an array of matchers. | |
91 | * | |
92 | * The object adopts the array, but NOT the matchers contained inside the array. | |
93 | */ | |
94 | // Exported as U_I18N_API for tests | |
95 | class U_I18N_API ArraySeriesMatcher : public SeriesMatcher { | |
96 | public: | |
97 | ArraySeriesMatcher(); // WARNING: Leaves the object in an unusable state | |
98 | ||
99 | typedef MaybeStackArray<const NumberParseMatcher*, 3> MatcherArray; | |
100 | ||
101 | /** The array is std::move'd */ | |
102 | ArraySeriesMatcher(MatcherArray& matchers, int32_t matchersLen); | |
103 | ||
104 | UnicodeString toString() const override; | |
105 | ||
106 | int32_t length() const override; | |
107 | ||
108 | protected: | |
109 | const NumberParseMatcher* const* begin() const override; | |
110 | ||
111 | const NumberParseMatcher* const* end() const override; | |
112 | ||
113 | private: | |
114 | MatcherArray fMatchers; | |
115 | int32_t fMatchersLen; | |
116 | }; | |
117 | ||
118 | ||
119 | } // namespace impl | |
120 | } // namespace numparse | |
121 | U_NAMESPACE_END | |
122 | ||
123 | #endif //__SOURCE_NUMPARSE_COMPOSITIONS__ | |
124 | #endif /* #if !UCONFIG_NO_FORMATTING */ |