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