• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* GENERATED SOURCE. DO NOT MODIFY. */
2 // © 2017 and later: Unicode, Inc. and others.
3 // License & terms of use: http://www.unicode.org/copyright.html#License
4 package ohos.global.icu.impl.number.parse;
5 
6 import ohos.global.icu.impl.StaticUnicodeSets;
7 import ohos.global.icu.impl.StringSegment;
8 import ohos.global.icu.text.UnicodeSet;
9 
10 /**
11  * A base class for many matchers that performs a simple match against a UnicodeString and/or UnicodeSet.
12  *
13  * @author sffc
14  * @hide exposed on OHOS
15  */
16 public abstract class SymbolMatcher implements NumberParseMatcher {
17     protected final String string;
18     protected final UnicodeSet uniSet;
19 
20     // TODO: Implement this class using only UnicodeSet and not String?
21     // How to deal with case folding?
22 
SymbolMatcher(String symbolString, UnicodeSet symbolUniSet)23     protected SymbolMatcher(String symbolString, UnicodeSet symbolUniSet) {
24         string = symbolString;
25         uniSet = symbolUniSet;
26     }
27 
SymbolMatcher(StaticUnicodeSets.Key key)28     protected SymbolMatcher(StaticUnicodeSets.Key key) {
29         string = "";
30         uniSet = StaticUnicodeSets.get(key);
31     }
32 
getSet()33     public UnicodeSet getSet() {
34         return uniSet;
35     }
36 
37     @Override
match(StringSegment segment, ParsedNumber result)38     public boolean match(StringSegment segment, ParsedNumber result) {
39         // Smoke test first; this matcher might be disabled.
40         if (isDisabled(result)) {
41             return false;
42         }
43 
44         // Test the string first in order to consume trailing chars greedily.
45         int overlap = 0;
46         if (!string.isEmpty()) {
47             overlap = segment.getCommonPrefixLength(string);
48             if (overlap == string.length()) {
49                 segment.adjustOffset(string.length());
50                 accept(segment, result);
51                 return false;
52             }
53         }
54 
55         if (segment.startsWith(uniSet)) {
56             segment.adjustOffsetByCodePoint();
57             accept(segment, result);
58             return false;
59         }
60 
61         return overlap == segment.length();
62     }
63 
64     @Override
smokeTest(StringSegment segment)65     public boolean smokeTest(StringSegment segment) {
66         return segment.startsWith(uniSet) || segment.startsWith(string);
67     }
68 
69     @Override
postProcess(ParsedNumber result)70     public void postProcess(ParsedNumber result) {
71         // No-op
72     }
73 
isDisabled(ParsedNumber result)74     protected abstract boolean isDisabled(ParsedNumber result);
75 
accept(StringSegment segment, ParsedNumber result)76     protected abstract void accept(StringSegment segment, ParsedNumber result);
77 }
78