| /* | 
 |  * 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(); | 
 |         } | 
 |     } | 
 |  | 
 | } |