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; 5 6 import java.text.Format.Field; 7 import java.util.Arrays; 8 9 import ohos.global.icu.impl.FormattedStringBuilder; 10 11 /** 12 * An implementation of {@link Modifier} that allows for multiple types of fields in the same modifier. 13 * Constructed based on the contents of two {@link FormattedStringBuilder} instances (one for the prefix, 14 * one for the suffix). 15 * @hide exposed on OHOS 16 */ 17 public class ConstantMultiFieldModifier implements Modifier { 18 19 // NOTE: In Java, these are stored as array pointers. In C++, the FormattedStringBuilder is stored by 20 // value and is treated internally as immutable. 21 protected final char[] prefixChars; 22 protected final char[] suffixChars; 23 protected final Object[] prefixFields; 24 protected final Object[] suffixFields; 25 private final boolean overwrite; 26 private final boolean strong; 27 28 // Parameters: used for number range formatting 29 private final Parameters parameters; 30 ConstantMultiFieldModifier( FormattedStringBuilder prefix, FormattedStringBuilder suffix, boolean overwrite, boolean strong)31 public ConstantMultiFieldModifier( 32 FormattedStringBuilder prefix, 33 FormattedStringBuilder suffix, 34 boolean overwrite, 35 boolean strong) { 36 this(prefix, suffix, overwrite, strong, null); 37 } 38 ConstantMultiFieldModifier( FormattedStringBuilder prefix, FormattedStringBuilder suffix, boolean overwrite, boolean strong, Parameters parameters)39 public ConstantMultiFieldModifier( 40 FormattedStringBuilder prefix, 41 FormattedStringBuilder suffix, 42 boolean overwrite, 43 boolean strong, 44 Parameters parameters) { 45 prefixChars = prefix.toCharArray(); 46 suffixChars = suffix.toCharArray(); 47 prefixFields = prefix.toFieldArray(); 48 suffixFields = suffix.toFieldArray(); 49 this.overwrite = overwrite; 50 this.strong = strong; 51 this.parameters = parameters; 52 } 53 54 @Override apply(FormattedStringBuilder output, int leftIndex, int rightIndex)55 public int apply(FormattedStringBuilder output, int leftIndex, int rightIndex) { 56 int length = output.insert(leftIndex, prefixChars, prefixFields); 57 if (overwrite) { 58 length += output.splice(leftIndex + length, rightIndex + length, "", 0, 0, null); 59 } 60 length += output.insert(rightIndex + length, suffixChars, suffixFields); 61 return length; 62 } 63 64 @Override getPrefixLength()65 public int getPrefixLength() { 66 return prefixChars.length; 67 } 68 69 @Override getCodePointCount()70 public int getCodePointCount() { 71 return Character.codePointCount(prefixChars, 0, prefixChars.length) 72 + Character.codePointCount(suffixChars, 0, suffixChars.length); 73 } 74 75 @Override isStrong()76 public boolean isStrong() { 77 return strong; 78 } 79 80 @Override containsField(Field field)81 public boolean containsField(Field field) { 82 for (int i = 0; i < prefixFields.length; i++) { 83 if (prefixFields[i] == field) { 84 return true; 85 } 86 } 87 for (int i = 0; i < suffixFields.length; i++) { 88 if (suffixFields[i] == field) { 89 return true; 90 } 91 } 92 return false; 93 } 94 95 @Override getParameters()96 public Parameters getParameters() { 97 return parameters; 98 } 99 100 @Override semanticallyEquivalent(Modifier other)101 public boolean semanticallyEquivalent(Modifier other) { 102 if (!(other instanceof ConstantMultiFieldModifier)) { 103 return false; 104 } 105 ConstantMultiFieldModifier _other = (ConstantMultiFieldModifier) other; 106 if (parameters != null && _other.parameters != null && parameters.obj == _other.parameters.obj) { 107 return true; 108 } 109 return Arrays.equals(prefixChars, _other.prefixChars) && Arrays.equals(prefixFields, _other.prefixFields) 110 && Arrays.equals(suffixChars, _other.suffixChars) && Arrays.equals(suffixFields, _other.suffixFields) 111 && overwrite == _other.overwrite && strong == _other.strong; 112 } 113 114 @Override toString()115 public String toString() { 116 FormattedStringBuilder temp = new FormattedStringBuilder(); 117 apply(temp, 0, 0); 118 int prefixLength = getPrefixLength(); 119 return String.format("<ConstantMultiFieldModifier prefix:'%s' suffix:'%s'>", 120 temp.subSequence(0, prefixLength), 121 temp.subSequence(prefixLength, temp.length())); 122 } 123 } 124