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