/* * Copyright (c) 1996, 2002, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code 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 * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /* * (C) Copyright Taligent, Inc. 1996, 1997 - All Rights Reserved * (C) Copyright IBM Corp. 1996 - 1998 - All Rights Reserved * * The original version of this source code and documentation * is copyrighted and owned by Taligent, Inc., a wholly-owned * subsidiary of IBM. These materials are provided under terms * of a License Agreement between Taligent and Sun. This technology * is protected by multiple US and International patents. * * This notice and attribution to Taligent may not be removed. * Taligent is a registered trademark of Taligent, Inc. * */ package java.text; /** * <code>StringCharacterIterator</code> implements the * <code>CharacterIterator</code> protocol for a <code>String</code>. * The <code>StringCharacterIterator</code> class iterates over the * entire <code>String</code>. * * @see CharacterIterator */ public final class StringCharacterIterator implements CharacterIterator { private String text; private int begin; private int end; // invariant: begin <= pos <= end private int pos; /** * Constructs an iterator with an initial index of 0. */ public StringCharacterIterator(String text) { this(text, 0); } /** * Constructs an iterator with the specified initial index. * * @param text The String to be iterated over * @param pos Initial iterator position */ public StringCharacterIterator(String text, int pos) { this(text, 0, text.length(), pos); } /** * Constructs an iterator over the given range of the given string, with the * index set at the specified position. * * @param text The String to be iterated over * @param begin Index of the first character * @param end Index of the character following the last character * @param pos Initial iterator position */ public StringCharacterIterator(String text, int begin, int end, int pos) { if (text == null) throw new NullPointerException(); this.text = text; if (begin < 0 || begin > end || end > text.length()) throw new IllegalArgumentException("Invalid substring range"); if (pos < begin || pos > end) throw new IllegalArgumentException("Invalid position"); this.begin = begin; this.end = end; this.pos = pos; } /** * Reset this iterator to point to a new string. This package-visible * method is used by other java.text classes that want to avoid allocating * new StringCharacterIterator objects every time their setText method * is called. * * @param text The String to be iterated over * @since 1.2 */ public void setText(String text) { if (text == null) throw new NullPointerException(); this.text = text; this.begin = 0; this.end = text.length(); this.pos = 0; } /** * Implements CharacterIterator.first() for String. * @see CharacterIterator#first */ public char first() { pos = begin; return current(); } /** * Implements CharacterIterator.last() for String. * @see CharacterIterator#last */ public char last() { if (end != begin) { pos = end - 1; } else { pos = end; } return current(); } /** * Implements CharacterIterator.setIndex() for String. * @see CharacterIterator#setIndex */ public char setIndex(int p) { if (p < begin || p > end) throw new IllegalArgumentException("Invalid index"); pos = p; return current(); } /** * Implements CharacterIterator.current() for String. * @see CharacterIterator#current */ public char current() { if (pos >= begin && pos < end) { return text.charAt(pos); } else { return DONE; } } /** * Implements CharacterIterator.next() for String. * @see CharacterIterator#next */ public char next() { if (pos < end - 1) { pos++; return text.charAt(pos); } else { pos = end; return DONE; } } /** * Implements CharacterIterator.previous() for String. * @see CharacterIterator#previous */ public char previous() { if (pos > begin) { pos--; return text.charAt(pos); } else { return DONE; } } /** * Implements CharacterIterator.getBeginIndex() for String. * @see CharacterIterator#getBeginIndex */ public int getBeginIndex() { return begin; } /** * Implements CharacterIterator.getEndIndex() for String. * @see CharacterIterator#getEndIndex */ public int getEndIndex() { return end; } /** * Implements CharacterIterator.getIndex() for String. * @see CharacterIterator#getIndex */ public int getIndex() { return pos; } /** * Compares the equality of two StringCharacterIterator objects. * @param obj the StringCharacterIterator object to be compared with. * @return true if the given obj is the same as this * StringCharacterIterator object; false otherwise. */ public boolean equals(Object obj) { if (this == obj) return true; if (!(obj instanceof StringCharacterIterator)) return false; StringCharacterIterator that = (StringCharacterIterator) obj; if (hashCode() != that.hashCode()) return false; if (!text.equals(that.text)) return false; if (pos != that.pos || begin != that.begin || end != that.end) return false; return true; } /** * Computes a hashcode for this iterator. * @return A hash code */ public int hashCode() { return text.hashCode() ^ pos ^ begin ^ end; } /** * Creates a copy of this iterator. * @return A copy of this */ public Object clone() { try { StringCharacterIterator other = (StringCharacterIterator) super.clone(); return other; } catch (CloneNotSupportedException e) { throw new InternalError(); } } }