001: /*
002: * Portions Copyright 2005 Sun Microsystems, Inc. All Rights Reserved.
003: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004: *
005: * This code is free software; you can redistribute it and/or modify it
006: * under the terms of the GNU General Public License version 2 only, as
007: * published by the Free Software Foundation. Sun designates this
008: * particular file as subject to the "Classpath" exception as provided
009: * by Sun in the LICENSE file that accompanied this code.
010: *
011: * This code is distributed in the hope that it will be useful, but WITHOUT
012: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
013: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
014: * version 2 for more details (a copy is included in the LICENSE file that
015: * accompanied this code).
016: *
017: * You should have received a copy of the GNU General Public License version
018: * 2 along with this work; if not, write to the Free Software Foundation,
019: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
020: *
021: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
022: * CA 95054 USA or visit www.sun.com if you need additional information or
023: * have any questions.
024: */
025:
026: /*
027: *******************************************************************************
028: * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved *
029: * *
030: * The original version of this source code and documentation is copyrighted *
031: * and owned by IBM, These materials are provided under terms of a License *
032: * Agreement between IBM and Sun. This technology is protected by multiple *
033: * US and International patents. This notice and attribution to IBM may not *
034: * to removed. *
035: *******************************************************************************
036: */
037:
038: package sun.text.normalizer;
039:
040: /**
041: * DLF docs must define behavior when Replaceable is mutated underneath
042: * the iterator.
043: *
044: * This and ICUCharacterIterator share some code, maybe they should share
045: * an implementation, or the common state and implementation should be
046: * moved up into UCharacterIterator.
047: *
048: * What are first, last, and getBeginIndex doing here?!?!?!
049: */
050: public class ReplaceableUCharacterIterator extends UCharacterIterator {
051:
052: // public constructor ------------------------------------------------------
053:
054: /**
055: * Public constructor
056: * @param str text which the iterator will be based on
057: */
058: public ReplaceableUCharacterIterator(String str) {
059: if (str == null) {
060: throw new IllegalArgumentException();
061: }
062: this .replaceable = new ReplaceableString(str);
063: this .currentIndex = 0;
064: }
065:
066: //// for StringPrep
067: /**
068: * Public constructor
069: * @param buf buffer of text on which the iterator will be based
070: */
071: public ReplaceableUCharacterIterator(StringBuffer buf) {
072: if (buf == null) {
073: throw new IllegalArgumentException();
074: }
075: this .replaceable = new ReplaceableString(buf);
076: this .currentIndex = 0;
077: }
078:
079: // public methods ----------------------------------------------------------
080:
081: /**
082: * Creates a copy of this iterator, does not clone the underlying
083: * <code>Replaceable</code>object
084: * @return copy of this iterator
085: */
086: public Object clone() {
087: try {
088: return super .clone();
089: } catch (CloneNotSupportedException e) {
090: return null; // never invoked
091: }
092: }
093:
094: /**
095: * Returns the current UTF16 character.
096: * @return current UTF16 character
097: */
098: public int current() {
099: if (currentIndex < replaceable.length()) {
100: return replaceable.charAt(currentIndex);
101: }
102: return DONE;
103: }
104:
105: /**
106: * Returns the length of the text
107: * @return length of the text
108: */
109: public int getLength() {
110: return replaceable.length();
111: }
112:
113: /**
114: * Gets the current currentIndex in text.
115: * @return current currentIndex in text.
116: */
117: public int getIndex() {
118: return currentIndex;
119: }
120:
121: /**
122: * Returns next UTF16 character and increments the iterator's currentIndex by 1.
123: * If the resulting currentIndex is greater or equal to the text length, the
124: * currentIndex is reset to the text length and a value of DONECODEPOINT is
125: * returned.
126: * @return next UTF16 character in text or DONE if the new currentIndex is off the
127: * end of the text range.
128: */
129: public int next() {
130: if (currentIndex < replaceable.length()) {
131: return replaceable.charAt(currentIndex++);
132: }
133: return DONE;
134: }
135:
136: /**
137: * Returns previous UTF16 character and decrements the iterator's currentIndex by
138: * 1.
139: * If the resulting currentIndex is less than 0, the currentIndex is reset to 0 and a
140: * value of DONECODEPOINT is returned.
141: * @return next UTF16 character in text or DONE if the new currentIndex is off the
142: * start of the text range.
143: */
144: public int previous() {
145: if (currentIndex > 0) {
146: return replaceable.charAt(--currentIndex);
147: }
148: return DONE;
149: }
150:
151: /**
152: * <p>Sets the currentIndex to the specified currentIndex in the text and returns that
153: * single UTF16 character at currentIndex.
154: * This assumes the text is stored as 16-bit code units.</p>
155: * @param currentIndex the currentIndex within the text.
156: * @exception IllegalArgumentException is thrown if an invalid currentIndex is
157: * supplied. i.e. currentIndex is out of bounds.
158: * @return the character at the specified currentIndex or DONE if the specified
159: * currentIndex is equal to the end of the text.
160: */
161: public void setIndex(int currentIndex) {
162: if (currentIndex < 0 || currentIndex > replaceable.length()) {
163: throw new IllegalArgumentException();
164: }
165: this .currentIndex = currentIndex;
166: }
167:
168: //// for StringPrep
169: public int getText(char[] fillIn, int offset) {
170: int length = replaceable.length();
171: if (offset < 0 || offset + length > fillIn.length) {
172: throw new IndexOutOfBoundsException(Integer
173: .toString(length));
174: }
175: replaceable.getChars(0, length, fillIn, offset);
176: return length;
177: }
178:
179: // private data members ----------------------------------------------------
180:
181: /**
182: * Replacable object
183: */
184: private Replaceable replaceable;
185: /**
186: * Current currentIndex
187: */
188: private int currentIndex;
189:
190: }
|