1 /* 2 * Copyright (c) 1996, 2002, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 /* 27 * (C) Copyright Taligent, Inc. 1996, 1997 - All Rights Reserved 28 * (C) Copyright IBM Corp. 1996 - 1998 - All Rights Reserved 29 * 30 * The original version of this source code and documentation 31 * is copyrighted and owned by Taligent, Inc., a wholly-owned 32 * subsidiary of IBM. These materials are provided under terms 33 * of a License Agreement between Taligent and Sun. This technology 34 * is protected by multiple US and International patents. 35 * 36 * This notice and attribution to Taligent may not be removed. 37 * Taligent is a registered trademark of Taligent, Inc. 38 * 39 */ 40 41 package java.text; 42 43 /** 44 * <code>StringCharacterIterator</code> implements the 45 * <code>CharacterIterator</code> protocol for a <code>String</code>. 46 * The <code>StringCharacterIterator</code> class iterates over the 47 * entire <code>String</code>. 48 * 49 * @see CharacterIterator 50 */ 51 52 public final class StringCharacterIterator implements CharacterIterator 53 { 54 private String text; 55 private int begin; 56 private int end; 57 // invariant: begin <= pos <= end 58 private int pos; 59 60 /** 61 * Constructs an iterator with an initial index of 0. 62 */ StringCharacterIterator(String text)63 public StringCharacterIterator(String text) 64 { 65 this(text, 0); 66 } 67 68 /** 69 * Constructs an iterator with the specified initial index. 70 * 71 * @param text The String to be iterated over 72 * @param pos Initial iterator position 73 */ StringCharacterIterator(String text, int pos)74 public StringCharacterIterator(String text, int pos) 75 { 76 this(text, 0, text.length(), pos); 77 } 78 79 /** 80 * Constructs an iterator over the given range of the given string, with the 81 * index set at the specified position. 82 * 83 * @param text The String to be iterated over 84 * @param begin Index of the first character 85 * @param end Index of the character following the last character 86 * @param pos Initial iterator position 87 */ StringCharacterIterator(String text, int begin, int end, int pos)88 public StringCharacterIterator(String text, int begin, int end, int pos) { 89 if (text == null) 90 throw new NullPointerException(); 91 this.text = text; 92 93 if (begin < 0 || begin > end || end > text.length()) 94 throw new IllegalArgumentException("Invalid substring range"); 95 96 if (pos < begin || pos > end) 97 throw new IllegalArgumentException("Invalid position"); 98 99 this.begin = begin; 100 this.end = end; 101 this.pos = pos; 102 } 103 104 /** 105 * Reset this iterator to point to a new string. This package-visible 106 * method is used by other java.text classes that want to avoid allocating 107 * new StringCharacterIterator objects every time their setText method 108 * is called. 109 * 110 * @param text The String to be iterated over 111 * @since 1.2 112 */ setText(String text)113 public void setText(String text) { 114 if (text == null) 115 throw new NullPointerException(); 116 this.text = text; 117 this.begin = 0; 118 this.end = text.length(); 119 this.pos = 0; 120 } 121 122 /** 123 * Implements CharacterIterator.first() for String. 124 * @see CharacterIterator#first 125 */ first()126 public char first() 127 { 128 pos = begin; 129 return current(); 130 } 131 132 /** 133 * Implements CharacterIterator.last() for String. 134 * @see CharacterIterator#last 135 */ last()136 public char last() 137 { 138 if (end != begin) { 139 pos = end - 1; 140 } else { 141 pos = end; 142 } 143 return current(); 144 } 145 146 /** 147 * Implements CharacterIterator.setIndex() for String. 148 * @see CharacterIterator#setIndex 149 */ setIndex(int p)150 public char setIndex(int p) 151 { 152 if (p < begin || p > end) 153 throw new IllegalArgumentException("Invalid index"); 154 pos = p; 155 return current(); 156 } 157 158 /** 159 * Implements CharacterIterator.current() for String. 160 * @see CharacterIterator#current 161 */ current()162 public char current() 163 { 164 if (pos >= begin && pos < end) { 165 return text.charAt(pos); 166 } 167 else { 168 return DONE; 169 } 170 } 171 172 /** 173 * Implements CharacterIterator.next() for String. 174 * @see CharacterIterator#next 175 */ next()176 public char next() 177 { 178 if (pos < end - 1) { 179 pos++; 180 return text.charAt(pos); 181 } 182 else { 183 pos = end; 184 return DONE; 185 } 186 } 187 188 /** 189 * Implements CharacterIterator.previous() for String. 190 * @see CharacterIterator#previous 191 */ previous()192 public char previous() 193 { 194 if (pos > begin) { 195 pos--; 196 return text.charAt(pos); 197 } 198 else { 199 return DONE; 200 } 201 } 202 203 /** 204 * Implements CharacterIterator.getBeginIndex() for String. 205 * @see CharacterIterator#getBeginIndex 206 */ getBeginIndex()207 public int getBeginIndex() 208 { 209 return begin; 210 } 211 212 /** 213 * Implements CharacterIterator.getEndIndex() for String. 214 * @see CharacterIterator#getEndIndex 215 */ getEndIndex()216 public int getEndIndex() 217 { 218 return end; 219 } 220 221 /** 222 * Implements CharacterIterator.getIndex() for String. 223 * @see CharacterIterator#getIndex 224 */ getIndex()225 public int getIndex() 226 { 227 return pos; 228 } 229 230 /** 231 * Compares the equality of two StringCharacterIterator objects. 232 * @param obj the StringCharacterIterator object to be compared with. 233 * @return true if the given obj is the same as this 234 * StringCharacterIterator object; false otherwise. 235 */ equals(Object obj)236 public boolean equals(Object obj) 237 { 238 if (this == obj) 239 return true; 240 if (!(obj instanceof StringCharacterIterator)) 241 return false; 242 243 StringCharacterIterator that = (StringCharacterIterator) obj; 244 245 if (hashCode() != that.hashCode()) 246 return false; 247 if (!text.equals(that.text)) 248 return false; 249 if (pos != that.pos || begin != that.begin || end != that.end) 250 return false; 251 return true; 252 } 253 254 /** 255 * Computes a hashcode for this iterator. 256 * @return A hash code 257 */ hashCode()258 public int hashCode() 259 { 260 return text.hashCode() ^ pos ^ begin ^ end; 261 } 262 263 /** 264 * Creates a copy of this iterator. 265 * @return A copy of this 266 */ clone()267 public Object clone() 268 { 269 try { 270 StringCharacterIterator other 271 = (StringCharacterIterator) super.clone(); 272 return other; 273 } 274 catch (CloneNotSupportedException e) { 275 throw new InternalError(); 276 } 277 } 278 279 } 280