• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* GENERATED SOURCE. DO NOT MODIFY. */
2 // © 2016 and later: Unicode, Inc. and others.
3 // License & terms of use: http://www.unicode.org/copyright.html#License
4 /*
5  *******************************************************************************
6  * Copyright (C) 1996-2015, International Business Machines Corporation and
7  * others. All Rights Reserved.
8  *******************************************************************************
9  */
10 package ohos.global.icu.impl;
11 
12 import ohos.global.icu.text.Replaceable;
13 import ohos.global.icu.text.ReplaceableString;
14 import ohos.global.icu.text.UCharacterIterator;
15 import ohos.global.icu.text.UTF16;
16 
17 /**
18  * DLF docs must define behavior when Replaceable is mutated underneath
19  * the iterator.
20  *
21  * This and ICUCharacterIterator share some code, maybe they should share
22  * an implementation, or the common state and implementation should be
23  * moved up into UCharacterIterator.
24  *
25  * What are first, last, and getBeginIndex doing here?!?!?!
26  * @hide exposed on OHOS
27  */
28 public class ReplaceableUCharacterIterator extends UCharacterIterator {
29 
30     // public constructor ------------------------------------------------------
31 
32     /**
33      * Public constructor
34      * @param replaceable text which the iterator will be based on
35      */
ReplaceableUCharacterIterator(Replaceable replaceable)36     public ReplaceableUCharacterIterator(Replaceable replaceable){
37         if(replaceable==null){
38             throw new IllegalArgumentException();
39         }
40         this.replaceable  = replaceable;
41         this.currentIndex = 0;
42     }
43 
44     /**
45      * Public constructor
46      * @param str text which the iterator will be based on
47      */
ReplaceableUCharacterIterator(String str)48     public ReplaceableUCharacterIterator(String str){
49         if(str==null){
50             throw new IllegalArgumentException();
51         }
52         this.replaceable  = new ReplaceableString(str);
53         this.currentIndex = 0;
54     }
55 
56     /**
57      * Public constructor
58      * @param buf buffer of text on which the iterator will be based
59      */
ReplaceableUCharacterIterator(StringBuffer buf)60     public ReplaceableUCharacterIterator(StringBuffer buf){
61         if(buf==null){
62             throw new IllegalArgumentException();
63         }
64         this.replaceable  = new ReplaceableString(buf);
65         this.currentIndex = 0;
66     }
67 
68     // public methods ----------------------------------------------------------
69 
70     /**
71      * Creates a copy of this iterator, does not clone the underlying
72      * <code>Replaceable</code>object
73      * @return copy of this iterator
74      */
75     @Override
clone()76     public Object clone(){
77         try {
78           return super.clone();
79         } catch (CloneNotSupportedException e) {
80             return null; // never invoked
81         }
82     }
83 
84     /**
85      * Returns the current UTF16 character.
86      * @return current UTF16 character
87      */
88     @Override
current()89     public int current(){
90         if (currentIndex < replaceable.length()) {
91             return replaceable.charAt(currentIndex);
92         }
93         return DONE;
94     }
95 
96     /**
97      * Returns the current codepoint
98      * @return current codepoint
99      */
100     @Override
currentCodePoint()101     public int currentCodePoint(){
102         // cannot use charAt due to it different
103         // behaviour when index is pointing at a
104         // trail surrogate, check for surrogates
105 
106         int ch = current();
107         if(UTF16.isLeadSurrogate((char)ch)){
108             // advance the index to get the next code point
109             next();
110             // due to post increment semantics current() after next()
111             // actually returns the next char which is what we want
112             int ch2 = current();
113             // current should never change the current index so back off
114             previous();
115 
116             if(UTF16.isTrailSurrogate((char)ch2)){
117                 // we found a surrogate pair
118                 return Character.toCodePoint((char)ch, (char)ch2);
119             }
120         }
121         return ch;
122     }
123 
124     /**
125      * Returns the length of the text
126      * @return length of the text
127      */
128     @Override
getLength()129     public int getLength(){
130         return replaceable.length();
131     }
132 
133     /**
134      * Gets the current currentIndex in text.
135      * @return current currentIndex in text.
136      */
137     @Override
getIndex()138     public int getIndex(){
139         return currentIndex;
140     }
141 
142     /**
143      * Returns next UTF16 character and increments the iterator's currentIndex by 1.
144      * If the resulting currentIndex is greater or equal to the text length, the
145      * currentIndex is reset to the text length and a value of DONECODEPOINT is
146      * returned.
147      * @return next UTF16 character in text or DONE if the new currentIndex is off the
148      *         end of the text range.
149      */
150     @Override
next()151     public int next(){
152         if (currentIndex < replaceable.length()) {
153             return replaceable.charAt(currentIndex++);
154         }
155         return DONE;
156     }
157 
158 
159     /**
160      * Returns previous UTF16 character and decrements the iterator's currentIndex by
161      * 1.
162      * If the resulting currentIndex is less than 0, the currentIndex is reset to 0 and a
163      * value of DONECODEPOINT is returned.
164      * @return next UTF16 character in text or DONE if the new currentIndex is off the
165      *         start of the text range.
166      */
167     @Override
previous()168     public int previous(){
169         if (currentIndex > 0) {
170             return replaceable.charAt(--currentIndex);
171         }
172         return DONE;
173     }
174 
175     /**
176      * <p>Sets the currentIndex to the specified currentIndex in the text and returns that
177      * single UTF16 character at currentIndex.
178      * This assumes the text is stored as 16-bit code units.</p>
179      * @param currentIndex the currentIndex within the text.
180      * @exception IllegalArgumentException is thrown if an invalid currentIndex is
181      *            supplied. i.e. currentIndex is out of bounds.
182      * @returns the character at the specified currentIndex or DONE if the specified
183      *         currentIndex is equal to the end of the text.
184      */
185     @Override
setIndex(int currentIndex)186     public void setIndex(int currentIndex) throws IndexOutOfBoundsException{
187         if (currentIndex < 0 || currentIndex > replaceable.length()) {
188             throw new IndexOutOfBoundsException();
189         }
190         this.currentIndex = currentIndex;
191     }
192 
193     @Override
getText(char[] fillIn, int offset)194     public int getText(char[] fillIn, int offset){
195         int length = replaceable.length();
196         if(offset < 0 || offset + length > fillIn.length){
197             throw new IndexOutOfBoundsException(Integer.toString(length));
198         }
199         replaceable.getChars(0,length,fillIn,offset);
200         return length;
201     }
202 
203     // private data members ----------------------------------------------------
204 
205     /**
206      * Replacable object
207      */
208     private Replaceable replaceable;
209     /**
210      * Current currentIndex
211      */
212     private int currentIndex;
213 
214 }
215