1f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License.  You may obtain a copy of the License at
8f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.text;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * An implementation of {@link CharacterIterator} for strings.
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic final class StringCharacterIterator implements CharacterIterator {
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    String string;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    int start, end, offset;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code StringCharacterIterator} on the specified string.
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The begin and current indices are set to the beginning of the string, the
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * end index is set to the length of the string.
33f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source string to iterate over.
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public StringCharacterIterator(String value) {
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        string = value;
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        start = offset = 0;
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        end = string.length();
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code StringCharacterIterator} on the specified string
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * with the current index set to the specified value. The begin index is set
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to the beginning of the string, the end index is set to the length of the
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * string.
48f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source string to iterate over.
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param location
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the current index.
539b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     * @throws IllegalArgumentException
549b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *            if {@code location} is negative or greater than the length
559b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *            of the source string.
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public StringCharacterIterator(String value, int location) {
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        string = value;
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        start = 0;
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        end = string.length();
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (location < 0 || location > end) {
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException();
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        offset = location;
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code StringCharacterIterator} on the specified string
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * with the begin, end and current index set to the specified values.
70f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source string to iterate over.
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param start
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the index of the first character to iterate.
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param end
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the index one past the last character to iterate.
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param location
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the current index.
799b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     * @throws IllegalArgumentException
809b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *            if {@code start < 0}, {@code start > end}, {@code location <
819b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *            start}, {@code location > end} or if {@code end} is greater
829b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *            than the length of {@code value}.
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
84fe711d61cafbb878d1d6a5e223fcd2201f2e829aElliott Hughes    public StringCharacterIterator(String value, int start, int end, int location) {
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        string = value;
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (start < 0 || end > string.length() || start > end
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                || location < start || location > end) {
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException();
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.start = start;
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.end = end;
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        offset = location;
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a new {@code StringCharacterIterator} with the same source
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * string, begin, end, and current index as this iterator.
98f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a shallow copy of this iterator.
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see java.lang.Cloneable
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object clone() {
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return super.clone();
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (CloneNotSupportedException e) {
107fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes            throw new AssertionError(e);
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the character at the current index in the source string.
113f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the current character, or {@code DONE} if the current index is
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         past the end.
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public char current() {
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (offset == end) {
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return DONE;
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return string.charAt(offset);
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares the specified object with this {@code StringCharacterIterator}
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and indicates if they are equal. In order to be equal, {@code object}
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * must be an instance of {@code StringCharacterIterator} that iterates over
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the same sequence of characters with the same index.
129f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to compare with this object.
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the specified object is equal to this
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code StringCharacterIterator}; {@code false} otherwise.
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #hashCode
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean equals(Object object) {
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!(object instanceof StringCharacterIterator)) {
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        StringCharacterIterator it = (StringCharacterIterator) object;
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return string.equals(it.string) && start == it.start && end == it.end
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                && offset == it.offset;
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the current position to the begin index and returns the character at
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the new position in the source string.
149f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the character at the begin index or {@code DONE} if the begin
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         index is equal to the end index.
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public char first() {
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (start == end) {
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return DONE;
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        offset = start;
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return string.charAt(offset);
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the begin index in the source string.
163f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the index of the first character of the iteration.
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getBeginIndex() {
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return start;
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the end index in the source string.
172f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the index one past the last character of the iteration.
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getEndIndex() {
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return end;
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the current index in the source string.
181f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the current index.
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getIndex() {
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return offset;
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int hashCode() {
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return string.hashCode() + start + end + offset;
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the current position to the end index - 1 and returns the character
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * at the new position.
196f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the character before the end index or {@code DONE} if the begin
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         index is equal to the end index.
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2009b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson    public char last() {
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (start == end) {
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return DONE;
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        offset = end - 1;
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return string.charAt(offset);
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
2089b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson    /**
2099b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     * Increments the current index and returns the character at the new index.
2109b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
2119b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     * @return the character at the next index, or {@code DONE} if the next
2129b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *         index would be past the end.
2139b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     */
2149b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson    public char next() {
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (offset >= (end - 1)) {
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            offset = end;
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return DONE;
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return string.charAt(++offset);
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
2229b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson    /**
2239b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     * Decrements the current index and returns the character at the new index.
224f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
2259b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     * @return the character at the previous index, or {@code DONE} if the
2269b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *         previous index would be past the beginning.
2279b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     */
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public char previous() {
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (offset == start) {
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return DONE;
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return string.charAt(--offset);
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the current index in the source string.
237f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param location
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the index the current position is set to.
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the character at the new index, or {@code DONE} if
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code location} is set to the end index.
2429b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     * @throws IllegalArgumentException
2439b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *            if {@code location} is smaller than the begin index or greater
2449b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *            than the end index.
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public char setIndex(int location) {
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (location < start || location > end) {
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException();
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        offset = location;
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (offset == end) {
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return DONE;
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return string.charAt(offset);
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the source string to iterate over. The begin and end positions are
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * set to the start and end of this string.
260f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the new source string.
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setText(String value) {
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        string = value;
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        start = offset = 0;
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        end = value.length();
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
270