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) 2013-2016, International Business Machines 6*0e209d39SAndroid Build Coastguard Worker * Corporation and others. All Rights Reserved. 7*0e209d39SAndroid Build Coastguard Worker ******************************************************************************* 8*0e209d39SAndroid Build Coastguard Worker * collationfastlatinbuilder.h 9*0e209d39SAndroid Build Coastguard Worker * 10*0e209d39SAndroid Build Coastguard Worker * created on: 2013aug09 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 __COLLATIONFASTLATINBUILDER_H__ 15*0e209d39SAndroid Build Coastguard Worker #define __COLLATIONFASTLATINBUILDER_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 "unicode/ucol.h" 22*0e209d39SAndroid Build Coastguard Worker #include "unicode/unistr.h" 23*0e209d39SAndroid Build Coastguard Worker #include "unicode/uobject.h" 24*0e209d39SAndroid Build Coastguard Worker #include "collation.h" 25*0e209d39SAndroid Build Coastguard Worker #include "collationfastlatin.h" 26*0e209d39SAndroid Build Coastguard Worker #include "uvectr64.h" 27*0e209d39SAndroid Build Coastguard Worker 28*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN 29*0e209d39SAndroid Build Coastguard Worker 30*0e209d39SAndroid Build Coastguard Worker struct CollationData; 31*0e209d39SAndroid Build Coastguard Worker 32*0e209d39SAndroid Build Coastguard Worker class U_I18N_API CollationFastLatinBuilder : public UObject { 33*0e209d39SAndroid Build Coastguard Worker public: 34*0e209d39SAndroid Build Coastguard Worker CollationFastLatinBuilder(UErrorCode &errorCode); 35*0e209d39SAndroid Build Coastguard Worker ~CollationFastLatinBuilder(); 36*0e209d39SAndroid Build Coastguard Worker 37*0e209d39SAndroid Build Coastguard Worker UBool forData(const CollationData &data, UErrorCode &errorCode); 38*0e209d39SAndroid Build Coastguard Worker getTable()39*0e209d39SAndroid Build Coastguard Worker const uint16_t *getTable() const { 40*0e209d39SAndroid Build Coastguard Worker return reinterpret_cast<const uint16_t *>(result.getBuffer()); 41*0e209d39SAndroid Build Coastguard Worker } lengthOfTable()42*0e209d39SAndroid Build Coastguard Worker int32_t lengthOfTable() const { return result.length(); } 43*0e209d39SAndroid Build Coastguard Worker 44*0e209d39SAndroid Build Coastguard Worker private: 45*0e209d39SAndroid Build Coastguard Worker // space, punct, symbol, currency (not digit) 46*0e209d39SAndroid Build Coastguard Worker enum { NUM_SPECIAL_GROUPS = UCOL_REORDER_CODE_CURRENCY - UCOL_REORDER_CODE_FIRST + 1 }; 47*0e209d39SAndroid Build Coastguard Worker 48*0e209d39SAndroid Build Coastguard Worker UBool loadGroups(const CollationData &data, UErrorCode &errorCode); 49*0e209d39SAndroid Build Coastguard Worker UBool inSameGroup(uint32_t p, uint32_t q) const; 50*0e209d39SAndroid Build Coastguard Worker 51*0e209d39SAndroid Build Coastguard Worker void resetCEs(); 52*0e209d39SAndroid Build Coastguard Worker void getCEs(const CollationData &data, UErrorCode &errorCode); 53*0e209d39SAndroid Build Coastguard Worker UBool getCEsFromCE32(const CollationData &data, UChar32 c, uint32_t ce32, 54*0e209d39SAndroid Build Coastguard Worker UErrorCode &errorCode); 55*0e209d39SAndroid Build Coastguard Worker UBool getCEsFromContractionCE32(const CollationData &data, uint32_t ce32, 56*0e209d39SAndroid Build Coastguard Worker UErrorCode &errorCode); 57*0e209d39SAndroid Build Coastguard Worker void addContractionEntry(int32_t x, int64_t cce0, int64_t cce1, UErrorCode &errorCode); 58*0e209d39SAndroid Build Coastguard Worker void addUniqueCE(int64_t ce, UErrorCode &errorCode); 59*0e209d39SAndroid Build Coastguard Worker uint32_t getMiniCE(int64_t ce) const; 60*0e209d39SAndroid Build Coastguard Worker UBool encodeUniqueCEs(UErrorCode &errorCode); 61*0e209d39SAndroid Build Coastguard Worker UBool encodeCharCEs(UErrorCode &errorCode); 62*0e209d39SAndroid Build Coastguard Worker UBool encodeContractions(UErrorCode &errorCode); 63*0e209d39SAndroid Build Coastguard Worker uint32_t encodeTwoCEs(int64_t first, int64_t second) const; 64*0e209d39SAndroid Build Coastguard Worker isContractionCharCE(int64_t ce)65*0e209d39SAndroid Build Coastguard Worker static UBool isContractionCharCE(int64_t ce) { 66*0e209d39SAndroid Build Coastguard Worker return (uint32_t)(ce >> 32) == Collation::NO_CE_PRIMARY && ce != Collation::NO_CE; 67*0e209d39SAndroid Build Coastguard Worker } 68*0e209d39SAndroid Build Coastguard Worker 69*0e209d39SAndroid Build Coastguard Worker static const uint32_t CONTRACTION_FLAG = 0x80000000; 70*0e209d39SAndroid Build Coastguard Worker 71*0e209d39SAndroid Build Coastguard Worker // temporary "buffer" 72*0e209d39SAndroid Build Coastguard Worker int64_t ce0, ce1; 73*0e209d39SAndroid Build Coastguard Worker 74*0e209d39SAndroid Build Coastguard Worker int64_t charCEs[CollationFastLatin::NUM_FAST_CHARS][2]; 75*0e209d39SAndroid Build Coastguard Worker 76*0e209d39SAndroid Build Coastguard Worker UVector64 contractionCEs; 77*0e209d39SAndroid Build Coastguard Worker UVector64 uniqueCEs; 78*0e209d39SAndroid Build Coastguard Worker 79*0e209d39SAndroid Build Coastguard Worker /** One 16-bit mini CE per unique CE. */ 80*0e209d39SAndroid Build Coastguard Worker uint16_t *miniCEs; 81*0e209d39SAndroid Build Coastguard Worker 82*0e209d39SAndroid Build Coastguard Worker // These are constant for a given root collator. 83*0e209d39SAndroid Build Coastguard Worker uint32_t lastSpecialPrimaries[NUM_SPECIAL_GROUPS]; 84*0e209d39SAndroid Build Coastguard Worker uint32_t firstDigitPrimary; 85*0e209d39SAndroid Build Coastguard Worker uint32_t firstLatinPrimary; 86*0e209d39SAndroid Build Coastguard Worker uint32_t lastLatinPrimary; 87*0e209d39SAndroid Build Coastguard Worker // This determines the first normal primary weight which is mapped to 88*0e209d39SAndroid Build Coastguard Worker // a short mini primary. It must be >=firstDigitPrimary. 89*0e209d39SAndroid Build Coastguard Worker uint32_t firstShortPrimary; 90*0e209d39SAndroid Build Coastguard Worker 91*0e209d39SAndroid Build Coastguard Worker UBool shortPrimaryOverflow; 92*0e209d39SAndroid Build Coastguard Worker 93*0e209d39SAndroid Build Coastguard Worker UnicodeString result; 94*0e209d39SAndroid Build Coastguard Worker int32_t headerLength; 95*0e209d39SAndroid Build Coastguard Worker }; 96*0e209d39SAndroid Build Coastguard Worker 97*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END 98*0e209d39SAndroid Build Coastguard Worker 99*0e209d39SAndroid Build Coastguard Worker #endif // !UCONFIG_NO_COLLATION 100*0e209d39SAndroid Build Coastguard Worker #endif // __COLLATIONFASTLATINBUILDER_H__ 101