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