1f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*
2f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)********************************************************************
3f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*
4f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*   Copyright (C) 1997-2005, International Business Machines
5f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*   Corporation and others.  All Rights Reserved.
6f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*
7f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)********************************************************************
8f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*/
9f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
10f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#ifndef CHARITER_H
11f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define CHARITER_H
12f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
13f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/utypes.h"
14f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/uobject.h"
15f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/unistr.h"
16f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/**
17f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \file
18f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \brief C++ API: Character Iterator
19f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */
20f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
21f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_NAMESPACE_BEGIN
22f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/**
23f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Abstract class that defines an API for forward-only iteration
24f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * on text objects.
25f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * This is a minimal interface for iteration without random access
26f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * or backwards iteration. It is especially useful for wrapping
27f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * streams with converters into an object for collation or
28f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * normalization.
29f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
30f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p>Characters can be accessed in two ways: as code units or as
31f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * code points.
32f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Unicode code points are 21-bit integers and are the scalar values
33f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * of Unicode characters. ICU uses the type UChar32 for them.
34f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Unicode code units are the storage units of a given
35f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Unicode/UCS Transformation Format (a character encoding scheme).
36f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * With UTF-16, all code points can be represented with either one
37f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * or two code units ("surrogates").
38f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * String storage is typically based on code units, while properties
39f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * of characters are typically determined using code point values.
40f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Some processes may be designed to work with sequences of code units,
41f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * or it may be known that all characters that are important to an
42f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * algorithm can be represented with single code units.
43f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Other processes will need to use the code point access functions.</p>
44f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
45f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p>ForwardCharacterIterator provides nextPostInc() to access
46f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * a code unit and advance an internal position into the text object,
47f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * similar to a <code>return text[position++]</code>.<br>
48f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * It provides next32PostInc() to access a code point and advance an internal
49f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * position.</p>
50f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
51f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p>next32PostInc() assumes that the current position is that of
52f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * the beginning of a code point, i.e., of its first code unit.
53f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * After next32PostInc(), this will be true again.
54f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * In general, access to code units and code points in the same
55f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * iteration loop should not be mixed. In UTF-16, if the current position
56f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * is on a second code unit (Low Surrogate), then only that code unit
57f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * is returned even by next32PostInc().</p>
58f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
59f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p>For iteration with either function, there are two ways to
60f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * check for the end of the iteration. When there are no more
61f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * characters in the text object:
62f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <ul>
63f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <li>The hasNext() function returns FALSE.</li>
64f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <li>nextPostInc() and next32PostInc() return DONE
65f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     when one attempts to read beyond the end of the text object.</li>
66f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * </ul>
67f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
68f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Example:
69f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \code
70f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * void function1(ForwardCharacterIterator &it) {
71f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     UChar32 c;
72f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     while(it.hasNext()) {
73f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *         c=it.next32PostInc();
74f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *         // use c
75f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     }
76f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * }
77f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
78f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * void function1(ForwardCharacterIterator &it) {
79f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     UChar c;
80f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     while((c=it.nextPostInc())!=ForwardCharacterIterator::DONE) {
81f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *         // use c
82f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      }
83f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *  }
84f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \endcode
85f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * </p>
86f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
87f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * @stable ICU 2.0
88f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */
89f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)class U_COMMON_API ForwardCharacterIterator : public UObject {
90f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)public:
91f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
92f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Value returned by most of ForwardCharacterIterator's functions
93f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * when the iterator has reached the limits of its iteration.
94f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
95f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
96f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    enum { DONE = 0xffff };
97f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
98f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
99f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Destructor.
100f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
101f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
102f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual ~ForwardCharacterIterator();
103f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
104f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
105f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Returns true when both iterators refer to the same
106f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * character in the same character-storage object.
107f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param that The ForwardCharacterIterator to be compared for equality
108f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return true when both iterators refer to the same
109f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * character in the same character-storage object
110f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
111f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
112f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UBool operator==(const ForwardCharacterIterator& that) const = 0;
113f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
114f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
115f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Returns true when the iterators refer to different
116f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * text-storage objects, or to different characters in the
117f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * same text-storage object.
118f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param that The ForwardCharacterIterator to be compared for inequality
119f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return true when the iterators refer to different
120f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * text-storage objects, or to different characters in the
121f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * same text-storage object
122f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
123f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
124f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    inline UBool operator!=(const ForwardCharacterIterator& that) const;
125f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
126f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
127f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Generates a hash code for this iterator.
128f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the hash code.
129f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
130f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
131f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual int32_t hashCode(void) const = 0;
132f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
133f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
134f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Returns a UClassID for this ForwardCharacterIterator ("poor man's
135f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * RTTI").<P> Despite the fact that this function is public,
136f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * DO NOT CONSIDER IT PART OF CHARACTERITERATOR'S API!
137f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return a UClassID for this ForwardCharacterIterator
138f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
139f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
140f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UClassID getDynamicClassID(void) const = 0;
141f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
142f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
143f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Gets the current code unit for returning and advances to the next code unit
144f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * in the iteration range
145f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * (toward endIndex()).  If there are
146f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * no more code units to return, returns DONE.
147f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the current code unit.
148f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
149f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
150f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UChar         nextPostInc(void) = 0;
151f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
152f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
153f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Gets the current code point for returning and advances to the next code point
154f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * in the iteration range
155f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * (toward endIndex()).  If there are
156f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * no more code points to return, returns DONE.
157f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the current code point.
158f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
159f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
160f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UChar32       next32PostInc(void) = 0;
161f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
162f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
163f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Returns FALSE if there are no more code units or code points
164f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * at or after the current position in the iteration range.
165f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * This is used with nextPostInc() or next32PostInc() in forward
166f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * iteration.
167f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @returns FALSE if there are no more code units or code points
168f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * at or after the current position in the iteration range.
169f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
170f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
171f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UBool        hasNext() = 0;
172f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
173f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)protected:
174f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /** Default constructor to be overridden in the implementing class. @stable ICU 2.0*/
175f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ForwardCharacterIterator();
176f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
177f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /** Copy constructor to be overridden in the implementing class. @stable ICU 2.0*/
178f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ForwardCharacterIterator(const ForwardCharacterIterator &other);
179f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
180f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
181f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Assignment operator to be overridden in the implementing class.
182f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
183f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
184f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ForwardCharacterIterator &operator=(const ForwardCharacterIterator&) { return *this; }
185f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
186f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
187f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/**
188f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Abstract class that defines an API for iteration
189f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * on text objects.
190f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * This is an interface for forward and backward iteration
191f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * and random access into a text object.
192f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
193f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p>The API provides backward compatibility to the Java and older ICU
194f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * CharacterIterator classes but extends them significantly:
195f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <ol>
196f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <li>CharacterIterator is now a subclass of ForwardCharacterIterator.</li>
197f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <li>While the old API functions provided forward iteration with
198f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     "pre-increment" semantics, the new one also provides functions
199f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     with "post-increment" semantics. They are more efficient and should
200f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     be the preferred iterator functions for new implementations.
201f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     The backward iteration always had "pre-decrement" semantics, which
202f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     are efficient.</li>
203f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <li>Just like ForwardCharacterIterator, it provides access to
204f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     both code units and code points. Code point access versions are available
205f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     for the old and the new iteration semantics.</li>
206f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <li>There are new functions for setting and moving the current position
207f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     without returning a character, for efficiency.</li>
208f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * </ol>
209f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
210f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * See ForwardCharacterIterator for examples for using the new forward iteration
211f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * functions. For backward iteration, there is also a hasPrevious() function
212f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * that can be used analogously to hasNext().
213f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * The old functions work as before and are shown below.</p>
214f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
215f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p>Examples for some of the new functions:</p>
216f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
217f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Forward iteration with hasNext():
218f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \code
219f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * void forward1(CharacterIterator &it) {
220f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     UChar32 c;
221f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     for(it.setToStart(); it.hasNext();) {
222f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *         c=it.next32PostInc();
223f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *         // use c
224f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     }
225f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *  }
226f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \endcode
227f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Forward iteration more similar to loops with the old forward iteration,
228f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * showing a way to convert simple for() loops:
229f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \code
230f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * void forward2(CharacterIterator &it) {
231f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     UChar c;
232f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     for(c=it.firstPostInc(); c!=CharacterIterator::DONE; c=it.nextPostInc()) {
233f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *          // use c
234f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      }
235f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * }
236f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \endcode
237f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Backward iteration with setToEnd() and hasPrevious():
238f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \code
239f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *  void backward1(CharacterIterator &it) {
240f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      UChar32 c;
241f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      for(it.setToEnd(); it.hasPrevious();) {
242f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *         c=it.previous32();
243f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *          // use c
244f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      }
245f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *  }
246f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \endcode
247f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Backward iteration with a more traditional for() loop:
248f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \code
249f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * void backward2(CharacterIterator &it) {
250f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     UChar c;
251f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     for(c=it.last(); c!=CharacterIterator::DONE; c=it.previous()) {
252f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *         // use c
253f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      }
254f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *  }
255f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \endcode
256f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
257f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Example for random access:
258f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \code
259f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *  void random(CharacterIterator &it) {
260f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      // set to the third code point from the beginning
261f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      it.move32(3, CharacterIterator::kStart);
262f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      // get a code point from here without moving the position
263f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      UChar32 c=it.current32();
264f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      // get the position
265f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      int32_t pos=it.getIndex();
266f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      // get the previous code unit
267f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      UChar u=it.previous();
268f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      // move back one more code unit
269f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      it.move(-1, CharacterIterator::kCurrent);
270f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      // set the position back to where it was
271f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      // and read the same code point c and move beyond it
272f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      it.setIndex(pos);
273f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      if(c!=it.next32PostInc()) {
274f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *          exit(1); // CharacterIterator inconsistent
275f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      }
276f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *  }
277f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \endcode
278f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
279f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p>Examples, especially for the old API:</p>
280f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
281f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Function processing characters, in this example simple output
282f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <pre>
283f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \code
284f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *  void processChar( UChar c )
285f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *  {
286f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      cout << " " << c;
287f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *  }
288f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \endcode
289f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * </pre>
290f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Traverse the text from start to finish
291f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <pre>
292f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \code
293f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *  void traverseForward(CharacterIterator& iter)
294f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *  {
295f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      for(UChar c = iter.first(); c != CharacterIterator.DONE; c = iter.next()) {
296f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *          processChar(c);
297f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      }
298f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *  }
299f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \endcode
300f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * </pre>
301f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Traverse the text backwards, from end to start
302f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <pre>
303f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \code
304f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *  void traverseBackward(CharacterIterator& iter)
305f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *  {
306f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      for(UChar c = iter.last(); c != CharacterIterator.DONE; c = iter.previous()) {
307f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *          processChar(c);
308f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      }
309f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *  }
310f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \endcode
311f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * </pre>
312f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Traverse both forward and backward from a given position in the text.
313f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Calls to notBoundary() in this example represents some additional stopping criteria.
314f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <pre>
315f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \code
316f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * void traverseOut(CharacterIterator& iter, int32_t pos)
317f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * {
318f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      UChar c;
319f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      for (c = iter.setIndex(pos);
320f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      c != CharacterIterator.DONE && (Unicode::isLetter(c) || Unicode::isDigit(c));
321f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *          c = iter.next()) {}
322f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      int32_t end = iter.getIndex();
323f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      for (c = iter.setIndex(pos);
324f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *          c != CharacterIterator.DONE && (Unicode::isLetter(c) || Unicode::isDigit(c));
325f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *          c = iter.previous()) {}
326f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      int32_t start = iter.getIndex() + 1;
327f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
328f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      cout << "start: " << start << " end: " << end << endl;
329f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *      for (c = iter.setIndex(start); iter.getIndex() < end; c = iter.next() ) {
330f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *          processChar(c);
331f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     }
332f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *  }
333f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \endcode
334f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * </pre>
335f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Creating a StringCharacterIterator and calling the test functions
336f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <pre>
337f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \code
338f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *  void CharacterIterator_Example( void )
339f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   {
340f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *       cout << endl << "===== CharacterIterator_Example: =====" << endl;
341f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *       UnicodeString text("Ein kleiner Satz.");
342f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *       StringCharacterIterator iterator(text);
343f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *       cout << "----- traverseForward: -----------" << endl;
344f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *       traverseForward( iterator );
345f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *       cout << endl << endl << "----- traverseBackward: ----------" << endl;
346f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *       traverseBackward( iterator );
347f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *       cout << endl << endl << "----- traverseOut: ---------------" << endl;
348f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *       traverseOut( iterator, 7 );
349f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *       cout << endl << endl << "-----" << endl;
350f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   }
351f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \endcode
352f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * </pre>
353f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
354f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * @stable ICU 2.0
355f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */
356f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)class U_COMMON_API CharacterIterator : public ForwardCharacterIterator {
357f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)public:
358f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
359f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Origin enumeration for the move() and move32() functions.
360f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
361f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
362f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    enum EOrigin { kStart, kCurrent, kEnd };
363f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
364f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
365f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Returns a pointer to a new CharacterIterator of the same
366f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * concrete class as this one, and referring to the same
367f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * character in the same text-storage object as this one.  The
368f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * caller is responsible for deleting the new clone.
369f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return a pointer to a new CharacterIterator
370f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
371f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
372f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual CharacterIterator* clone(void) const = 0;
373f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
374f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
375f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Sets the iterator to refer to the first code unit in its
376f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * iteration range, and returns that code unit.
377f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * This can be used to begin an iteration with next().
378f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the first code unit in its iteration range.
379f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
380f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
381f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UChar         first(void) = 0;
382f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
383f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
384f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Sets the iterator to refer to the first code unit in its
385f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * iteration range, returns that code unit, and moves the position
386f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * to the second code unit. This is an alternative to setToStart()
387f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * for forward iteration with nextPostInc().
388f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the first code unit in its iteration range.
389f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
390f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
391f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UChar         firstPostInc(void);
392f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
393f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
394f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Sets the iterator to refer to the first code point in its
395f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * iteration range, and returns that code unit,
396f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * This can be used to begin an iteration with next32().
397f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Note that an iteration with next32PostInc(), beginning with,
398f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * e.g., setToStart() or firstPostInc(), is more efficient.
399f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the first code point in its iteration range.
400f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
401f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
402f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UChar32       first32(void) = 0;
403f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
404f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
405f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Sets the iterator to refer to the first code point in its
406f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * iteration range, returns that code point, and moves the position
407f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * to the second code point. This is an alternative to setToStart()
408f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * for forward iteration with next32PostInc().
409f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the first code point in its iteration range.
410f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
411f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
412f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UChar32       first32PostInc(void);
413f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
414f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
415f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Sets the iterator to refer to the first code unit or code point in its
416f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * iteration range. This can be used to begin a forward
417f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * iteration with nextPostInc() or next32PostInc().
418f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the start position of the iteration range
419f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
420f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
421f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    inline int32_t    setToStart();
422f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
423f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
424f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Sets the iterator to refer to the last code unit in its
425f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * iteration range, and returns that code unit.
426f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * This can be used to begin an iteration with previous().
427f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the last code unit.
428f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
429f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
430f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UChar         last(void) = 0;
431f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
432f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
433f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Sets the iterator to refer to the last code point in its
434f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * iteration range, and returns that code unit.
435f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * This can be used to begin an iteration with previous32().
436f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the last code point.
437f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
438f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
439f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UChar32       last32(void) = 0;
440f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
441f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
442f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Sets the iterator to the end of its iteration range, just behind
443f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * the last code unit or code point. This can be used to begin a backward
444f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * iteration with previous() or previous32().
445f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the end position of the iteration range
446f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
447f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
448f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    inline int32_t    setToEnd();
449f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
450f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
451f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Sets the iterator to refer to the "position"-th code unit
452f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * in the text-storage object the iterator refers to, and
453f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * returns that code unit.
454f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param position the "position"-th code unit in the text-storage object
455f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the "position"-th code unit.
456f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
457f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
458f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UChar         setIndex(int32_t position) = 0;
459f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
460f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
461f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Sets the iterator to refer to the beginning of the code point
462f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * that contains the "position"-th code unit
463f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * in the text-storage object the iterator refers to, and
464f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * returns that code point.
465f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * The current position is adjusted to the beginning of the code point
466f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * (its first code unit).
467f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param position the "position"-th code unit in the text-storage object
468f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the "position"-th code point.
469f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
470f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
471f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UChar32       setIndex32(int32_t position) = 0;
472f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
473f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
474f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Returns the code unit the iterator currently refers to.
475f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the current code unit.
476f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
477f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
478f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UChar         current(void) const = 0;
479f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
480f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
481f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Returns the code point the iterator currently refers to.
482f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the current code point.
483f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
484f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
485f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UChar32       current32(void) const = 0;
486f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
487f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
488f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Advances to the next code unit in the iteration range
489f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * (toward endIndex()), and returns that code unit.  If there are
490f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * no more code units to return, returns DONE.
491f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the next code unit.
492f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
493f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
494f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UChar         next(void) = 0;
495f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
496f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
497f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Advances to the next code point in the iteration range
498f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * (toward endIndex()), and returns that code point.  If there are
499f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * no more code points to return, returns DONE.
500f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Note that iteration with "pre-increment" semantics is less
501f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * efficient than iteration with "post-increment" semantics
502f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * that is provided by next32PostInc().
503f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the next code point.
504f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
505f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
506f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UChar32       next32(void) = 0;
507f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
508f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
509f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Advances to the previous code unit in the iteration range
510f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * (toward startIndex()), and returns that code unit.  If there are
511f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * no more code units to return, returns DONE.
512f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the previous code unit.
513f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
514f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
515f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UChar         previous(void) = 0;
516f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
517f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
518f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Advances to the previous code point in the iteration range
519f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * (toward startIndex()), and returns that code point.  If there are
520f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * no more code points to return, returns DONE.
521f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the previous code point.
522f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
523f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
524f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UChar32       previous32(void) = 0;
525f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
526f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
527f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Returns FALSE if there are no more code units or code points
528f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * before the current position in the iteration range.
529f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * This is used with previous() or previous32() in backward
530f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * iteration.
531f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return FALSE if there are no more code units or code points
532f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * before the current position in the iteration range, return TRUE otherwise.
533f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
534f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
535f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UBool        hasPrevious() = 0;
536f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
537f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
538f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Returns the numeric index in the underlying text-storage
539f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * object of the character returned by first().  Since it's
540f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * possible to create an iterator that iterates across only
541f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * part of a text-storage object, this number isn't
542f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * necessarily 0.
543f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @returns the numeric index in the underlying text-storage
544f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * object of the character returned by first().
545f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
546f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
547f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    inline int32_t       startIndex(void) const;
548f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
549f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
550f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Returns the numeric index in the underlying text-storage
551f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * object of the position immediately BEYOND the character
552f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * returned by last().
553f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the numeric index in the underlying text-storage
554f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * object of the position immediately BEYOND the character
555f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * returned by last().
556f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
557f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
558f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    inline int32_t       endIndex(void) const;
559f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
560f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
561f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Returns the numeric index in the underlying text-storage
562f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * object of the character the iterator currently refers to
563f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * (i.e., the character returned by current()).
564f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the numberic index in the text-storage object of
565f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * the character the iterator currently refers to
566f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
567f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
568f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    inline int32_t       getIndex(void) const;
569f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
570f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
571f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Returns the length of the entire text in the underlying
572f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * text-storage object.
573f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the length of the entire text in the text-storage object
574f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
575f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
576f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    inline int32_t           getLength() const;
577f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
578f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
579f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Moves the current position relative to the start or end of the
580f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * iteration range, or relative to the current position itself.
581f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * The movement is expressed in numbers of code units forward
582f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * or backward by specifying a positive or negative delta.
583f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param delta the position relative to origin. A positive delta means forward;
584f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * a negative delta means backward.
585f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param origin Origin enumeration {kStart, kCurrent, kEnd}
586f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the new position
587f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
588f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
589f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual int32_t      move(int32_t delta, EOrigin origin) = 0;
590f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
591f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
592f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Moves the current position relative to the start or end of the
593f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * iteration range, or relative to the current position itself.
594f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * The movement is expressed in numbers of code points forward
595f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * or backward by specifying a positive or negative delta.
596f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param delta the position relative to origin. A positive delta means forward;
597f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * a negative delta means backward.
598f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param origin Origin enumeration {kStart, kCurrent, kEnd}
599f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the new position
600f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
601f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
602f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual int32_t      move32(int32_t delta, EOrigin origin) = 0;
603f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
604f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
605f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Copies the text under iteration into the UnicodeString
606f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * referred to by "result".
607f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param result Receives a copy of the text under iteration.
608f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
609f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
610f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual void            getText(UnicodeString&  result) = 0;
611f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
612f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)protected:
613f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
614f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Empty constructor.
615f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
616f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
617f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    CharacterIterator();
618f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
619f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
620f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Constructor, just setting the length field in this base class.
621f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
622f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
623f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    CharacterIterator(int32_t length);
624f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
625f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
626f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Constructor, just setting the length and position fields in this base class.
627f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
628f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
629f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    CharacterIterator(int32_t length, int32_t position);
630f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
631f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
632f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Constructor, just setting the length, start, end, and position fields in this base class.
633f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
634f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
635f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    CharacterIterator(int32_t length, int32_t textBegin, int32_t textEnd, int32_t position);
636f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
637f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
638f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Copy constructor.
639f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
640f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param that The CharacterIterator to be copied
641f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
642f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
643f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    CharacterIterator(const CharacterIterator &that);
644f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
645f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
646f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Assignment operator.  Sets this CharacterIterator to have the same behavior,
647f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * as the one passed in.
648f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param that The CharacterIterator passed in.
649f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the newly set CharacterIterator.
650f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
651f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
652f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    CharacterIterator &operator=(const CharacterIterator &that);
653f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
654f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
655f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Base class text length field.
656f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Necessary this for correct getText() and hashCode().
657f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
658f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
659f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t textLength;
660f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
661f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
662f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Base class field for the current position.
663f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
664f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
665f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t  pos;
666f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
667f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
668f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Base class field for the start of the iteration range.
669f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
670f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
671f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t  begin;
672f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
673f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
674f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Base class field for the end of the iteration range.
675f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
676f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
677f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t  end;
678f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
679f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
680f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)inline UBool
681f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)ForwardCharacterIterator::operator!=(const ForwardCharacterIterator& that) const {
682f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    return !operator==(that);
683f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
684f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
685f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)inline int32_t
686f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)CharacterIterator::setToStart() {
687f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    return move(0, kStart);
688f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
689f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
690f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)inline int32_t
691f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)CharacterIterator::setToEnd() {
692f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    return move(0, kEnd);
693f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
694f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
695f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)inline int32_t
696f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)CharacterIterator::startIndex(void) const {
697f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    return begin;
698f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
699f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
700f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)inline int32_t
701f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)CharacterIterator::endIndex(void) const {
702f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    return end;
703f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
704f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
705f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)inline int32_t
706f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)CharacterIterator::getIndex(void) const {
707f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    return pos;
708f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
709f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
710f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)inline int32_t
711f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)CharacterIterator::getLength(void) const {
712f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    return textLength;
713f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
714f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
715f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_NAMESPACE_END
716f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif
717