xref: /aosp_15_r20/external/icu/libicu/cts_headers/collationiterator.h (revision 0e209d3975ff4a8c132096b14b0e9364a753506e)
1*0e209d39SAndroid Build Coastguard Worker // © 2016 and later: Unicode, Inc. and others.
2*0e209d39SAndroid Build Coastguard Worker // License & terms of use: http://www.unicode.org/copyright.html
3*0e209d39SAndroid Build Coastguard Worker /*
4*0e209d39SAndroid Build Coastguard Worker *******************************************************************************
5*0e209d39SAndroid Build Coastguard Worker * Copyright (C) 2010-2014, International Business Machines
6*0e209d39SAndroid Build Coastguard Worker * Corporation and others.  All Rights Reserved.
7*0e209d39SAndroid Build Coastguard Worker *******************************************************************************
8*0e209d39SAndroid Build Coastguard Worker * collationiterator.h
9*0e209d39SAndroid Build Coastguard Worker *
10*0e209d39SAndroid Build Coastguard Worker * created on: 2010oct27
11*0e209d39SAndroid Build Coastguard Worker * created by: Markus W. Scherer
12*0e209d39SAndroid Build Coastguard Worker */
13*0e209d39SAndroid Build Coastguard Worker 
14*0e209d39SAndroid Build Coastguard Worker #ifndef __COLLATIONITERATOR_H__
15*0e209d39SAndroid Build Coastguard Worker #define __COLLATIONITERATOR_H__
16*0e209d39SAndroid Build Coastguard Worker 
17*0e209d39SAndroid Build Coastguard Worker #include "unicode/utypes.h"
18*0e209d39SAndroid Build Coastguard Worker 
19*0e209d39SAndroid Build Coastguard Worker #if !UCONFIG_NO_COLLATION
20*0e209d39SAndroid Build Coastguard Worker 
21*0e209d39SAndroid Build Coastguard Worker #include "cmemory.h"
22*0e209d39SAndroid Build Coastguard Worker #include "collation.h"
23*0e209d39SAndroid Build Coastguard Worker #include "collationdata.h"
24*0e209d39SAndroid Build Coastguard Worker 
25*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN
26*0e209d39SAndroid Build Coastguard Worker 
27*0e209d39SAndroid Build Coastguard Worker class SkippedState;
28*0e209d39SAndroid Build Coastguard Worker class UCharsTrie;
29*0e209d39SAndroid Build Coastguard Worker class UVector32;
30*0e209d39SAndroid Build Coastguard Worker 
31*0e209d39SAndroid Build Coastguard Worker /* Large enough for CEs of most short strings. */
32*0e209d39SAndroid Build Coastguard Worker #define CEBUFFER_INITIAL_CAPACITY 40
33*0e209d39SAndroid Build Coastguard Worker 
34*0e209d39SAndroid Build Coastguard Worker // Export an explicit template instantiation of the MaybeStackArray that
35*0e209d39SAndroid Build Coastguard Worker //    is used as a data member of CEBuffer.
36*0e209d39SAndroid Build Coastguard Worker //
37*0e209d39SAndroid Build Coastguard Worker //    When building DLLs for Windows this is required even though
38*0e209d39SAndroid Build Coastguard Worker //    no direct access to the MaybeStackArray leaks out of the i18n library.
39*0e209d39SAndroid Build Coastguard Worker //
40*0e209d39SAndroid Build Coastguard Worker // See digitlst.h, pluralaffix.h, datefmt.h, and others for similar examples.
41*0e209d39SAndroid Build Coastguard Worker //
42*0e209d39SAndroid Build Coastguard Worker #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN
43*0e209d39SAndroid Build Coastguard Worker template class U_I18N_API MaybeStackArray<int64_t, CEBUFFER_INITIAL_CAPACITY>;
44*0e209d39SAndroid Build Coastguard Worker #endif
45*0e209d39SAndroid Build Coastguard Worker 
46*0e209d39SAndroid Build Coastguard Worker /**
47*0e209d39SAndroid Build Coastguard Worker  * Collation element iterator and abstract character iterator.
48*0e209d39SAndroid Build Coastguard Worker  *
49*0e209d39SAndroid Build Coastguard Worker  * When a method returns a code point value, it must be in 0..10FFFF,
50*0e209d39SAndroid Build Coastguard Worker  * except it can be negative as a sentinel value.
51*0e209d39SAndroid Build Coastguard Worker  */
52*0e209d39SAndroid Build Coastguard Worker class U_I18N_API CollationIterator : public UObject {
53*0e209d39SAndroid Build Coastguard Worker private:
54*0e209d39SAndroid Build Coastguard Worker     class U_I18N_API CEBuffer {
55*0e209d39SAndroid Build Coastguard Worker     private:
56*0e209d39SAndroid Build Coastguard Worker         /** Large enough for CEs of most short strings. */
57*0e209d39SAndroid Build Coastguard Worker         static const int32_t INITIAL_CAPACITY = CEBUFFER_INITIAL_CAPACITY;
58*0e209d39SAndroid Build Coastguard Worker     public:
CEBuffer()59*0e209d39SAndroid Build Coastguard Worker         CEBuffer() : length(0) {}
60*0e209d39SAndroid Build Coastguard Worker         ~CEBuffer();
61*0e209d39SAndroid Build Coastguard Worker 
append(int64_t ce,UErrorCode & errorCode)62*0e209d39SAndroid Build Coastguard Worker         inline void append(int64_t ce, UErrorCode &errorCode) {
63*0e209d39SAndroid Build Coastguard Worker             if(length < INITIAL_CAPACITY || ensureAppendCapacity(1, errorCode)) {
64*0e209d39SAndroid Build Coastguard Worker                 buffer[length++] = ce;
65*0e209d39SAndroid Build Coastguard Worker             }
66*0e209d39SAndroid Build Coastguard Worker         }
67*0e209d39SAndroid Build Coastguard Worker 
appendUnsafe(int64_t ce)68*0e209d39SAndroid Build Coastguard Worker         inline void appendUnsafe(int64_t ce) {
69*0e209d39SAndroid Build Coastguard Worker             buffer[length++] = ce;
70*0e209d39SAndroid Build Coastguard Worker         }
71*0e209d39SAndroid Build Coastguard Worker 
72*0e209d39SAndroid Build Coastguard Worker         UBool ensureAppendCapacity(int32_t appCap, UErrorCode &errorCode);
73*0e209d39SAndroid Build Coastguard Worker 
incLength(UErrorCode & errorCode)74*0e209d39SAndroid Build Coastguard Worker         inline UBool incLength(UErrorCode &errorCode) {
75*0e209d39SAndroid Build Coastguard Worker             // Use INITIAL_CAPACITY for a very simple fastpath.
76*0e209d39SAndroid Build Coastguard Worker             // (Rather than buffer.getCapacity().)
77*0e209d39SAndroid Build Coastguard Worker             if(length < INITIAL_CAPACITY || ensureAppendCapacity(1, errorCode)) {
78*0e209d39SAndroid Build Coastguard Worker                 ++length;
79*0e209d39SAndroid Build Coastguard Worker                 return true;
80*0e209d39SAndroid Build Coastguard Worker             } else {
81*0e209d39SAndroid Build Coastguard Worker                 return false;
82*0e209d39SAndroid Build Coastguard Worker             }
83*0e209d39SAndroid Build Coastguard Worker         }
84*0e209d39SAndroid Build Coastguard Worker 
set(int32_t i,int64_t ce)85*0e209d39SAndroid Build Coastguard Worker         inline int64_t set(int32_t i, int64_t ce) {
86*0e209d39SAndroid Build Coastguard Worker             return buffer[i] = ce;
87*0e209d39SAndroid Build Coastguard Worker         }
get(int32_t i)88*0e209d39SAndroid Build Coastguard Worker         inline int64_t get(int32_t i) const { return buffer[i]; }
89*0e209d39SAndroid Build Coastguard Worker 
getCEs()90*0e209d39SAndroid Build Coastguard Worker         const int64_t *getCEs() const { return buffer.getAlias(); }
91*0e209d39SAndroid Build Coastguard Worker 
92*0e209d39SAndroid Build Coastguard Worker         int32_t length;
93*0e209d39SAndroid Build Coastguard Worker 
94*0e209d39SAndroid Build Coastguard Worker     private:
95*0e209d39SAndroid Build Coastguard Worker         CEBuffer(const CEBuffer &) = delete;
96*0e209d39SAndroid Build Coastguard Worker         void operator=(const CEBuffer &) = delete;
97*0e209d39SAndroid Build Coastguard Worker 
98*0e209d39SAndroid Build Coastguard Worker         MaybeStackArray<int64_t, INITIAL_CAPACITY> buffer;
99*0e209d39SAndroid Build Coastguard Worker     };
100*0e209d39SAndroid Build Coastguard Worker 
101*0e209d39SAndroid Build Coastguard Worker public:
CollationIterator(const CollationData * d,UBool numeric)102*0e209d39SAndroid Build Coastguard Worker     CollationIterator(const CollationData *d, UBool numeric)
103*0e209d39SAndroid Build Coastguard Worker             : trie(d->trie),
104*0e209d39SAndroid Build Coastguard Worker               data(d),
105*0e209d39SAndroid Build Coastguard Worker               cesIndex(0),
106*0e209d39SAndroid Build Coastguard Worker               skipped(nullptr),
107*0e209d39SAndroid Build Coastguard Worker               numCpFwd(-1),
108*0e209d39SAndroid Build Coastguard Worker               isNumeric(numeric) {}
109*0e209d39SAndroid Build Coastguard Worker 
110*0e209d39SAndroid Build Coastguard Worker     virtual ~CollationIterator();
111*0e209d39SAndroid Build Coastguard Worker 
112*0e209d39SAndroid Build Coastguard Worker     virtual bool operator==(const CollationIterator &other) const;
113*0e209d39SAndroid Build Coastguard Worker     inline bool operator!=(const CollationIterator &other) const {
114*0e209d39SAndroid Build Coastguard Worker         return !operator==(other);
115*0e209d39SAndroid Build Coastguard Worker     }
116*0e209d39SAndroid Build Coastguard Worker 
117*0e209d39SAndroid Build Coastguard Worker     /**
118*0e209d39SAndroid Build Coastguard Worker      * Resets the iterator state and sets the position to the specified offset.
119*0e209d39SAndroid Build Coastguard Worker      * Subclasses must implement, and must call the parent class method,
120*0e209d39SAndroid Build Coastguard Worker      * or CollationIterator::reset().
121*0e209d39SAndroid Build Coastguard Worker      */
122*0e209d39SAndroid Build Coastguard Worker     virtual void resetToOffset(int32_t newOffset) = 0;
123*0e209d39SAndroid Build Coastguard Worker 
124*0e209d39SAndroid Build Coastguard Worker     virtual int32_t getOffset() const = 0;
125*0e209d39SAndroid Build Coastguard Worker 
126*0e209d39SAndroid Build Coastguard Worker     /**
127*0e209d39SAndroid Build Coastguard Worker      * Returns the next collation element.
128*0e209d39SAndroid Build Coastguard Worker      */
nextCE(UErrorCode & errorCode)129*0e209d39SAndroid Build Coastguard Worker     inline int64_t nextCE(UErrorCode &errorCode) {
130*0e209d39SAndroid Build Coastguard Worker         if(cesIndex < ceBuffer.length) {
131*0e209d39SAndroid Build Coastguard Worker             // Return the next buffered CE.
132*0e209d39SAndroid Build Coastguard Worker             return ceBuffer.get(cesIndex++);
133*0e209d39SAndroid Build Coastguard Worker         }
134*0e209d39SAndroid Build Coastguard Worker         // assert cesIndex == ceBuffer.length;
135*0e209d39SAndroid Build Coastguard Worker         if(!ceBuffer.incLength(errorCode)) {
136*0e209d39SAndroid Build Coastguard Worker             return Collation::NO_CE;
137*0e209d39SAndroid Build Coastguard Worker         }
138*0e209d39SAndroid Build Coastguard Worker         UChar32 c;
139*0e209d39SAndroid Build Coastguard Worker         uint32_t ce32 = handleNextCE32(c, errorCode);
140*0e209d39SAndroid Build Coastguard Worker         uint32_t t = ce32 & 0xff;
141*0e209d39SAndroid Build Coastguard Worker         if(t < Collation::SPECIAL_CE32_LOW_BYTE) {  // Forced-inline of isSpecialCE32(ce32).
142*0e209d39SAndroid Build Coastguard Worker             // Normal CE from the main data.
143*0e209d39SAndroid Build Coastguard Worker             // Forced-inline of ceFromSimpleCE32(ce32).
144*0e209d39SAndroid Build Coastguard Worker             return ceBuffer.set(cesIndex++,
145*0e209d39SAndroid Build Coastguard Worker                     ((int64_t)(ce32 & 0xffff0000) << 32) | ((ce32 & 0xff00) << 16) | (t << 8));
146*0e209d39SAndroid Build Coastguard Worker         }
147*0e209d39SAndroid Build Coastguard Worker         const CollationData *d;
148*0e209d39SAndroid Build Coastguard Worker         // The compiler should be able to optimize the previous and the following
149*0e209d39SAndroid Build Coastguard Worker         // comparisons of t with the same constant.
150*0e209d39SAndroid Build Coastguard Worker         if(t == Collation::SPECIAL_CE32_LOW_BYTE) {
151*0e209d39SAndroid Build Coastguard Worker             if(c < 0) {
152*0e209d39SAndroid Build Coastguard Worker                 return ceBuffer.set(cesIndex++, Collation::NO_CE);
153*0e209d39SAndroid Build Coastguard Worker             }
154*0e209d39SAndroid Build Coastguard Worker             d = data->base;
155*0e209d39SAndroid Build Coastguard Worker             ce32 = d->getCE32(c);
156*0e209d39SAndroid Build Coastguard Worker             t = ce32 & 0xff;
157*0e209d39SAndroid Build Coastguard Worker             if(t < Collation::SPECIAL_CE32_LOW_BYTE) {
158*0e209d39SAndroid Build Coastguard Worker                 // Normal CE from the base data.
159*0e209d39SAndroid Build Coastguard Worker                 return ceBuffer.set(cesIndex++,
160*0e209d39SAndroid Build Coastguard Worker                         ((int64_t)(ce32 & 0xffff0000) << 32) | ((ce32 & 0xff00) << 16) | (t << 8));
161*0e209d39SAndroid Build Coastguard Worker             }
162*0e209d39SAndroid Build Coastguard Worker         } else {
163*0e209d39SAndroid Build Coastguard Worker             d = data;
164*0e209d39SAndroid Build Coastguard Worker         }
165*0e209d39SAndroid Build Coastguard Worker         if(t == Collation::LONG_PRIMARY_CE32_LOW_BYTE) {
166*0e209d39SAndroid Build Coastguard Worker             // Forced-inline of ceFromLongPrimaryCE32(ce32).
167*0e209d39SAndroid Build Coastguard Worker             return ceBuffer.set(cesIndex++,
168*0e209d39SAndroid Build Coastguard Worker                     ((int64_t)(ce32 - t) << 32) | Collation::COMMON_SEC_AND_TER_CE);
169*0e209d39SAndroid Build Coastguard Worker         }
170*0e209d39SAndroid Build Coastguard Worker         return nextCEFromCE32(d, c, ce32, errorCode);
171*0e209d39SAndroid Build Coastguard Worker     }
172*0e209d39SAndroid Build Coastguard Worker 
173*0e209d39SAndroid Build Coastguard Worker     /**
174*0e209d39SAndroid Build Coastguard Worker      * Fetches all CEs.
175*0e209d39SAndroid Build Coastguard Worker      * @return getCEsLength()
176*0e209d39SAndroid Build Coastguard Worker      */
177*0e209d39SAndroid Build Coastguard Worker     int32_t fetchCEs(UErrorCode &errorCode);
178*0e209d39SAndroid Build Coastguard Worker 
179*0e209d39SAndroid Build Coastguard Worker     /**
180*0e209d39SAndroid Build Coastguard Worker      * Overwrites the current CE (the last one returned by nextCE()).
181*0e209d39SAndroid Build Coastguard Worker      */
setCurrentCE(int64_t ce)182*0e209d39SAndroid Build Coastguard Worker     void setCurrentCE(int64_t ce) {
183*0e209d39SAndroid Build Coastguard Worker         // assert cesIndex > 0;
184*0e209d39SAndroid Build Coastguard Worker         ceBuffer.set(cesIndex - 1, ce);
185*0e209d39SAndroid Build Coastguard Worker     }
186*0e209d39SAndroid Build Coastguard Worker 
187*0e209d39SAndroid Build Coastguard Worker     /**
188*0e209d39SAndroid Build Coastguard Worker      * Returns the previous collation element.
189*0e209d39SAndroid Build Coastguard Worker      */
190*0e209d39SAndroid Build Coastguard Worker     int64_t previousCE(UVector32 &offsets, UErrorCode &errorCode);
191*0e209d39SAndroid Build Coastguard Worker 
getCEsLength()192*0e209d39SAndroid Build Coastguard Worker     inline int32_t getCEsLength() const {
193*0e209d39SAndroid Build Coastguard Worker         return ceBuffer.length;
194*0e209d39SAndroid Build Coastguard Worker     }
195*0e209d39SAndroid Build Coastguard Worker 
getCE(int32_t i)196*0e209d39SAndroid Build Coastguard Worker     inline int64_t getCE(int32_t i) const {
197*0e209d39SAndroid Build Coastguard Worker         return ceBuffer.get(i);
198*0e209d39SAndroid Build Coastguard Worker     }
199*0e209d39SAndroid Build Coastguard Worker 
getCEs()200*0e209d39SAndroid Build Coastguard Worker     const int64_t *getCEs() const {
201*0e209d39SAndroid Build Coastguard Worker         return ceBuffer.getCEs();
202*0e209d39SAndroid Build Coastguard Worker     }
203*0e209d39SAndroid Build Coastguard Worker 
clearCEs()204*0e209d39SAndroid Build Coastguard Worker     void clearCEs() {
205*0e209d39SAndroid Build Coastguard Worker         cesIndex = ceBuffer.length = 0;
206*0e209d39SAndroid Build Coastguard Worker     }
207*0e209d39SAndroid Build Coastguard Worker 
clearCEsIfNoneRemaining()208*0e209d39SAndroid Build Coastguard Worker     void clearCEsIfNoneRemaining() {
209*0e209d39SAndroid Build Coastguard Worker         if(cesIndex == ceBuffer.length) { clearCEs(); }
210*0e209d39SAndroid Build Coastguard Worker     }
211*0e209d39SAndroid Build Coastguard Worker 
212*0e209d39SAndroid Build Coastguard Worker     /**
213*0e209d39SAndroid Build Coastguard Worker      * Returns the next code point (with post-increment).
214*0e209d39SAndroid Build Coastguard Worker      * Public for identical-level comparison and for testing.
215*0e209d39SAndroid Build Coastguard Worker      */
216*0e209d39SAndroid Build Coastguard Worker     virtual UChar32 nextCodePoint(UErrorCode &errorCode) = 0;
217*0e209d39SAndroid Build Coastguard Worker 
218*0e209d39SAndroid Build Coastguard Worker     /**
219*0e209d39SAndroid Build Coastguard Worker      * Returns the previous code point (with pre-decrement).
220*0e209d39SAndroid Build Coastguard Worker      * Public for identical-level comparison and for testing.
221*0e209d39SAndroid Build Coastguard Worker      */
222*0e209d39SAndroid Build Coastguard Worker     virtual UChar32 previousCodePoint(UErrorCode &errorCode) = 0;
223*0e209d39SAndroid Build Coastguard Worker 
224*0e209d39SAndroid Build Coastguard Worker protected:
225*0e209d39SAndroid Build Coastguard Worker     CollationIterator(const CollationIterator &other);
226*0e209d39SAndroid Build Coastguard Worker 
227*0e209d39SAndroid Build Coastguard Worker     void reset();
228*0e209d39SAndroid Build Coastguard Worker 
229*0e209d39SAndroid Build Coastguard Worker     /**
230*0e209d39SAndroid Build Coastguard Worker      * Returns the next code point and its local CE32 value.
231*0e209d39SAndroid Build Coastguard Worker      * Returns Collation::FALLBACK_CE32 at the end of the text (c<0)
232*0e209d39SAndroid Build Coastguard Worker      * or when c's CE32 value is to be looked up in the base data (fallback).
233*0e209d39SAndroid Build Coastguard Worker      *
234*0e209d39SAndroid Build Coastguard Worker      * The code point is used for fallbacks, context and implicit weights.
235*0e209d39SAndroid Build Coastguard Worker      * It is ignored when the returned CE32 is not special (e.g., FFFD_CE32).
236*0e209d39SAndroid Build Coastguard Worker      */
237*0e209d39SAndroid Build Coastguard Worker     virtual uint32_t handleNextCE32(UChar32 &c, UErrorCode &errorCode);
238*0e209d39SAndroid Build Coastguard Worker 
239*0e209d39SAndroid Build Coastguard Worker     /**
240*0e209d39SAndroid Build Coastguard Worker      * Called when handleNextCE32() returns a LEAD_SURROGATE_TAG for a lead surrogate code unit.
241*0e209d39SAndroid Build Coastguard Worker      * Returns the trail surrogate in that case and advances past it,
242*0e209d39SAndroid Build Coastguard Worker      * if a trail surrogate follows the lead surrogate.
243*0e209d39SAndroid Build Coastguard Worker      * Otherwise returns any other code unit and does not advance.
244*0e209d39SAndroid Build Coastguard Worker      */
245*0e209d39SAndroid Build Coastguard Worker     virtual char16_t handleGetTrailSurrogate();
246*0e209d39SAndroid Build Coastguard Worker 
247*0e209d39SAndroid Build Coastguard Worker     /**
248*0e209d39SAndroid Build Coastguard Worker      * Called when handleNextCE32() returns with c==0, to see whether it is a NUL terminator.
249*0e209d39SAndroid Build Coastguard Worker      * (Not needed in Java.)
250*0e209d39SAndroid Build Coastguard Worker      */
251*0e209d39SAndroid Build Coastguard Worker     virtual UBool foundNULTerminator();
252*0e209d39SAndroid Build Coastguard Worker 
253*0e209d39SAndroid Build Coastguard Worker     /**
254*0e209d39SAndroid Build Coastguard Worker      * @return false if surrogate code points U+D800..U+DFFF
255*0e209d39SAndroid Build Coastguard Worker      *         map to their own implicit primary weights (for UTF-16),
256*0e209d39SAndroid Build Coastguard Worker      *         or true if they map to CE(U+FFFD) (for UTF-8)
257*0e209d39SAndroid Build Coastguard Worker      */
258*0e209d39SAndroid Build Coastguard Worker     virtual UBool forbidSurrogateCodePoints() const;
259*0e209d39SAndroid Build Coastguard Worker 
260*0e209d39SAndroid Build Coastguard Worker     virtual void forwardNumCodePoints(int32_t num, UErrorCode &errorCode) = 0;
261*0e209d39SAndroid Build Coastguard Worker 
262*0e209d39SAndroid Build Coastguard Worker     virtual void backwardNumCodePoints(int32_t num, UErrorCode &errorCode) = 0;
263*0e209d39SAndroid Build Coastguard Worker 
264*0e209d39SAndroid Build Coastguard Worker     /**
265*0e209d39SAndroid Build Coastguard Worker      * Returns the CE32 from the data trie.
266*0e209d39SAndroid Build Coastguard Worker      * Normally the same as data->getCE32(), but overridden in the builder.
267*0e209d39SAndroid Build Coastguard Worker      * Call this only when the faster data->getCE32() cannot be used.
268*0e209d39SAndroid Build Coastguard Worker      */
269*0e209d39SAndroid Build Coastguard Worker     virtual uint32_t getDataCE32(UChar32 c) const;
270*0e209d39SAndroid Build Coastguard Worker 
271*0e209d39SAndroid Build Coastguard Worker     virtual uint32_t getCE32FromBuilderData(uint32_t ce32, UErrorCode &errorCode);
272*0e209d39SAndroid Build Coastguard Worker 
273*0e209d39SAndroid Build Coastguard Worker     void appendCEsFromCE32(const CollationData *d, UChar32 c, uint32_t ce32,
274*0e209d39SAndroid Build Coastguard Worker                            UBool forward, UErrorCode &errorCode);
275*0e209d39SAndroid Build Coastguard Worker 
276*0e209d39SAndroid Build Coastguard Worker     // Main lookup trie of the data object.
277*0e209d39SAndroid Build Coastguard Worker     const UTrie2 *trie;
278*0e209d39SAndroid Build Coastguard Worker     const CollationData *data;
279*0e209d39SAndroid Build Coastguard Worker 
280*0e209d39SAndroid Build Coastguard Worker private:
281*0e209d39SAndroid Build Coastguard Worker     int64_t nextCEFromCE32(const CollationData *d, UChar32 c, uint32_t ce32,
282*0e209d39SAndroid Build Coastguard Worker                            UErrorCode &errorCode);
283*0e209d39SAndroid Build Coastguard Worker 
284*0e209d39SAndroid Build Coastguard Worker     uint32_t getCE32FromPrefix(const CollationData *d, uint32_t ce32,
285*0e209d39SAndroid Build Coastguard Worker                                UErrorCode &errorCode);
286*0e209d39SAndroid Build Coastguard Worker 
287*0e209d39SAndroid Build Coastguard Worker     UChar32 nextSkippedCodePoint(UErrorCode &errorCode);
288*0e209d39SAndroid Build Coastguard Worker 
289*0e209d39SAndroid Build Coastguard Worker     void backwardNumSkipped(int32_t n, UErrorCode &errorCode);
290*0e209d39SAndroid Build Coastguard Worker 
291*0e209d39SAndroid Build Coastguard Worker     uint32_t nextCE32FromContraction(
292*0e209d39SAndroid Build Coastguard Worker             const CollationData *d, uint32_t contractionCE32,
293*0e209d39SAndroid Build Coastguard Worker             const char16_t *p, uint32_t ce32, UChar32 c,
294*0e209d39SAndroid Build Coastguard Worker             UErrorCode &errorCode);
295*0e209d39SAndroid Build Coastguard Worker 
296*0e209d39SAndroid Build Coastguard Worker     uint32_t nextCE32FromDiscontiguousContraction(
297*0e209d39SAndroid Build Coastguard Worker             const CollationData *d, UCharsTrie &suffixes, uint32_t ce32,
298*0e209d39SAndroid Build Coastguard Worker             int32_t lookAhead, UChar32 c,
299*0e209d39SAndroid Build Coastguard Worker             UErrorCode &errorCode);
300*0e209d39SAndroid Build Coastguard Worker 
301*0e209d39SAndroid Build Coastguard Worker     /**
302*0e209d39SAndroid Build Coastguard Worker      * Returns the previous CE when data->isUnsafeBackward(c, isNumeric).
303*0e209d39SAndroid Build Coastguard Worker      */
304*0e209d39SAndroid Build Coastguard Worker     int64_t previousCEUnsafe(UChar32 c, UVector32 &offsets, UErrorCode &errorCode);
305*0e209d39SAndroid Build Coastguard Worker 
306*0e209d39SAndroid Build Coastguard Worker     /**
307*0e209d39SAndroid Build Coastguard Worker      * Turns a string of digits (bytes 0..9)
308*0e209d39SAndroid Build Coastguard Worker      * into a sequence of CEs that will sort in numeric order.
309*0e209d39SAndroid Build Coastguard Worker      *
310*0e209d39SAndroid Build Coastguard Worker      * Starts from this ce32's digit value and consumes the following/preceding digits.
311*0e209d39SAndroid Build Coastguard Worker      * The digits string must not be empty and must not have leading zeros.
312*0e209d39SAndroid Build Coastguard Worker      */
313*0e209d39SAndroid Build Coastguard Worker     void appendNumericCEs(uint32_t ce32, UBool forward, UErrorCode &errorCode);
314*0e209d39SAndroid Build Coastguard Worker 
315*0e209d39SAndroid Build Coastguard Worker     /**
316*0e209d39SAndroid Build Coastguard Worker      * Turns 1..254 digits into a sequence of CEs.
317*0e209d39SAndroid Build Coastguard Worker      * Called by appendNumericCEs() for each segment of at most 254 digits.
318*0e209d39SAndroid Build Coastguard Worker      */
319*0e209d39SAndroid Build Coastguard Worker     void appendNumericSegmentCEs(const char *digits, int32_t length, UErrorCode &errorCode);
320*0e209d39SAndroid Build Coastguard Worker 
321*0e209d39SAndroid Build Coastguard Worker     CEBuffer ceBuffer;
322*0e209d39SAndroid Build Coastguard Worker     int32_t cesIndex;
323*0e209d39SAndroid Build Coastguard Worker 
324*0e209d39SAndroid Build Coastguard Worker     SkippedState *skipped;
325*0e209d39SAndroid Build Coastguard Worker 
326*0e209d39SAndroid Build Coastguard Worker     // Number of code points to read forward, or -1.
327*0e209d39SAndroid Build Coastguard Worker     // Used as a forward iteration limit in previousCEUnsafe().
328*0e209d39SAndroid Build Coastguard Worker     int32_t numCpFwd;
329*0e209d39SAndroid Build Coastguard Worker     // Numeric collation (CollationSettings::NUMERIC).
330*0e209d39SAndroid Build Coastguard Worker     UBool isNumeric;
331*0e209d39SAndroid Build Coastguard Worker };
332*0e209d39SAndroid Build Coastguard Worker 
333*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END
334*0e209d39SAndroid Build Coastguard Worker 
335*0e209d39SAndroid Build Coastguard Worker #endif  // !UCONFIG_NO_COLLATION
336*0e209d39SAndroid Build Coastguard Worker #endif  // __COLLATIONITERATOR_H__
337