/* GENERATED SOURCE. DO NOT MODIFY. */ // © 2017 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html package android.icu.impl.number; import java.text.Format.Field; import android.icu.impl.FormattedStringBuilder; import android.icu.impl.StandardPlural; /** * A Modifier is an object that can be passed through the formatting pipeline until it is finally applied * to the string builder. A Modifier usually contains a prefix and a suffix that are applied, but it * could contain something else, like a {@link android.icu.text.SimpleFormatter} pattern. * * A Modifier is usually immutable, except in cases such as {@link MutablePatternModifier}, which are * mutable for performance reasons. * @hide Only a subset of ICU is exposed in Android */ public interface Modifier { static enum Signum { NEG, NEG_ZERO, POS_ZERO, POS; static final int COUNT = Signum.values().length; public static final Signum[] VALUES = Signum.values(); }; /** * Apply this Modifier to the string builder. * * @param output * The string builder to which to apply this modifier. * @param leftIndex * The left index of the string within the builder. Equal to 0 when only one number is * being formatted. * @param rightIndex * The right index of the string within the string builder. Equal to length when only one * number is being formatted. * @return The number of characters (UTF-16 code units) that were added to the string builder. */ public int apply(FormattedStringBuilder output, int leftIndex, int rightIndex); /** * Gets the length of the prefix. This information can be used in combination with {@link #apply} to * extract the prefix and suffix strings. * * @return The number of characters (UTF-16 code units) in the prefix. */ public int getPrefixLength(); /** * Returns the number of code points in the modifier, prefix plus suffix. */ public int getCodePointCount(); /** * Whether this modifier is strong. If a modifier is strong, it should always be applied immediately * and not allowed to bubble up. With regard to padding, strong modifiers are considered to be on the * inside of the prefix and suffix. * * @return Whether the modifier is strong. */ public boolean isStrong(); /** * Whether the modifier contains at least one occurrence of the given field. */ public boolean containsField(Field currency); /** * A fill-in for getParameters(). obj will always be set; if non-null, the other * two fields are also safe to read. * @hide Only a subset of ICU is exposed in Android */ public static class Parameters { public ModifierStore obj; public Signum signum; public StandardPlural plural; } /** * Gets a set of "parameters" for this Modifier. */ public Parameters getParameters(); /** * Returns whether this Modifier equals another Modifier. */ public boolean strictEquals(Modifier other); /** * Returns whether this Modifier is *semantically equivalent* to the other Modifier; * in many cases, this is the same as equal, but parameters should be ignored. */ default boolean semanticallyEquivalent(Modifier other) { Parameters paramsThis = this.getParameters(); Parameters paramsOther = other.getParameters(); if (paramsThis == null && paramsOther == null) { return this.strictEquals(other); } else if (paramsThis == null || paramsOther == null) { return false; } else if (paramsThis.obj == null && paramsOther.obj == null) { return this.strictEquals(other); } else if (paramsThis.obj == null || paramsOther.obj == null) { return false; } for (Signum signum : Signum.VALUES) { for (StandardPlural plural : StandardPlural.VALUES) { Modifier mod1 = paramsThis.obj.getModifier(signum, plural); Modifier mod2 = paramsOther.obj.getModifier(signum, plural); if (mod1 == mod2) { // Equal pointers continue; } else if (mod1 == null || mod2 == null) { // One pointer is null but not the other return false; } else if (!mod1.strictEquals(mod2)) { // The modifiers are NOT equivalent return false; } else { // The modifiers are equivalent continue; } } } return true; } }