1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*******************************************************************************
3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*   Copyright (C) 2002-2006,2009 International Business Machines
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   Corporation and others.  All Rights Reserved.
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*******************************************************************************
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   file name:  uiter.h
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   encoding:   US-ASCII
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   tab size:   8 (not used)
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   indentation:4
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   created on: 2002jan18
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   created by: Markus W. Scherer
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifndef __UITER_H__
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define __UITER_H__
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * \file
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * \brief C API: Unicode Character Iteration
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCharIterator
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if U_SHOW_CPLUSPLUS_API
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    U_NAMESPACE_BEGIN
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    class CharacterIterator;
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    class Replaceable;
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    U_NAMESPACE_END
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_BEGIN
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustruct UCharIterator;
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef struct UCharIterator UCharIterator; /**< C typedef for struct UCharIterator. @stable ICU 2.1 */
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Origin constants for UCharIterator.getIndex() and UCharIterator.move().
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCharIteratorMove
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCharIterator
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @stable ICU 2.1
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef enum UCharIteratorOrigin {
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UITER_START, UITER_CURRENT, UITER_LIMIT, UITER_ZERO, UITER_LENGTH
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} UCharIteratorOrigin;
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** Constants for UCharIterator. @stable ICU 2.6 */
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruenum {
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Constant value that may be returned by UCharIteratorMove
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * indicating that the final UTF-16 index is not known, but that the move succeeded.
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * This can occur when moving relative to limit or length, or
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * when moving relative to the current index after a setState()
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * when the current UTF-16 index is not known.
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * It would be very inefficient to have to count from the beginning of the text
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * just to get the current/limit/length index after moving relative to it.
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * The actual index can be determined with getIndex(UITER_CURRENT)
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * which will count the UChars if necessary.
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 2.6
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UITER_UNKNOWN_INDEX=-2
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Constant for UCharIterator getState() indicating an error or
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * an unknown state.
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Returned by uiter_getState()/UCharIteratorGetState
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * when an error occurs.
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Also, some UCharIterator implementations may not be able to return
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * a valid state for each position. This will be clearly documented
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * for each such iterator (none of the public ones here).
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @stable ICU 2.6
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define UITER_NO_STATE ((uint32_t)0xffffffff)
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Function type declaration for UCharIterator.getIndex().
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Gets the current position, or the start or limit of the
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * iteration range.
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This function may perform slowly for UITER_CURRENT after setState() was called,
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * or for UITER_LENGTH, because an iterator implementation may have to count
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * UChars if the underlying storage is not UTF-16.
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param iter the UCharIterator structure ("this pointer")
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param origin get the 0, start, limit, length, or current index
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return the requested index, or U_SENTINEL in an error condition
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCharIteratorOrigin
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCharIterator
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @stable ICU 2.1
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef int32_t U_CALLCONV
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUCharIteratorGetIndex(UCharIterator *iter, UCharIteratorOrigin origin);
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Function type declaration for UCharIterator.move().
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Use iter->move(iter, index, UITER_ZERO) like CharacterIterator::setIndex(index).
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Moves the current position relative to the start or limit of the
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * iteration range, or relative to the current position itself.
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The movement is expressed in numbers of code units forward
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * or backward by specifying a positive or negative delta.
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Out of bounds movement will be pinned to the start or limit.
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This function may perform slowly for moving relative to UITER_LENGTH
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * because an iterator implementation may have to count the rest of the
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * UChars if the native storage is not UTF-16.
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * When moving relative to the limit or length, or
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * relative to the current position after setState() was called,
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * move() may return UITER_UNKNOWN_INDEX (-2) to avoid an inefficient
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * determination of the actual UTF-16 index.
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The actual index can be determined with getIndex(UITER_CURRENT)
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * which will count the UChars if necessary.
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * See UITER_UNKNOWN_INDEX for details.
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param iter the UCharIterator structure ("this pointer")
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param delta can be positive, zero, or negative
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param origin move relative to the 0, start, limit, length, or current index
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return the new index, or U_SENTINEL on an error condition,
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *         or UITER_UNKNOWN_INDEX when the index is not known.
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCharIteratorOrigin
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCharIterator
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UITER_UNKNOWN_INDEX
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @stable ICU 2.1
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef int32_t U_CALLCONV
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUCharIteratorMove(UCharIterator *iter, int32_t delta, UCharIteratorOrigin origin);
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Function type declaration for UCharIterator.hasNext().
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Check if current() and next() can still
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * return another code unit.
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param iter the UCharIterator structure ("this pointer")
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return boolean value for whether current() and next() can still return another code unit
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCharIterator
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @stable ICU 2.1
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef UBool U_CALLCONV
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUCharIteratorHasNext(UCharIterator *iter);
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Function type declaration for UCharIterator.hasPrevious().
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Check if previous() can still return another code unit.
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param iter the UCharIterator structure ("this pointer")
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return boolean value for whether previous() can still return another code unit
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCharIterator
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @stable ICU 2.1
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef UBool U_CALLCONV
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUCharIteratorHasPrevious(UCharIterator *iter);
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Function type declaration for UCharIterator.current().
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Return the code unit at the current position,
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * or U_SENTINEL if there is none (index is at the limit).
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param iter the UCharIterator structure ("this pointer")
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return the current code unit
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCharIterator
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @stable ICU 2.1
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef UChar32 U_CALLCONV
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUCharIteratorCurrent(UCharIterator *iter);
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Function type declaration for UCharIterator.next().
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Return the code unit at the current index and increment
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the index (post-increment, like s[i++]),
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * or return U_SENTINEL if there is none (index is at the limit).
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param iter the UCharIterator structure ("this pointer")
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return the current code unit (and post-increment the current index)
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCharIterator
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @stable ICU 2.1
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef UChar32 U_CALLCONV
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUCharIteratorNext(UCharIterator *iter);
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Function type declaration for UCharIterator.previous().
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Decrement the index and return the code unit from there
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * (pre-decrement, like s[--i]),
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * or return U_SENTINEL if there is none (index is at the start).
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param iter the UCharIterator structure ("this pointer")
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return the previous code unit (after pre-decrementing the current index)
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCharIterator
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @stable ICU 2.1
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef UChar32 U_CALLCONV
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUCharIteratorPrevious(UCharIterator *iter);
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Function type declaration for UCharIterator.reservedFn().
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Reserved for future use.
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param iter the UCharIterator structure ("this pointer")
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param something some integer argument
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return some integer
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCharIterator
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @stable ICU 2.1
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef int32_t U_CALLCONV
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUCharIteratorReserved(UCharIterator *iter, int32_t something);
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Function type declaration for UCharIterator.getState().
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Get the "state" of the iterator in the form of a single 32-bit word.
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * It is recommended that the state value be calculated to be as small as
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * is feasible. For strings with limited lengths, fewer than 32 bits may
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * be sufficient.
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This is used together with setState()/UCharIteratorSetState
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * to save and restore the iterator position more efficiently than with
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * getIndex()/move().
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The iterator state is defined as a uint32_t value because it is designed
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * for use in ucol_nextSortKeyPart() which provides 32 bits to store the state
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * of the character iterator.
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * With some UCharIterator implementations (e.g., UTF-8),
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * getting and setting the UTF-16 index with existing functions
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * (getIndex(UITER_CURRENT) followed by move(pos, UITER_ZERO)) is possible but
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * relatively slow because the iterator has to "walk" from a known index
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * to the requested one.
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This takes more time the farther it needs to go.
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * An opaque state value allows an iterator implementation to provide
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * an internal index (UTF-8: the source byte array index) for
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * fast, constant-time restoration.
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * After calling setState(), a getIndex(UITER_CURRENT) may be slow because
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the UTF-16 index may not be restored as well, but the iterator can deliver
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the correct text contents and move relative to the current position
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * without performance degradation.
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Some UCharIterator implementations may not be able to return
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * a valid state for each position, in which case they return UITER_NO_STATE instead.
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This will be clearly documented for each such iterator (none of the public ones here).
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param iter the UCharIterator structure ("this pointer")
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return the state word
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCharIterator
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCharIteratorSetState
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UITER_NO_STATE
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @stable ICU 2.6
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef uint32_t U_CALLCONV
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUCharIteratorGetState(const UCharIterator *iter);
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Function type declaration for UCharIterator.setState().
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Restore the "state" of the iterator using a state word from a getState() call.
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The iterator object need not be the same one as for which getState() was called,
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * but it must be of the same type (set up using the same uiter_setXYZ function)
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * and it must iterate over the same string
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * (binary identical regardless of memory address).
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * For more about the state word see UCharIteratorGetState.
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * After calling setState(), a getIndex(UITER_CURRENT) may be slow because
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the UTF-16 index may not be restored as well, but the iterator can deliver
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the correct text contents and move relative to the current position
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * without performance degradation.
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param iter the UCharIterator structure ("this pointer")
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param state the state word from a getState() call
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *              on a same-type, same-string iterator
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param pErrorCode Must be a valid pointer to an error code value,
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                   which must not indicate a failure before the function call.
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCharIterator
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCharIteratorGetState
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @stable ICU 2.6
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef void U_CALLCONV
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUCharIteratorSetState(UCharIterator *iter, uint32_t state, UErrorCode *pErrorCode);
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * C API for code unit iteration.
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This can be used as a C wrapper around
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * CharacterIterator, Replaceable, or implemented using simple strings, etc.
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * There are two roles for using UCharIterator:
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * A "provider" sets the necessary function pointers and controls the "protected"
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * fields of the UCharIterator structure. A "provider" passes a UCharIterator
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * into C APIs that need a UCharIterator as an abstract, flexible string interface.
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Implementations of such C APIs are "callers" of UCharIterator functions;
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * they only use the "public" function pointers and never access the "protected"
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * fields directly.
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The current() and next() functions only check the current index against the
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * limit, and previous() only checks the current index against the start,
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * to see if the iterator already reached the end of the iteration range.
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The assumption - in all iterators - is that the index is moved via the API,
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * which means it won't go out of bounds, or the index is modified by
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * user code that knows enough about the iterator implementation to set valid
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * index values.
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * UCharIterator functions return code unit values 0..0xffff,
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * or U_SENTINEL if the iteration bounds are reached.
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @stable ICU 2.1
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustruct UCharIterator {
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * (protected) Pointer to string or wrapped object or similar.
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Not used by caller.
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 2.1
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const void *context;
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * (protected) Length of string or similar.
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Not used by caller.
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 2.1
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t length;
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * (protected) Start index or similar.
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Not used by caller.
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 2.1
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t start;
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * (protected) Current index or similar.
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Not used by caller.
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 2.1
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t index;
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * (protected) Limit index or similar.
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Not used by caller.
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 2.1
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t limit;
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * (protected) Used by UTF-8 iterators and possibly others.
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 2.1
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t reservedField;
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * (public) Returns the current position or the
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * start or limit index of the iteration range.
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @see UCharIteratorGetIndex
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 2.1
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCharIteratorGetIndex *getIndex;
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * (public) Moves the current position relative to the start or limit of the
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * iteration range, or relative to the current position itself.
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * The movement is expressed in numbers of code units forward
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * or backward by specifying a positive or negative delta.
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @see UCharIteratorMove
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 2.1
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCharIteratorMove *move;
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * (public) Check if current() and next() can still
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * return another code unit.
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @see UCharIteratorHasNext
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 2.1
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCharIteratorHasNext *hasNext;
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * (public) Check if previous() can still return another code unit.
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @see UCharIteratorHasPrevious
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 2.1
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCharIteratorHasPrevious *hasPrevious;
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * (public) Return the code unit at the current position,
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * or U_SENTINEL if there is none (index is at the limit).
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @see UCharIteratorCurrent
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 2.1
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCharIteratorCurrent *current;
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * (public) Return the code unit at the current index and increment
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * the index (post-increment, like s[i++]),
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * or return U_SENTINEL if there is none (index is at the limit).
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @see UCharIteratorNext
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 2.1
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCharIteratorNext *next;
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * (public) Decrement the index and return the code unit from there
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * (pre-decrement, like s[--i]),
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * or return U_SENTINEL if there is none (index is at the start).
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @see UCharIteratorPrevious
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 2.1
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCharIteratorPrevious *previous;
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * (public) Reserved for future use. Currently NULL.
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @see UCharIteratorReserved
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 2.1
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCharIteratorReserved *reservedFn;
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * (public) Return the state of the iterator, to be restored later with setState().
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * This function pointer is NULL if the iterator does not implement it.
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @see UCharIteratorGet
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 2.6
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCharIteratorGetState *getState;
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * (public) Restore the iterator state from the state word from a call
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * to getState().
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * This function pointer is NULL if the iterator does not implement it.
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @see UCharIteratorSet
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 2.6
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCharIteratorSetState *setState;
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Helper function for UCharIterator to get the code point
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * at the current index.
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Return the code point that includes the code unit at the current position,
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * or U_SENTINEL if there is none (index is at the limit).
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * If the current code unit is a lead or trail surrogate,
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * then the following or preceding surrogate is used to form
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the code point value.
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param iter the UCharIterator structure ("this pointer")
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return the current code point
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCharIterator
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see U16_GET
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UnicodeString::char32At()
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @stable ICU 2.1
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_STABLE UChar32 U_EXPORT2
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuiter_current32(UCharIterator *iter);
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Helper function for UCharIterator to get the next code point.
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Return the code point at the current index and increment
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the index (post-increment, like s[i++]),
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * or return U_SENTINEL if there is none (index is at the limit).
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param iter the UCharIterator structure ("this pointer")
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return the current code point (and post-increment the current index)
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCharIterator
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see U16_NEXT
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @stable ICU 2.1
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_STABLE UChar32 U_EXPORT2
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuiter_next32(UCharIterator *iter);
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Helper function for UCharIterator to get the previous code point.
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Decrement the index and return the code point from there
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * (pre-decrement, like s[--i]),
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * or return U_SENTINEL if there is none (index is at the start).
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param iter the UCharIterator structure ("this pointer")
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return the previous code point (after pre-decrementing the current index)
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCharIterator
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see U16_PREV
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @stable ICU 2.1
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_STABLE UChar32 U_EXPORT2
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuiter_previous32(UCharIterator *iter);
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Get the "state" of the iterator in the form of a single 32-bit word.
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This is a convenience function that calls iter->getState(iter)
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * if iter->getState is not NULL;
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * if it is NULL or any other error occurs, then UITER_NO_STATE is returned.
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Some UCharIterator implementations may not be able to return
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * a valid state for each position, in which case they return UITER_NO_STATE instead.
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This will be clearly documented for each such iterator (none of the public ones here).
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param iter the UCharIterator structure ("this pointer")
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return the state word
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCharIterator
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCharIteratorGetState
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UITER_NO_STATE
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @stable ICU 2.6
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_STABLE uint32_t U_EXPORT2
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuiter_getState(const UCharIterator *iter);
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Restore the "state" of the iterator using a state word from a getState() call.
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This is a convenience function that calls iter->setState(iter, state, pErrorCode)
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * if iter->setState is not NULL; if it is NULL, then U_UNSUPPORTED_ERROR is set.
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param iter the UCharIterator structure ("this pointer")
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param state the state word from a getState() call
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *              on a same-type, same-string iterator
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param pErrorCode Must be a valid pointer to an error code value,
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                   which must not indicate a failure before the function call.
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCharIterator
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCharIteratorSetState
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @stable ICU 2.6
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_STABLE void U_EXPORT2
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuiter_setState(UCharIterator *iter, uint32_t state, UErrorCode *pErrorCode);
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Set up a UCharIterator to iterate over a string.
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Sets the UCharIterator function pointers for iteration over the string s
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * with iteration boundaries start=index=0 and length=limit=string length.
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The "provider" may set the start, index, and limit values at any time
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * within the range 0..length.
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The length field will be ignored.
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The string pointer s is set into UCharIterator.context without copying
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * or reallocating the string contents.
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * getState() simply returns the current index.
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * move() will always return the final index.
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param iter UCharIterator structure to be set for iteration
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param s String to iterate over
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param length Length of s, or -1 if NUL-terminated
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCharIterator
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @stable ICU 2.1
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_STABLE void U_EXPORT2
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuiter_setString(UCharIterator *iter, const UChar *s, int32_t length);
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Set up a UCharIterator to iterate over a UTF-16BE string
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * (byte vector with a big-endian pair of bytes per UChar).
597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Everything works just like with a normal UChar iterator (uiter_setString),
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * except that UChars are assembled from byte pairs,
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * and that the length argument here indicates an even number of bytes.
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * getState() simply returns the current index.
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * move() will always return the final index.
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param iter UCharIterator structure to be set for iteration
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param s UTF-16BE string to iterate over
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param length Length of s as an even number of bytes, or -1 if NUL-terminated
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *               (NUL means pair of 0 bytes at even index from s)
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCharIterator
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see uiter_setString
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @stable ICU 2.6
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_STABLE void U_EXPORT2
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuiter_setUTF16BE(UCharIterator *iter, const char *s, int32_t length);
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Set up a UCharIterator to iterate over a UTF-8 string.
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Sets the UCharIterator function pointers for iteration over the UTF-8 string s
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * with UTF-8 iteration boundaries 0 and length.
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The implementation counts the UTF-16 index on the fly and
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * lazily evaluates the UTF-16 length of the text.
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The start field is used as the UTF-8 offset, the limit field as the UTF-8 length.
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * When the reservedField is not 0, then it contains a supplementary code point
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * and the UTF-16 index is between the two corresponding surrogates.
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * At that point, the UTF-8 index is behind that code point.
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The UTF-8 string pointer s is set into UCharIterator.context without copying
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * or reallocating the string contents.
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * getState() returns a state value consisting of
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * - the current UTF-8 source byte index (bits 31..1)
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * - a flag (bit 0) that indicates whether the UChar position is in the middle
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   of a surrogate pair
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   (from a 4-byte UTF-8 sequence for the corresponding supplementary code point)
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * getState() cannot also encode the UTF-16 index in the state value.
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * move(relative to limit or length), or
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * move(relative to current) after setState(), may return UITER_UNKNOWN_INDEX.
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param iter UCharIterator structure to be set for iteration
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param s UTF-8 string to iterate over
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param length Length of s in bytes, or -1 if NUL-terminated
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCharIterator
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @stable ICU 2.6
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_STABLE void U_EXPORT2
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuiter_setUTF8(UCharIterator *iter, const char *s, int32_t length);
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
65350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if U_SHOW_CPLUSPLUS_API
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Set up a UCharIterator to wrap around a C++ CharacterIterator.
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Sets the UCharIterator function pointers for iteration using the
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * CharacterIterator charIter.
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The CharacterIterator pointer charIter is set into UCharIterator.context
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * without copying or cloning the CharacterIterator object.
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The other "protected" UCharIterator fields are set to 0 and will be ignored.
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The iteration index and boundaries are controlled by the CharacterIterator.
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * getState() simply returns the current index.
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * move() will always return the final index.
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param iter UCharIterator structure to be set for iteration
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param charIter CharacterIterator to wrap
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCharIterator
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @stable ICU 2.1
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_STABLE void U_EXPORT2
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuiter_setCharacterIterator(UCharIterator *iter, U_NAMESPACE_QUALIFIER CharacterIterator *charIter);
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Set up a UCharIterator to iterate over a C++ Replaceable.
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Sets the UCharIterator function pointers for iteration over the
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Replaceable rep with iteration boundaries start=index=0 and
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * length=limit=rep->length().
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The "provider" may set the start, index, and limit values at any time
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * within the range 0..length=rep->length().
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The length field will be ignored.
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The Replaceable pointer rep is set into UCharIterator.context without copying
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * or cloning/reallocating the Replaceable object.
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * getState() simply returns the current index.
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * move() will always return the final index.
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param iter UCharIterator structure to be set for iteration
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param rep Replaceable to iterate over
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCharIterator
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @stable ICU 2.1
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_STABLE void U_EXPORT2
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuiter_setReplaceable(UCharIterator *iter, const U_NAMESPACE_QUALIFIER Replaceable *rep);
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_END
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
708