xref: /aosp_15_r20/external/icu/libicu/cts_headers/numparse_impl.h (revision 0e209d3975ff4a8c132096b14b0e9364a753506e)
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