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