| /* StringCharacterIterator.java -- Iterate over a character range in a string | |
| Copyright (C) 1998, 1999, 2001, 2005 Free Software Foundation, Inc. | |
| This file is part of GNU Classpath. | |
| GNU Classpath is free software; you can redistribute it and/or modify | |
| it under the terms of the GNU General Public License as published by | |
| the Free Software Foundation; either version 2, or (at your option) | |
| any later version. | |
| GNU Classpath is distributed in the hope that it will be useful, but | |
| WITHOUT ANY WARRANTY; without even the implied warranty of | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| General Public License for more details. | |
| You should have received a copy of the GNU General Public License | |
| along with GNU Classpath; see the file COPYING. If not, write to the | |
| Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | |
| 02110-1301 USA. | |
| Linking this library statically or dynamically with other modules is | |
| making a combined work based on this library. Thus, the terms and | |
| conditions of the GNU General Public License cover the whole | |
| combination. | |
| As a special exception, the copyright holders of this library give you | |
| permission to link this library with independent modules to produce an | |
| executable, regardless of the license terms of these independent | |
| modules, and to copy and distribute the resulting executable under | |
| terms of your choice, provided that you also meet, for each linked | |
| independent module, the terms and conditions of the license of that | |
| module. An independent module is a module which is not derived from | |
| or based on this library. If you modify this library, you may extend | |
| this exception to your version of the library, but you are not | |
| obligated to do so. If you do not wish to do so, delete this | |
| exception statement from your version. */ | |
| package java.text; | |
| /** | |
| * This class iterates over a range of characters in a <code>String</code>. | |
| * For a given range of text, a beginning and ending index, | |
| * as well as a current index are defined. These values can be queried | |
| * by the methods in this interface. Additionally, various methods allow | |
| * the index to be set. | |
| * | |
| * @author Aaron M. Renn (arenn@urbanophile.com) | |
| * @author Tom Tromey (tromey@cygnus.com) | |
| */ | |
| public final class StringCharacterIterator implements CharacterIterator | |
| { | |
| /** | |
| * This is the string to iterate over | |
| */ | |
| private String text; | |
| /** | |
| * This is the value of the start position of the text range. | |
| */ | |
| private int begin; | |
| /** | |
| * This is the value of the ending position of the text range. | |
| */ | |
| private int end; | |
| /** | |
| * This is the current value of the scan index. | |
| */ | |
| private int index; | |
| /** | |
| * This method initializes a new instance of | |
| * <code>StringCharacterIterator</code> to iterate over the entire | |
| * text of the specified <code>String</code>. The initial index | |
| * value will be set to the first character in the string. | |
| * | |
| * @param text The <code>String</code> to iterate through (<code>null</code> | |
| * not permitted). | |
| * | |
| * @throws NullPointerException if <code>text</code> is <code>null</code>. | |
| */ | |
| public StringCharacterIterator (String text) | |
| { | |
| this (text, 0, text.length (), 0); | |
| } | |
| /*************************************************************************/ | |
| /** | |
| * This method initializes a new instance of | |
| * <code>StringCharacterIterator</code> to iterate over the entire | |
| * text of the specified <code>String</code>. The initial index | |
| * value will be set to the specified value. | |
| * | |
| * @param text The <code>String</code> to iterate through. | |
| * @param index The initial index position. | |
| */ | |
| public StringCharacterIterator (String text, int index) | |
| { | |
| this (text, 0, text.length (), index); | |
| } | |
| /*************************************************************************/ | |
| /** | |
| * This method initializes a new instance of | |
| * <code>StringCharacterIterator</code> that iterates over the text | |
| * in a subrange of the specified <code>String</code>. The | |
| * beginning and end of the range are specified by the caller, as is | |
| * the initial index position. | |
| * | |
| * @param text The <code>String</code> to iterate through. | |
| * @param begin The beginning position in the character range. | |
| * @param end The ending position in the character range. | |
| * @param index The initial index position. | |
| * | |
| * @throws IllegalArgumentException If any of the range values are | |
| * invalid. | |
| */ | |
| public StringCharacterIterator (String text, int begin, int end, int index) | |
| { | |
| int len = text.length (); | |
| if ((begin < 0) || (begin > len)) | |
| throw new IllegalArgumentException ("Bad begin position"); | |
| if ((end < begin) || (end > len)) | |
| throw new IllegalArgumentException ("Bad end position"); | |
| if ((index < begin) || (index > end)) | |
| throw new IllegalArgumentException ("Bad initial index position"); | |
| this.text = text; | |
| this.begin = begin; | |
| this.end = end; | |
| this.index = index; | |
| } | |
| /** | |
| * This is a package level constructor that copies the text out of | |
| * an existing StringCharacterIterator and resets the beginning and | |
| * ending index. | |
| * | |
| * @param sci The StringCharacterIterator to copy the info from | |
| * @param begin The beginning index of the range we are interested in. | |
| * @param end The ending index of the range we are interested in. | |
| */ | |
| StringCharacterIterator (StringCharacterIterator sci, int begin, int end) | |
| { | |
| this (sci.text, begin, end, begin); | |
| } | |
| /** | |
| * This method returns the character at the current index position | |
| * | |
| * @return The character at the current index position. | |
| */ | |
| public char current () | |
| { | |
| return (index < end) ? text.charAt (index) : DONE; | |
| } | |
| /*************************************************************************/ | |
| /** | |
| * This method increments the current index and then returns the | |
| * character at the new index value. If the index is already at | |
| * <code>getEndIndex () - 1</code>, it will not be incremented. | |
| * | |
| * @return The character at the position of the incremented index | |
| * value, or <code>DONE</code> if the index has reached | |
| * getEndIndex () - 1. | |
| */ | |
| public char next () | |
| { | |
| if (index == end) | |
| return DONE; | |
| ++index; | |
| return current (); | |
| } | |
| /*************************************************************************/ | |
| /** | |
| * This method decrements the current index and then returns the | |
| * character at the new index value. If the index value is already | |
| * at the beginning index, it will not be decremented. | |
| * | |
| * @return The character at the position of the decremented index | |
| * value, or <code>DONE</code> if index was already equal to the | |
| * beginning index value. | |
| */ | |
| public char previous () | |
| { | |
| if (index == begin) | |
| return DONE; | |
| --index; | |
| return current (); | |
| } | |
| /*************************************************************************/ | |
| /** | |
| * This method sets the index value to the beginning of the range and returns | |
| * the character there. | |
| * | |
| * @return The character at the beginning of the range, or | |
| * <code>DONE</code> if the range is empty. | |
| */ | |
| public char first () | |
| { | |
| index = begin; | |
| return current (); | |
| } | |
| /*************************************************************************/ | |
| /** | |
| * This method sets the index value to <code>getEndIndex () - 1</code> and | |
| * returns the character there. If the range is empty, then the index value | |
| * will be set equal to the beginning index. | |
| * | |
| * @return The character at the end of the range, or | |
| * <code>DONE</code> if the range is empty. | |
| */ | |
| public char last () | |
| { | |
| if (end == begin) | |
| return DONE; | |
| index = end - 1; | |
| return current (); | |
| } | |
| /*************************************************************************/ | |
| /** | |
| * This method returns the current value of the index. | |
| * | |
| * @return The current index value | |
| */ | |
| public int getIndex () | |
| { | |
| return index; | |
| } | |
| /*************************************************************************/ | |
| /** | |
| * This method sets the value of the index to the specified value, then | |
| * returns the character at that position. | |
| * | |
| * @param index The new index value. | |
| * | |
| * @return The character at the new index value or <code>DONE</code> | |
| * if the index value is equal to <code>getEndIndex</code>. | |
| * | |
| * @exception IllegalArgumentException If the specified index is not valid | |
| */ | |
| public char setIndex (int index) | |
| { | |
| if ((index < begin) || (index > end)) | |
| throw new IllegalArgumentException ("Bad index specified"); | |
| this.index = index; | |
| return current (); | |
| } | |
| /*************************************************************************/ | |
| /** | |
| * This method returns the character position of the first character in the | |
| * range. | |
| * | |
| * @return The index of the first character in the range. | |
| */ | |
| public int getBeginIndex () | |
| { | |
| return begin; | |
| } | |
| /*************************************************************************/ | |
| /** | |
| * This method returns the character position of the end of the text range. | |
| * This will actually be the index of the first character following the | |
| * end of the range. In the event the text range is empty, this will be | |
| * equal to the first character in the range. | |
| * | |
| * @return The index of the end of the range. | |
| */ | |
| public int getEndIndex () | |
| { | |
| return end; | |
| } | |
| /*************************************************************************/ | |
| /** | |
| * This method creates a copy of this <code>CharacterIterator</code>. | |
| * | |
| * @return A copy of this <code>CharacterIterator</code>. | |
| */ | |
| public Object clone () | |
| { | |
| return new StringCharacterIterator (text, begin, end, index); | |
| } | |
| /*************************************************************************/ | |
| /** | |
| * This method tests this object for equality againt the specified | |
| * object. This will be true if and only if the specified object: | |
| * <p> | |
| * <ul> | |
| * <li>is not <code>null</code>.</li> | |
| * <li>is an instance of <code>StringCharacterIterator</code></li> | |
| * <li>has the same text as this object</li> | |
| * <li>has the same beginning, ending, and current index as this object.</li> | |
| * </ul> | |
| * | |
| * @param obj The object to test for equality against. | |
| * | |
| * @return <code>true</code> if the specified object is equal to this | |
| * object, <code>false</code> otherwise. | |
| */ | |
| public boolean equals (Object obj) | |
| { | |
| if (! (obj instanceof StringCharacterIterator)) | |
| return false; | |
| StringCharacterIterator sci = (StringCharacterIterator) obj; | |
| return (begin == sci.begin | |
| && end == sci.end | |
| && index == sci.index | |
| && text.equals (sci.text)); | |
| } | |
| /** | |
| * Return the hash code for this object. | |
| * @return the hash code | |
| */ | |
| public int hashCode() | |
| { | |
| // Incorporate all the data in a goofy way. | |
| return begin ^ end ^ index ^ text.hashCode(); | |
| } | |
| /*************************************************************************/ | |
| /** | |
| * This method allows other classes in java.text to change the value | |
| * of the underlying text being iterated through. | |
| * | |
| * @param text The new <code>String</code> to iterate through. | |
| */ | |
| public void setText (String text) | |
| { | |
| this.text = text; | |
| this.begin = 0; | |
| this.end = text.length (); | |
| this.index = 0; | |
| } | |
| } |