1 | // © 2016 and later: Unicode, Inc. and others. |
2 | // License & terms of use: http://www.unicode.org/copyright.html |
3 | /* |
4 | ********************************************************************** |
5 | * Copyright (C) 1998-2005, International Business Machines |
6 | * Corporation and others. All Rights Reserved. |
7 | ********************************************************************** |
8 | */ |
9 | |
10 | #ifndef UCHRITER_H |
11 | #define UCHRITER_H |
12 | |
13 | #include "unicode/utypes.h" |
14 | |
15 | #if U_SHOW_CPLUSPLUS_API |
16 | |
17 | #include "unicode/chariter.h" |
18 | |
19 | /** |
20 | * \file |
21 | * \brief C++ API: char16_t Character Iterator |
22 | */ |
23 | |
24 | U_NAMESPACE_BEGIN |
25 | |
26 | /** |
27 | * A concrete subclass of CharacterIterator that iterates over the |
28 | * characters (code units or code points) in a char16_t array. |
29 | * It's possible not only to create an |
30 | * iterator that iterates over an entire char16_t array, but also to |
31 | * create one that iterates over only a subrange of a char16_t array |
32 | * (iterators over different subranges of the same char16_t array don't |
33 | * compare equal). |
34 | * @see CharacterIterator |
35 | * @see ForwardCharacterIterator |
36 | * @stable ICU 2.0 |
37 | */ |
38 | class U_COMMON_API UCharCharacterIterator : public CharacterIterator { |
39 | public: |
40 | /** |
41 | * Create an iterator over the char16_t array referred to by "textPtr". |
42 | * The iteration range is 0 to <code>length-1</code>. |
43 | * text is only aliased, not adopted (the |
44 | * destructor will not delete it). |
45 | * @param textPtr The char16_t array to be iterated over |
46 | * @param length The length of the char16_t array |
47 | * @stable ICU 2.0 |
48 | */ |
49 | UCharCharacterIterator(ConstChar16Ptr textPtr, int32_t length); |
50 | |
51 | /** |
52 | * Create an iterator over the char16_t array referred to by "textPtr". |
53 | * The iteration range is 0 to <code>length-1</code>. |
54 | * text is only aliased, not adopted (the |
55 | * destructor will not delete it). |
56 | * The starting |
57 | * position is specified by "position". If "position" is outside the valid |
58 | * iteration range, the behavior of this object is undefined. |
59 | * @param textPtr The char16_t array to be iterated over |
60 | * @param length The length of the char16_t array |
61 | * @param position The starting position of the iteration |
62 | * @stable ICU 2.0 |
63 | */ |
64 | UCharCharacterIterator(ConstChar16Ptr textPtr, int32_t length, |
65 | int32_t position); |
66 | |
67 | /** |
68 | * Create an iterator over the char16_t array referred to by "textPtr". |
69 | * The iteration range is 0 to <code>end-1</code>. |
70 | * text is only aliased, not adopted (the |
71 | * destructor will not delete it). |
72 | * The starting |
73 | * position is specified by "position". If begin and end do not |
74 | * form a valid iteration range or "position" is outside the valid |
75 | * iteration range, the behavior of this object is undefined. |
76 | * @param textPtr The char16_t array to be iterated over |
77 | * @param length The length of the char16_t array |
78 | * @param textBegin The begin position of the iteration range |
79 | * @param textEnd The end position of the iteration range |
80 | * @param position The starting position of the iteration |
81 | * @stable ICU 2.0 |
82 | */ |
83 | UCharCharacterIterator(ConstChar16Ptr textPtr, int32_t length, |
84 | int32_t textBegin, |
85 | int32_t textEnd, |
86 | int32_t position); |
87 | |
88 | /** |
89 | * Copy constructor. The new iterator iterates over the same range |
90 | * of the same string as "that", and its initial position is the |
91 | * same as "that"'s current position. |
92 | * @param that The UCharCharacterIterator to be copied |
93 | * @stable ICU 2.0 |
94 | */ |
95 | UCharCharacterIterator(const UCharCharacterIterator& that); |
96 | |
97 | /** |
98 | * Destructor. |
99 | * @stable ICU 2.0 |
100 | */ |
101 | virtual ~UCharCharacterIterator(); |
102 | |
103 | /** |
104 | * Assignment operator. *this is altered to iterate over the sane |
105 | * range of the same string as "that", and refers to the same |
106 | * character within that string as "that" does. |
107 | * @param that The object to be copied |
108 | * @return the newly created object |
109 | * @stable ICU 2.0 |
110 | */ |
111 | UCharCharacterIterator& |
112 | operator=(const UCharCharacterIterator& that); |
113 | |
114 | /** |
115 | * Returns true if the iterators iterate over the same range of the |
116 | * same string and are pointing at the same character. |
117 | * @param that The ForwardCharacterIterator used to be compared for equality |
118 | * @return true if the iterators iterate over the same range of the |
119 | * same string and are pointing at the same character. |
120 | * @stable ICU 2.0 |
121 | */ |
122 | virtual bool operator==(const ForwardCharacterIterator& that) const override; |
123 | |
124 | /** |
125 | * Generates a hash code for this iterator. |
126 | * @return the hash code. |
127 | * @stable ICU 2.0 |
128 | */ |
129 | virtual int32_t hashCode(void) const override; |
130 | |
131 | /** |
132 | * Returns a new UCharCharacterIterator referring to the same |
133 | * character in the same range of the same string as this one. The |
134 | * caller must delete the new iterator. |
135 | * @return the CharacterIterator newly created |
136 | * @stable ICU 2.0 |
137 | */ |
138 | virtual UCharCharacterIterator* clone() const override; |
139 | |
140 | /** |
141 | * Sets the iterator to refer to the first code unit in its |
142 | * iteration range, and returns that code unit. |
143 | * This can be used to begin an iteration with next(). |
144 | * @return the first code unit in its iteration range. |
145 | * @stable ICU 2.0 |
146 | */ |
147 | virtual char16_t first(void) override; |
148 | |
149 | /** |
150 | * Sets the iterator to refer to the first code unit in its |
151 | * iteration range, returns that code unit, and moves the position |
152 | * to the second code unit. This is an alternative to setToStart() |
153 | * for forward iteration with nextPostInc(). |
154 | * @return the first code unit in its iteration range |
155 | * @stable ICU 2.0 |
156 | */ |
157 | virtual char16_t firstPostInc(void) override; |
158 | |
159 | /** |
160 | * Sets the iterator to refer to the first code point in its |
161 | * iteration range, and returns that code unit, |
162 | * This can be used to begin an iteration with next32(). |
163 | * Note that an iteration with next32PostInc(), beginning with, |
164 | * e.g., setToStart() or firstPostInc(), is more efficient. |
165 | * @return the first code point in its iteration range |
166 | * @stable ICU 2.0 |
167 | */ |
168 | virtual UChar32 first32(void) override; |
169 | |
170 | /** |
171 | * Sets the iterator to refer to the first code point in its |
172 | * iteration range, returns that code point, and moves the position |
173 | * to the second code point. This is an alternative to setToStart() |
174 | * for forward iteration with next32PostInc(). |
175 | * @return the first code point in its iteration range. |
176 | * @stable ICU 2.0 |
177 | */ |
178 | virtual UChar32 first32PostInc(void) override; |
179 | |
180 | /** |
181 | * Sets the iterator to refer to the last code unit in its |
182 | * iteration range, and returns that code unit. |
183 | * This can be used to begin an iteration with previous(). |
184 | * @return the last code unit in its iteration range. |
185 | * @stable ICU 2.0 |
186 | */ |
187 | virtual char16_t last(void) override; |
188 | |
189 | /** |
190 | * Sets the iterator to refer to the last code point in its |
191 | * iteration range, and returns that code unit. |
192 | * This can be used to begin an iteration with previous32(). |
193 | * @return the last code point in its iteration range. |
194 | * @stable ICU 2.0 |
195 | */ |
196 | virtual UChar32 last32(void) override; |
197 | |
198 | /** |
199 | * Sets the iterator to refer to the "position"-th code unit |
200 | * in the text-storage object the iterator refers to, and |
201 | * returns that code unit. |
202 | * @param position the position within the text-storage object |
203 | * @return the code unit |
204 | * @stable ICU 2.0 |
205 | */ |
206 | virtual char16_t setIndex(int32_t position) override; |
207 | |
208 | /** |
209 | * Sets the iterator to refer to the beginning of the code point |
210 | * that contains the "position"-th code unit |
211 | * in the text-storage object the iterator refers to, and |
212 | * returns that code point. |
213 | * The current position is adjusted to the beginning of the code point |
214 | * (its first code unit). |
215 | * @param position the position within the text-storage object |
216 | * @return the code unit |
217 | * @stable ICU 2.0 |
218 | */ |
219 | virtual UChar32 setIndex32(int32_t position) override; |
220 | |
221 | /** |
222 | * Returns the code unit the iterator currently refers to. |
223 | * @return the code unit the iterator currently refers to. |
224 | * @stable ICU 2.0 |
225 | */ |
226 | virtual char16_t current(void) const override; |
227 | |
228 | /** |
229 | * Returns the code point the iterator currently refers to. |
230 | * @return the code point the iterator currently refers to. |
231 | * @stable ICU 2.0 |
232 | */ |
233 | virtual UChar32 current32(void) const override; |
234 | |
235 | /** |
236 | * Advances to the next code unit in the iteration range (toward |
237 | * endIndex()), and returns that code unit. If there are no more |
238 | * code units to return, returns DONE. |
239 | * @return the next code unit in the iteration range. |
240 | * @stable ICU 2.0 |
241 | */ |
242 | virtual char16_t next(void) override; |
243 | |
244 | /** |
245 | * Gets the current code unit for returning and advances to the next code unit |
246 | * in the iteration range |
247 | * (toward endIndex()). If there are |
248 | * no more code units to return, returns DONE. |
249 | * @return the current code unit. |
250 | * @stable ICU 2.0 |
251 | */ |
252 | virtual char16_t nextPostInc(void) override; |
253 | |
254 | /** |
255 | * Advances to the next code point in the iteration range (toward |
256 | * endIndex()), and returns that code point. If there are no more |
257 | * code points to return, returns DONE. |
258 | * Note that iteration with "pre-increment" semantics is less |
259 | * efficient than iteration with "post-increment" semantics |
260 | * that is provided by next32PostInc(). |
261 | * @return the next code point in the iteration range. |
262 | * @stable ICU 2.0 |
263 | */ |
264 | virtual UChar32 next32(void) override; |
265 | |
266 | /** |
267 | * Gets the current code point for returning and advances to the next code point |
268 | * in the iteration range |
269 | * (toward endIndex()). If there are |
270 | * no more code points to return, returns DONE. |
271 | * @return the current point. |
272 | * @stable ICU 2.0 |
273 | */ |
274 | virtual UChar32 next32PostInc(void) override; |
275 | |
276 | /** |
277 | * Returns false if there are no more code units or code points |
278 | * at or after the current position in the iteration range. |
279 | * This is used with nextPostInc() or next32PostInc() in forward |
280 | * iteration. |
281 | * @return false if there are no more code units or code points |
282 | * at or after the current position in the iteration range. |
283 | * @stable ICU 2.0 |
284 | */ |
285 | virtual UBool hasNext() override; |
286 | |
287 | /** |
288 | * Advances to the previous code unit in the iteration range (toward |
289 | * startIndex()), and returns that code unit. If there are no more |
290 | * code units to return, returns DONE. |
291 | * @return the previous code unit in the iteration range. |
292 | * @stable ICU 2.0 |
293 | */ |
294 | virtual char16_t previous(void) override; |
295 | |
296 | /** |
297 | * Advances to the previous code point in the iteration range (toward |
298 | * startIndex()), and returns that code point. If there are no more |
299 | * code points to return, returns DONE. |
300 | * @return the previous code point in the iteration range. |
301 | * @stable ICU 2.0 |
302 | */ |
303 | virtual UChar32 previous32(void) override; |
304 | |
305 | /** |
306 | * Returns false if there are no more code units or code points |
307 | * before the current position in the iteration range. |
308 | * This is used with previous() or previous32() in backward |
309 | * iteration. |
310 | * @return false if there are no more code units or code points |
311 | * before the current position in the iteration range. |
312 | * @stable ICU 2.0 |
313 | */ |
314 | virtual UBool hasPrevious() override; |
315 | |
316 | /** |
317 | * Moves the current position relative to the start or end of the |
318 | * iteration range, or relative to the current position itself. |
319 | * The movement is expressed in numbers of code units forward |
320 | * or backward by specifying a positive or negative delta. |
321 | * @param delta the position relative to origin. A positive delta means forward; |
322 | * a negative delta means backward. |
323 | * @param origin Origin enumeration {kStart, kCurrent, kEnd} |
324 | * @return the new position |
325 | * @stable ICU 2.0 |
326 | */ |
327 | virtual int32_t move(int32_t delta, EOrigin origin) override; |
328 | |
329 | /** |
330 | * Moves the current position relative to the start or end of the |
331 | * iteration range, or relative to the current position itself. |
332 | * The movement is expressed in numbers of code points forward |
333 | * or backward by specifying a positive or negative delta. |
334 | * @param delta the position relative to origin. A positive delta means forward; |
335 | * a negative delta means backward. |
336 | * @param origin Origin enumeration {kStart, kCurrent, kEnd} |
337 | * @return the new position |
338 | * @stable ICU 2.0 |
339 | */ |
340 | #ifdef move32 |
341 | // One of the system headers right now is sometimes defining a conflicting macro we don't use |
342 | #undef move32 |
343 | #endif |
344 | virtual int32_t move32(int32_t delta, EOrigin origin) override; |
345 | |
346 | /** |
347 | * Sets the iterator to iterate over a new range of text |
348 | * @stable ICU 2.0 |
349 | */ |
350 | void setText(ConstChar16Ptr newText, int32_t newTextLength); |
351 | |
352 | /** |
353 | * Copies the char16_t array under iteration into the UnicodeString |
354 | * referred to by "result". Even if this iterator iterates across |
355 | * only a part of this string, the whole string is copied. |
356 | * @param result Receives a copy of the text under iteration. |
357 | * @stable ICU 2.0 |
358 | */ |
359 | virtual void getText(UnicodeString& result) override; |
360 | |
361 | /** |
362 | * Return a class ID for this class (not really public) |
363 | * @return a class ID for this class |
364 | * @stable ICU 2.0 |
365 | */ |
366 | static UClassID U_EXPORT2 getStaticClassID(void); |
367 | |
368 | /** |
369 | * Return a class ID for this object (not really public) |
370 | * @return a class ID for this object. |
371 | * @stable ICU 2.0 |
372 | */ |
373 | virtual UClassID getDynamicClassID(void) const override; |
374 | |
375 | protected: |
376 | /** |
377 | * Protected constructor |
378 | * @stable ICU 2.0 |
379 | */ |
380 | UCharCharacterIterator(); |
381 | /** |
382 | * Protected member text |
383 | * @stable ICU 2.0 |
384 | */ |
385 | const char16_t* text; |
386 | |
387 | }; |
388 | |
389 | U_NAMESPACE_END |
390 | |
391 | #endif /* U_SHOW_CPLUSPLUS_API */ |
392 | |
393 | #endif |
394 | |