12ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller/* GENERATED SOURCE. DO NOT MODIFY. */ 2f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert// © 2016 and later: Unicode, Inc. and others. 3f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License 42ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller/* 52ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller ******************************************************************************* 62ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * Copyright (C) 1996-2014, International Business Machines Corporation and 72ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * others. All Rights Reserved. 82ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller ******************************************************************************* 92ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller */ 102ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fullerpackage android.icu.text; 112ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 122ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fullerimport java.text.CharacterIterator; 132ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 142ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fullerimport android.icu.lang.UCharacter; 152ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fullerimport android.icu.util.ICUCloneNotSupportedException; 162ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fullerimport android.icu.util.ULocale; 172ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 182ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 192ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller/** 202ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * Inserts the specified characters at word breaks. To restrict it to particular characters, use a filter. 212ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * TODO: this is an internal class, and only temporary. Remove it once we have \b notation in Transliterator. 222ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller */ 232ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fullerfinal class BreakTransliterator extends Transliterator { 242ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller private BreakIterator bi; 252ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller private String insertion; 262ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller private int[] boundaries = new int[50]; 272ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller private int boundaryCount = 0; 282ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 292ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller public BreakTransliterator(String ID, UnicodeFilter filter, BreakIterator bi, String insertion) { 302ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller super(ID, filter); 312ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller this.bi = bi; 322ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller this.insertion = insertion; 332ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 342ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 352ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller public BreakTransliterator(String ID, UnicodeFilter filter) { 362ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller this(ID, filter, null, " "); 372ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 382ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 392ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller ///CLOVER:OFF 402ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller // The following method is not called by anything and can't be reached 412ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller public String getInsertion() { 422ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller return insertion; 432ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 442ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller ///CLOVER:ON 452ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 462ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller ///CLOVER:OFF 472ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller // The following method is not called by anything and can't be reached 482ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller public void setInsertion(String insertion) { 492ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller this.insertion = insertion; 502ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 512ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller ///CLOVER:ON 522ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 532ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller public BreakIterator getBreakIterator() { 542ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller // Defer initialization of BreakIterator because it is slow, 552ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller // typically over 2000 ms. 562ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller if (bi == null) bi = BreakIterator.getWordInstance(new ULocale("th_TH")); 572ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller return bi; 582ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 592ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 602ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller ///CLOVER:OFF 612ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller // The following method is not called by anything and can't be reached 622ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller public void setBreakIterator(BreakIterator bi) { 632ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller this.bi = bi; 642ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 652ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller ///CLOVER:ON 662ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 672ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller static final int LETTER_OR_MARK_MASK = 682ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller (1<<Character.UPPERCASE_LETTER) 692ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller | (1<<Character.LOWERCASE_LETTER) 702ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller | (1<<Character.TITLECASE_LETTER) 712ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller | (1<<Character.MODIFIER_LETTER) 722ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller | (1<<Character.OTHER_LETTER) 732ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller | (1<<Character.COMBINING_SPACING_MARK) 742ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller | (1<<Character.NON_SPACING_MARK) 752ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller | (1<<Character.ENCLOSING_MARK) 762ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller ; 77f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Override 782ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller protected synchronized void handleTransliterate(Replaceable text, Position pos, boolean incremental) { 792ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller boundaryCount = 0; 802ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller int boundary = 0; 812ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller getBreakIterator(); // Lazy-create it if necessary 822ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller bi.setText(new ReplaceableCharacterIterator(text, pos.start, pos.limit, pos.start)); 832ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller // TODO: fix clumsy workaround used below. 842ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller /* 852ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller char[] tempBuffer = new char[text.length()]; 862ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller text.getChars(0, text.length(), tempBuffer, 0); 872ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller bi.setText(new StringCharacterIterator(new String(tempBuffer), pos.start, pos.limit, pos.start)); 882ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller */ 892ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller // end debugging 902ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 912ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller // To make things much easier, we will stack the boundaries, and then insert at the end. 922ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller // generally, we won't need too many, since we will be filtered. 932ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 942ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller for(boundary = bi.first(); boundary != BreakIterator.DONE && boundary < pos.limit; boundary = bi.next()) { 952ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller if (boundary == 0) continue; 962ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller // HACK: Check to see that preceeding item was a letter 972ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 982ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller int cp = UTF16.charAt(text, boundary-1); 992ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller int type = UCharacter.getType(cp); 1002ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller //System.out.println(Integer.toString(cp,16) + " (before): " + type); 1012ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller if (((1<<type) & LETTER_OR_MARK_MASK) == 0) continue; 1022ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 1032ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller cp = UTF16.charAt(text, boundary); 1042ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller type = UCharacter.getType(cp); 1052ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller //System.out.println(Integer.toString(cp,16) + " (after): " + type); 1062ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller if (((1<<type) & LETTER_OR_MARK_MASK) == 0) continue; 1072ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 1082ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller if (boundaryCount >= boundaries.length) { // realloc if necessary 1092ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller int[] temp = new int[boundaries.length * 2]; 1102ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller System.arraycopy(boundaries, 0, temp, 0, boundaries.length); 1112ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller boundaries = temp; 1122ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 1132ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 1142ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller boundaries[boundaryCount++] = boundary; 1152ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller //System.out.println(boundary); 1162ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 1172ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 1182ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller int delta = 0; 1192ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller int lastBoundary = 0; 1202ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 1212ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller if (boundaryCount != 0) { // if we found something, adjust 1222ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller delta = boundaryCount * insertion.length(); 1232ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller lastBoundary = boundaries[boundaryCount-1]; 1242ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 1252ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller // we do this from the end backwards, so that we don't have to keep updating. 1262ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 1272ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller while (boundaryCount > 0) { 1282ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller boundary = boundaries[--boundaryCount]; 1292ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller text.replace(boundary, boundary, insertion); 1302ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 1312ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 1322ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 1332ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller // Now fix up the return values 1342ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller pos.contextLimit += delta; 1352ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller pos.limit += delta; 1362ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller pos.start = incremental ? lastBoundary + delta : pos.limit; 1372ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 1382ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 1392ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 1402ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller /** 1412ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * Registers standard variants with the system. Called by 1422ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * Transliterator during initialization. 1432ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller */ 1442ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller static void register() { 1452ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller // false means that it is invisible 1462ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller Transliterator trans = new BreakTransliterator("Any-BreakInternal", null); 1472ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller Transliterator.registerInstance(trans, false); 1482ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller /* 1492ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller Transliterator.registerFactory("Any-Break", new Transliterator.Factory() { 1502ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller public Transliterator getInstance(String ID) { 1512ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller return new BreakTransliterator("Any-Break", null); 1522ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 1532ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller }); 1542ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller */ 1552ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 1562ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 1572ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller // Hack, just to get a real character iterator. 1582ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller static final class ReplaceableCharacterIterator implements CharacterIterator 1592ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller { 1602ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller private Replaceable text; 1612ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller private int begin; 1622ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller private int end; 1632ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller // invariant: begin <= pos <= end 1642ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller private int pos; 1652ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 1662ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller /** 1672ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * Constructs an iterator with an initial index of 0. 1682ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller */ 1692ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller /*public ReplaceableCharacterIterator(Replaceable text) 1702ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller { 1712ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller this(text, 0); 1722ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller }*/ 1732ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 1742ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller /** 1752ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * Constructs an iterator with the specified initial index. 1762ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * 1772ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * @param text The String to be iterated over 1782ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * @param pos Initial iterator position 1792ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller */ 1802ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller /*public ReplaceableCharacterIterator(Replaceable text, int pos) 1812ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller { 1822ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller this(text, 0, text.length(), pos); 1832ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller }*/ 1842ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 1852ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller /** 1862ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * Constructs an iterator over the given range of the given string, with the 1872ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * index set at the specified position. 1882ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * 1892ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * @param text The String to be iterated over 1902ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * @param begin Index of the first character 1912ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * @param end Index of the character following the last character 1922ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * @param pos Initial iterator position 1932ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller */ 1942ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller public ReplaceableCharacterIterator(Replaceable text, int begin, int end, int pos) { 1952ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller if (text == null) { 1962ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller throw new NullPointerException(); 1972ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 1982ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller this.text = text; 1992ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 2002ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller if (begin < 0 || begin > end || end > text.length()) { 2012ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller throw new IllegalArgumentException("Invalid substring range"); 2022ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 2032ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 2042ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller if (pos < begin || pos > end) { 2052ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller throw new IllegalArgumentException("Invalid position"); 2062ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 2072ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 2082ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller this.begin = begin; 2092ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller this.end = end; 2102ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller this.pos = pos; 2112ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 2122ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 2132ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller /** 2142ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * Reset this iterator to point to a new string. This package-visible 2152ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * method is used by other java.text classes that want to avoid allocating 2162ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * new ReplaceableCharacterIterator objects every time their setText method 2172ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * is called. 2182ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * 2192ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * @param text The String to be iterated over 2202ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller */ 2212ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller public void setText(Replaceable text) { 2222ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller if (text == null) { 2232ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller throw new NullPointerException(); 2242ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 2252ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller this.text = text; 2262ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller this.begin = 0; 2272ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller this.end = text.length(); 2282ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller this.pos = 0; 2292ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 2302ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 2312ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller /** 2322ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * Implements CharacterIterator.first() for String. 2332ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * @see CharacterIterator#first 2342ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller */ 235f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Override 2362ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller public char first() 2372ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller { 2382ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller pos = begin; 2392ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller return current(); 2402ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 2412ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 2422ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller /** 2432ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * Implements CharacterIterator.last() for String. 2442ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * @see CharacterIterator#last 2452ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller */ 246f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Override 2472ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller public char last() 2482ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller { 2492ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller if (end != begin) { 2502ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller pos = end - 1; 2512ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } else { 2522ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller pos = end; 2532ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 2542ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller return current(); 2552ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 2562ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 2572ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller /** 2582ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * Implements CharacterIterator.setIndex() for String. 2592ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * @see CharacterIterator#setIndex 2602ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller */ 261f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Override 2622ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller public char setIndex(int p) 2632ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller { 2642ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller if (p < begin || p > end) { 2652ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller throw new IllegalArgumentException("Invalid index"); 2662ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 2672ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller pos = p; 2682ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller return current(); 2692ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 2702ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 2712ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller /** 2722ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * Implements CharacterIterator.current() for String. 2732ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * @see CharacterIterator#current 2742ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller */ 275f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Override 2762ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller public char current() 2772ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller { 2782ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller if (pos >= begin && pos < end) { 2792ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller return text.charAt(pos); 2802ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 2812ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller else { 2822ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller return DONE; 2832ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 2842ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 2852ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 2862ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller /** 2872ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * Implements CharacterIterator.next() for String. 2882ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * @see CharacterIterator#next 2892ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller */ 290f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Override 2912ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller public char next() 2922ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller { 2932ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller if (pos < end - 1) { 2942ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller pos++; 2952ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller return text.charAt(pos); 2962ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 2972ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller else { 2982ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller pos = end; 2992ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller return DONE; 3002ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 3012ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 3022ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 3032ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller /** 3042ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * Implements CharacterIterator.previous() for String. 3052ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * @see CharacterIterator#previous 3062ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller */ 307f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Override 3082ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller public char previous() 3092ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller { 3102ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller if (pos > begin) { 3112ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller pos--; 3122ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller return text.charAt(pos); 3132ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 3142ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller else { 3152ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller return DONE; 3162ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 3172ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 3182ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 3192ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller /** 3202ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * Implements CharacterIterator.getBeginIndex() for String. 3212ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * @see CharacterIterator#getBeginIndex 3222ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller */ 323f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Override 3242ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller public int getBeginIndex() 3252ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller { 3262ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller return begin; 3272ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 3282ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 3292ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller /** 3302ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * Implements CharacterIterator.getEndIndex() for String. 3312ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * @see CharacterIterator#getEndIndex 3322ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller */ 333f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Override 3342ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller public int getEndIndex() 3352ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller { 3362ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller return end; 3372ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 3382ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 3392ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller /** 3402ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * Implements CharacterIterator.getIndex() for String. 3412ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * @see CharacterIterator#getIndex 3422ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller */ 343f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Override 3442ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller public int getIndex() 3452ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller { 3462ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller return pos; 3472ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 3482ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 3492ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller /** 3502ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * Compares the equality of two ReplaceableCharacterIterator objects. 3512ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * @param obj the ReplaceableCharacterIterator object to be compared with. 3522ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * @return true if the given obj is the same as this 3532ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * ReplaceableCharacterIterator object; false otherwise. 3542ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller */ 355f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Override 3562ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller public boolean equals(Object obj) 3572ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller { 3582ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller if (this == obj) { 3592ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller return true; 3602ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 3612ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller if (!(obj instanceof ReplaceableCharacterIterator)) { 3622ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller return false; 3632ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 3642ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 3652ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller ReplaceableCharacterIterator that = (ReplaceableCharacterIterator) obj; 3662ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 3672ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller if (hashCode() != that.hashCode()) { 3682ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller return false; 3692ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 3702ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller if (!text.equals(that.text)) { 3712ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller return false; 3722ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 3732ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller if (pos != that.pos || begin != that.begin || end != that.end) { 3742ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller return false; 3752ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 3762ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller return true; 3772ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 3782ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 3792ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller /** 3802ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * Computes a hashcode for this iterator. 3812ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * @return A hash code 3822ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller */ 383f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Override 3842ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller public int hashCode() 3852ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller { 3862ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller return text.hashCode() ^ pos ^ begin ^ end; 3872ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 3882ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 3892ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller /** 3902ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * Creates a copy of this iterator. 3912ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * @return A copy of this 3922ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller */ 393f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Override 3942ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller public Object clone() 3952ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller { 3962ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller try { 3972ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller ReplaceableCharacterIterator other 3982ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller = (ReplaceableCharacterIterator) super.clone(); 3992ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller return other; 4002ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 4012ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller catch (CloneNotSupportedException e) { 4022ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller throw new ICUCloneNotSupportedException(); 4032ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 4042ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 4052ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 4062ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 4072ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller /* (non-Javadoc) 4081fba789ac68efdd9120a7373f49daef42833e674Neil Fuller * @see android.icu.text.Transliterator#addSourceTargetSet(android.icu.text.UnicodeSet, android.icu.text.UnicodeSet, android.icu.text.UnicodeSet) 4092ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller */ 4102ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller @Override 4112ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller public void addSourceTargetSet(UnicodeSet inputFilter, UnicodeSet sourceSet, UnicodeSet targetSet) { 4122ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller UnicodeSet myFilter = getFilterAsUnicodeSet(inputFilter); 4132ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller // Doesn't actually modify the source characters, so leave them alone. 4142ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller // add the characters inserted 4152ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller if (myFilter.size() != 0) { 4162ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller targetSet.addAll(insertion); 4172ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 4182ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller } 4192ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller 4202ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller} 421