| // © 2017 and later: Unicode, Inc. and others. | 
 | // License & terms of use: http://www.unicode.org/copyright.html | 
 | /* | 
 | ******************************************************************************* | 
 | * Copyright (C) 2012-2015, International Business Machines | 
 | * Corporation and others.  All Rights Reserved. | 
 | ******************************************************************************* | 
 | * collationbasedatabuilder.h | 
 | * | 
 | * created on: 2012aug11 | 
 | * created by: Markus W. Scherer | 
 | */ | 
 |  | 
 | #ifndef __COLLATIONBASEDATABUILDER_H__ | 
 | #define __COLLATIONBASEDATABUILDER_H__ | 
 |  | 
 | #include "unicode/utypes.h" | 
 |  | 
 | #if !UCONFIG_NO_COLLATION | 
 |  | 
 | #include "unicode/uniset.h" | 
 | #include "unicode/unistr.h" | 
 | #include "unicode/uscript.h" | 
 | #include "collation.h" | 
 | #include "collationdata.h" | 
 | #include "collationdatabuilder.h" | 
 | #include "normalizer2impl.h" | 
 | #include "utrie2.h" | 
 | #include "uvectr32.h" | 
 | #include "uvectr64.h" | 
 | #include "uvector.h" | 
 |  | 
 | U_NAMESPACE_BEGIN | 
 |  | 
 | /** | 
 |  * Low-level base CollationData builder. | 
 |  */ | 
 | class U_I18N_API CollationBaseDataBuilder : public CollationDataBuilder { | 
 | public: | 
 |     CollationBaseDataBuilder(UErrorCode &errorCode); | 
 |  | 
 |     virtual ~CollationBaseDataBuilder(); | 
 |  | 
 |     void init(UErrorCode &errorCode); | 
 |  | 
 |     /** | 
 |      * Sets the Han ranges as ranges of offset CE32s. | 
 |      * Note: Unihan extension A sorts after the other BMP ranges. | 
 |      * See http://www.unicode.org/reports/tr10/#Implicit_Weights | 
 |      * | 
 |      * @param ranges array of ranges of [:Unified_Ideograph:] in collation order, | 
 |      *               as (start, end) code point pairs | 
 |      * @param length number of code points (not pairs) | 
 |      * @param errorCode in/out error code | 
 |      */ | 
 |     void initHanRanges(const UChar32 ranges[], int32_t length, UErrorCode &errorCode); | 
 |  | 
 |     void setNumericPrimary(uint32_t np) { numericPrimary = np; } | 
 |  | 
 |     virtual UBool isCompressibleLeadByte(uint32_t b) const; | 
 |  | 
 |     void setCompressibleLeadByte(uint32_t b); | 
 |  | 
 |     static int32_t diffTwoBytePrimaries(uint32_t p1, uint32_t p2, UBool isCompressible); | 
 |     static int32_t diffThreeBytePrimaries(uint32_t p1, uint32_t p2, UBool isCompressible); | 
 |  | 
 |     virtual uint32_t encodeCEs(const int64_t ces[], int32_t cesLength, UErrorCode &errorCode); | 
 |  | 
 |     void addRootElements(const int64_t ces[], int32_t cesLength, UErrorCode &errorCode); | 
 |     void addRootElement(int64_t ce, UErrorCode &errorCode); | 
 |  | 
 |     void addScriptStart(int32_t script, uint32_t p); | 
 |  | 
 |     virtual void build(CollationData &data, UErrorCode &errorCode); | 
 |  | 
 |     void buildRootElementsTable(UVector32 &table, UErrorCode &errorCode); | 
 |  | 
 | private: | 
 |     int32_t writeRootElementsRange( | 
 |             uint32_t prevPrimary, uint32_t p, int32_t i, | 
 |             UVector32 &table, UErrorCode &errorCode); | 
 |  | 
 |     // Flags for which primary-weight lead bytes are compressible. | 
 |     UBool compressibleBytes[256]; | 
 |     uint32_t numericPrimary; | 
 |     uint32_t firstHanPrimary; | 
 |     uint32_t lastHanPrimary; | 
 |     int32_t hanStep; | 
 |     UVector64 rootElements; | 
 |     uint16_t scriptsIndex[USCRIPT_CODE_LIMIT + 16];  // need exactly this many | 
 |     uint16_t scriptStarts[USCRIPT_CODE_LIMIT + 16];  // should be safely more than needed | 
 |     int32_t scriptStartsLength; | 
 | }; | 
 |  | 
 | U_NAMESPACE_END | 
 |  | 
 | #endif  // !UCONFIG_NO_COLLATION | 
 | #endif  // __COLLATIONBASEDATABUILDER_H__ |