138 lines
5.6 KiB
Java
138 lines
5.6 KiB
Java
/* GENERATED SOURCE. DO NOT MODIFY. */
|
|
// © 2018 and later: Unicode, Inc. and others.
|
|
// License & terms of use: http://www.unicode.org/copyright.html
|
|
package android.icu.impl;
|
|
|
|
import android.icu.lang.UCharacter;
|
|
import android.icu.lang.UProperty;
|
|
import android.icu.text.UnicodeSet;
|
|
|
|
/**
|
|
* Properties functionality above class UCharacterProperty
|
|
* but below class CharacterProperties and class UnicodeSet.
|
|
* @hide Only a subset of ICU is exposed in Android
|
|
*/
|
|
public final class CharacterPropertiesImpl {
|
|
private static final int NUM_INCLUSIONS = UCharacterProperty.SRC_COUNT +
|
|
UProperty.INT_LIMIT - UProperty.INT_START;
|
|
|
|
/**
|
|
* A set of all characters _except_ the second through last characters of
|
|
* certain ranges. These ranges are ranges of characters whose
|
|
* properties are all exactly alike, e.g. CJK Ideographs from
|
|
* U+4E00 to U+9FA5.
|
|
*/
|
|
private static final UnicodeSet inclusions[] = new UnicodeSet[NUM_INCLUSIONS];
|
|
|
|
/** For {@link UnicodeSet#setDefaultXSymbolTable}. */
|
|
public static synchronized void clear() {
|
|
for (int i = 0; i < inclusions.length; ++i) {
|
|
inclusions[i] = null;
|
|
}
|
|
}
|
|
|
|
private static UnicodeSet getInclusionsForSource(int src) {
|
|
if (inclusions[src] == null) {
|
|
UnicodeSet incl = new UnicodeSet();
|
|
switch(src) {
|
|
case UCharacterProperty.SRC_CHAR:
|
|
UCharacterProperty.INSTANCE.addPropertyStarts(incl);
|
|
break;
|
|
case UCharacterProperty.SRC_PROPSVEC:
|
|
UCharacterProperty.INSTANCE.upropsvec_addPropertyStarts(incl);
|
|
break;
|
|
case UCharacterProperty.SRC_CHAR_AND_PROPSVEC:
|
|
UCharacterProperty.INSTANCE.addPropertyStarts(incl);
|
|
UCharacterProperty.INSTANCE.upropsvec_addPropertyStarts(incl);
|
|
break;
|
|
case UCharacterProperty.SRC_CASE_AND_NORM:
|
|
Norm2AllModes.getNFCInstance().impl.addPropertyStarts(incl);
|
|
UCaseProps.INSTANCE.addPropertyStarts(incl);
|
|
break;
|
|
case UCharacterProperty.SRC_NFC:
|
|
Norm2AllModes.getNFCInstance().impl.addPropertyStarts(incl);
|
|
break;
|
|
case UCharacterProperty.SRC_NFKC:
|
|
Norm2AllModes.getNFKCInstance().impl.addPropertyStarts(incl);
|
|
break;
|
|
case UCharacterProperty.SRC_NFKC_CF:
|
|
Norm2AllModes.getNFKC_CFInstance().impl.addPropertyStarts(incl);
|
|
break;
|
|
case UCharacterProperty.SRC_NFC_CANON_ITER:
|
|
Norm2AllModes.getNFCInstance().impl.addCanonIterPropertyStarts(incl);
|
|
break;
|
|
case UCharacterProperty.SRC_CASE:
|
|
UCaseProps.INSTANCE.addPropertyStarts(incl);
|
|
break;
|
|
case UCharacterProperty.SRC_BIDI:
|
|
UBiDiProps.INSTANCE.addPropertyStarts(incl);
|
|
break;
|
|
case UCharacterProperty.SRC_INPC:
|
|
case UCharacterProperty.SRC_INSC:
|
|
case UCharacterProperty.SRC_VO:
|
|
UCharacterProperty.ulayout_addPropertyStarts(src, incl);
|
|
break;
|
|
case UCharacterProperty.SRC_EMOJI: {
|
|
EmojiProps.INSTANCE.addPropertyStarts(incl);
|
|
break;
|
|
}
|
|
case UCharacterProperty.SRC_IDSU:
|
|
// New in Unicode 15.1 for just two characters.
|
|
incl.add(0x2FFE);
|
|
incl.add(0x2FFF + 1);
|
|
break;
|
|
case UCharacterProperty.SRC_ID_COMPAT_MATH:
|
|
UCharacterProperty.mathCompat_addPropertyStarts(incl);
|
|
break;
|
|
default:
|
|
throw new IllegalStateException("getInclusions(unknown src " + src + ")");
|
|
}
|
|
// We do not freeze() the set because we only iterate over it,
|
|
// rather than testing contains(),
|
|
// so the extra time and memory to optimize that are not necessary.
|
|
inclusions[src] = incl.compact();
|
|
}
|
|
return inclusions[src];
|
|
}
|
|
|
|
private static UnicodeSet getIntPropInclusions(int prop) {
|
|
assert(UProperty.INT_START <= prop && prop < UProperty.INT_LIMIT);
|
|
int inclIndex = UCharacterProperty.SRC_COUNT + prop - UProperty.INT_START;
|
|
if (inclusions[inclIndex] != null) {
|
|
return inclusions[inclIndex];
|
|
}
|
|
int src = UCharacterProperty.INSTANCE.getSource(prop);
|
|
UnicodeSet incl = getInclusionsForSource(src);
|
|
|
|
UnicodeSet intPropIncl = new UnicodeSet(0, 0);
|
|
int numRanges = incl.getRangeCount();
|
|
int prevValue = 0;
|
|
for (int i = 0; i < numRanges; ++i) {
|
|
int rangeEnd = incl.getRangeEnd(i);
|
|
for (int c = incl.getRangeStart(i); c <= rangeEnd; ++c) {
|
|
// TODO: Get a UCharacterProperty.IntProperty to avoid the property dispatch.
|
|
int value = UCharacter.getIntPropertyValue(c, prop);
|
|
if (value != prevValue) {
|
|
intPropIncl.add(c);
|
|
prevValue = value;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Compact for caching.
|
|
return inclusions[inclIndex] = intPropIncl.compact();
|
|
}
|
|
|
|
/**
|
|
* Returns a mutable UnicodeSet -- do not modify!
|
|
*/
|
|
public static synchronized UnicodeSet getInclusionsForProperty(int prop) {
|
|
if (UProperty.INT_START <= prop && prop < UProperty.INT_LIMIT) {
|
|
return getIntPropInclusions(prop);
|
|
} else {
|
|
int src = UCharacterProperty.INSTANCE.getSource(prop);
|
|
return getInclusionsForSource(src);
|
|
}
|
|
}
|
|
}
|