1/* 2 * Copyright (c) 1999, 2017, 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 26package java.awt.font; 27 28import java.text.CharacterIterator; 29 30class CharArrayIterator implements CharacterIterator { 31 32 private char[] chars; 33 private int pos; 34 private int begin; 35 36 CharArrayIterator(char[] chars) { 37 38 reset(chars, 0); 39 } 40 41 CharArrayIterator(char[] chars, int begin) { 42 43 reset(chars, begin); 44 } 45 46 /** 47 * Sets the position to getBeginIndex() and returns the character at that 48 * position. 49 * @return the first character in the text, or DONE if the text is empty 50 * @see #getBeginIndex 51 */ 52 public char first() { 53 54 pos = 0; 55 return current(); 56 } 57 58 /** 59 * Sets the position to getEndIndex()-1 (getEndIndex() if the text is empty) 60 * and returns the character at that position. 61 * @return the last character in the text, or DONE if the text is empty 62 * @see #getEndIndex 63 */ 64 public char last() { 65 66 if (chars.length > 0) { 67 pos = chars.length-1; 68 } 69 else { 70 pos = 0; 71 } 72 return current(); 73 } 74 75 /** 76 * Gets the character at the current position (as returned by getIndex()). 77 * @return the character at the current position or DONE if the current 78 * position is off the end of the text. 79 * @see #getIndex 80 */ 81 public char current() { 82 83 if (pos >= 0 && pos < chars.length) { 84 return chars[pos]; 85 } 86 else { 87 return DONE; 88 } 89 } 90 91 /** 92 * Increments the iterator's index by one and returns the character 93 * at the new index. If the resulting index is greater or equal 94 * to getEndIndex(), the current index is reset to getEndIndex() and 95 * a value of DONE is returned. 96 * @return the character at the new position or DONE if the new 97 * position is off the end of the text range. 98 */ 99 public char next() { 100 101 if (pos < chars.length-1) { 102 pos++; 103 return chars[pos]; 104 } 105 else { 106 pos = chars.length; 107 return DONE; 108 } 109 } 110 111 /** 112 * Decrements the iterator's index by one and returns the character 113 * at the new index. If the current index is getBeginIndex(), the index 114 * remains at getBeginIndex() and a value of DONE is returned. 115 * @return the character at the new position or DONE if the current 116 * position is equal to getBeginIndex(). 117 */ 118 public char previous() { 119 120 if (pos > 0) { 121 pos--; 122 return chars[pos]; 123 } 124 else { 125 pos = 0; 126 return DONE; 127 } 128 } 129 130 /** 131 * Sets the position to the specified position in the text and returns that 132 * character. 133 * @param position the position within the text. Valid values range from 134 * getBeginIndex() to getEndIndex(). An IllegalArgumentException is thrown 135 * if an invalid value is supplied. 136 * @return the character at the specified position or DONE if the specified position is equal to getEndIndex() 137 */ 138 public char setIndex(int position) { 139 140 position -= begin; 141 if (position < 0 || position > chars.length) { 142 throw new IllegalArgumentException("Invalid index"); 143 } 144 pos = position; 145 return current(); 146 } 147 148 /** 149 * Returns the start index of the text. 150 * @return the index at which the text begins. 151 */ 152 public int getBeginIndex() { 153 return begin; 154 } 155 156 /** 157 * Returns the end index of the text. This index is the index of the first 158 * character following the end of the text. 159 * @return the index after the last character in the text 160 */ 161 public int getEndIndex() { 162 return begin+chars.length; 163 } 164 165 /** 166 * Returns the current index. 167 * @return the current index. 168 */ 169 public int getIndex() { 170 return begin+pos; 171 } 172 173 /** 174 * Create a copy of this iterator 175 * @return A copy of this 176 */ 177 public Object clone() { 178 CharArrayIterator c = new CharArrayIterator(chars, begin); 179 c.pos = this.pos; 180 return c; 181 } 182 183 void reset(char[] chars) { 184 reset(chars, 0); 185 } 186 187 void reset(char[] chars, int begin) { 188 189 this.chars = chars; 190 this.begin = begin; 191 pos = 0; 192 } 193} 194