ICU 73.2  73.2
tblcoll.h
Go to the documentation of this file.
00001 // © 2016 and later: Unicode, Inc. and others.
00002 // License & terms of use: http://www.unicode.org/copyright.html
00003 /*
00004 ******************************************************************************
00005 * Copyright (C) 1996-2016, International Business Machines Corporation and
00006 * others. All Rights Reserved.
00007 ******************************************************************************
00008 */
00009 
00062 #ifndef TBLCOLL_H
00063 #define TBLCOLL_H
00064 
00065 #include "unicode/utypes.h"
00066 
00067 #if U_SHOW_CPLUSPLUS_API
00068 
00069 #if !UCONFIG_NO_COLLATION
00070 
00071 #include "unicode/coll.h"
00072 #include "unicode/locid.h"
00073 #include "unicode/uiter.h"
00074 #include "unicode/ucol.h"
00075 
00076 U_NAMESPACE_BEGIN
00077 
00078 struct CollationCacheEntry;
00079 struct CollationData;
00080 struct CollationSettings;
00081 struct CollationTailoring;
00085 class StringSearch;
00089 class CollationElementIterator;
00090 class CollationKey;
00091 class SortKeyByteSink;
00092 class UnicodeSet;
00093 class UnicodeString;
00094 class UVector64;
00095 
00115 class U_I18N_API RuleBasedCollator final : public Collator {
00116 public:
00125     RuleBasedCollator(const UnicodeString& rules, UErrorCode& status);
00126 
00136     RuleBasedCollator(const UnicodeString& rules,
00137                        ECollationStrength collationStrength,
00138                        UErrorCode& status);
00139 
00149     RuleBasedCollator(const UnicodeString& rules,
00150                     UColAttributeValue decompositionMode,
00151                     UErrorCode& status);
00152 
00163     RuleBasedCollator(const UnicodeString& rules,
00164                     ECollationStrength collationStrength,
00165                     UColAttributeValue decompositionMode,
00166                     UErrorCode& status);
00167 
00168 #ifndef U_HIDE_INTERNAL_API
00169 
00173     RuleBasedCollator(const UnicodeString &rules,
00174                       UParseError &parseError, UnicodeString &reason,
00175                       UErrorCode &errorCode);
00176 #endif  /* U_HIDE_INTERNAL_API */
00177 
00183     RuleBasedCollator(const RuleBasedCollator& other);
00184 
00185 
00203     RuleBasedCollator(const uint8_t *bin, int32_t length,
00204                     const RuleBasedCollator *base,
00205                     UErrorCode &status);
00206 
00211     virtual ~RuleBasedCollator();
00212 
00218     RuleBasedCollator& operator=(const RuleBasedCollator& other);
00219 
00226     virtual bool operator==(const Collator& other) const override;
00227 
00233     virtual RuleBasedCollator* clone() const override;
00234 
00245     virtual CollationElementIterator* createCollationElementIterator(
00246                                            const UnicodeString& source) const;
00247 
00257     virtual CollationElementIterator* createCollationElementIterator(
00258                                          const CharacterIterator& source) const;
00259 
00260     // Make deprecated versions of Collator::compare() visible.
00261     using Collator::compare;
00262 
00275     virtual UCollationResult compare(const UnicodeString& source,
00276                                      const UnicodeString& target,
00277                                      UErrorCode &status) const override;
00278 
00292     virtual UCollationResult compare(const UnicodeString& source,
00293                                      const UnicodeString& target,
00294                                      int32_t length,
00295                                      UErrorCode &status) const override;
00296 
00313     virtual UCollationResult compare(const char16_t* source, int32_t sourceLength,
00314                                      const char16_t* target, int32_t targetLength,
00315                                      UErrorCode &status) const override;
00316 
00328     virtual UCollationResult compare(UCharIterator &sIter,
00329                                      UCharIterator &tIter,
00330                                      UErrorCode &status) const override;
00331 
00345     virtual UCollationResult compareUTF8(const StringPiece &source,
00346                                          const StringPiece &target,
00347                                          UErrorCode &status) const override;
00348 
00363     virtual CollationKey& getCollationKey(const UnicodeString& source,
00364                                           CollationKey& key,
00365                                           UErrorCode& status) const override;
00366 
00382     virtual CollationKey& getCollationKey(const char16_t *source,
00383                                           int32_t sourceLength,
00384                                           CollationKey& key,
00385                                           UErrorCode& status) const override;
00386 
00392     virtual int32_t hashCode() const override;
00393 
00394 #ifndef U_FORCE_HIDE_DEPRECATED_API
00395 
00405     virtual Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const override;
00406 #endif  // U_FORCE_HIDE_DEPRECATED_API
00407 
00413     const UnicodeString& getRules() const;
00414 
00420     virtual void getVersion(UVersionInfo info) const override;
00421 
00422 #ifndef U_HIDE_DEPRECATED_API
00423 
00439     int32_t getMaxExpansion(int32_t order) const;
00440 #endif  /* U_HIDE_DEPRECATED_API */
00441 
00452     virtual UClassID getDynamicClassID(void) const override;
00453 
00465     static UClassID U_EXPORT2 getStaticClassID(void);
00466 
00467 #ifndef U_HIDE_DEPRECATED_API
00468 
00478     uint8_t *cloneRuleData(int32_t &length, UErrorCode &status) const;
00479 #endif  /* U_HIDE_DEPRECATED_API */
00480 
00491     int32_t cloneBinary(uint8_t *buffer, int32_t capacity, UErrorCode &status) const;
00492 
00504     void getRules(UColRuleOption delta, UnicodeString &buffer) const;
00505 
00513     virtual void setAttribute(UColAttribute attr, UColAttributeValue value,
00514                               UErrorCode &status) override;
00515 
00523     virtual UColAttributeValue getAttribute(UColAttribute attr,
00524                                             UErrorCode &status) const override;
00525 
00542     virtual Collator &setMaxVariable(UColReorderCode group, UErrorCode &errorCode) override;
00543 
00550     virtual UColReorderCode getMaxVariable() const override;
00551 
00552 #ifndef U_FORCE_HIDE_DEPRECATED_API
00553 
00569     virtual uint32_t setVariableTop(const char16_t *varTop, int32_t len, UErrorCode &status) override;
00570 
00586     virtual uint32_t setVariableTop(const UnicodeString &varTop, UErrorCode &status) override;
00587 
00599     virtual void setVariableTop(uint32_t varTop, UErrorCode &status) override;
00600 #endif  // U_FORCE_HIDE_DEPRECATED_API
00601 
00609     virtual uint32_t getVariableTop(UErrorCode &status) const override;
00610 
00620     virtual UnicodeSet *getTailoredSet(UErrorCode &status) const override;
00621 
00636     virtual int32_t getSortKey(const UnicodeString& source, uint8_t *result,
00637                                int32_t resultLength) const override;
00638 
00655     virtual int32_t getSortKey(const char16_t *source, int32_t sourceLength,
00656                                uint8_t *result, int32_t resultLength) const override;
00657 
00671      virtual int32_t getReorderCodes(int32_t *dest,
00672                                      int32_t destCapacity,
00673                                      UErrorCode& status) const override;
00674 
00686      virtual void setReorderCodes(const int32_t* reorderCodes,
00687                                   int32_t reorderCodesLength,
00688                                   UErrorCode& status) override;
00689 
00694     virtual UCollationResult internalCompareUTF8(
00695             const char *left, int32_t leftLength,
00696             const char *right, int32_t rightLength,
00697             UErrorCode &errorCode) const override;
00698 
00722     virtual int32_t internalGetShortDefinitionString(const char *locale,
00723                                                      char *buffer,
00724                                                      int32_t capacity,
00725                                                      UErrorCode &status) const override;
00726 
00731     virtual int32_t internalNextSortKeyPart(
00732             UCharIterator *iter, uint32_t state[2],
00733             uint8_t *dest, int32_t count, UErrorCode &errorCode) const override;
00734 
00735     // Do not enclose the default constructor with #ifndef U_HIDE_INTERNAL_API
00740     RuleBasedCollator();
00741 
00742 #ifndef U_HIDE_INTERNAL_API
00743 
00749     const char *internalGetLocaleID(ULocDataLocaleType type, UErrorCode &errorCode) const;
00750 
00763     void internalGetContractionsAndExpansions(
00764             UnicodeSet *contractions, UnicodeSet *expansions,
00765             UBool addPrefixes, UErrorCode &errorCode) const;
00766 
00772     void internalAddContractions(UChar32 c, UnicodeSet &set, UErrorCode &errorCode) const;
00773 
00778     void internalBuildTailoring(
00779             const UnicodeString &rules,
00780             int32_t strength,
00781             UColAttributeValue decompositionMode,
00782             UParseError *outParseError, UnicodeString *outReason,
00783             UErrorCode &errorCode);
00784 
00786     static inline RuleBasedCollator *rbcFromUCollator(UCollator *uc) {
00787         return dynamic_cast<RuleBasedCollator *>(fromUCollator(uc));
00788     }
00790     static inline const RuleBasedCollator *rbcFromUCollator(const UCollator *uc) {
00791         return dynamic_cast<const RuleBasedCollator *>(fromUCollator(uc));
00792     }
00793 
00798     void internalGetCEs(const UnicodeString &str, UVector64 &ces, UErrorCode &errorCode) const;
00799 #endif  // U_HIDE_INTERNAL_API
00800 
00801 protected:
00809     virtual void setLocales(const Locale& requestedLocale, const Locale& validLocale, const Locale& actualLocale) override;
00810 
00811 private:
00812     friend class CollationElementIterator;
00813     friend class Collator;
00814 
00815     RuleBasedCollator(const CollationCacheEntry *entry);
00816 
00822     enum Attributes {
00823         ATTR_VARIABLE_TOP = UCOL_ATTRIBUTE_COUNT,
00824         ATTR_LIMIT
00825     };
00826 
00827     void adoptTailoring(CollationTailoring *t, UErrorCode &errorCode);
00828 
00829     // Both lengths must be <0 or else both must be >=0.
00830     UCollationResult doCompare(const char16_t *left, int32_t leftLength,
00831                                const char16_t *right, int32_t rightLength,
00832                                UErrorCode &errorCode) const;
00833     UCollationResult doCompare(const uint8_t *left, int32_t leftLength,
00834                                const uint8_t *right, int32_t rightLength,
00835                                UErrorCode &errorCode) const;
00836 
00837     void writeSortKey(const char16_t *s, int32_t length,
00838                       SortKeyByteSink &sink, UErrorCode &errorCode) const;
00839 
00840     void writeIdenticalLevel(const char16_t *s, const char16_t *limit,
00841                              SortKeyByteSink &sink, UErrorCode &errorCode) const;
00842 
00843     const CollationSettings &getDefaultSettings() const;
00844 
00845     void setAttributeDefault(int32_t attribute) {
00846         explicitlySetAttributes &= ~((uint32_t)1 << attribute);
00847     }
00848     void setAttributeExplicitly(int32_t attribute) {
00849         explicitlySetAttributes |= (uint32_t)1 << attribute;
00850     }
00851     UBool attributeHasBeenSetExplicitly(int32_t attribute) const {
00852         // assert(0 <= attribute < ATTR_LIMIT);
00853         return (UBool)((explicitlySetAttributes & ((uint32_t)1 << attribute)) != 0);
00854     }
00855 
00863     UBool isUnsafe(UChar32 c) const;
00864 
00865     static void U_CALLCONV computeMaxExpansions(const CollationTailoring *t, UErrorCode &errorCode);
00866     UBool initMaxExpansions(UErrorCode &errorCode) const;
00867 
00868     void setFastLatinOptions(CollationSettings &ownedSettings) const;
00869 
00870     const CollationData *data;
00871     const CollationSettings *settings;  // reference-counted
00872     const CollationTailoring *tailoring;  // alias of cacheEntry->tailoring
00873     const CollationCacheEntry *cacheEntry;  // reference-counted
00874     Locale validLocale;
00875     uint32_t explicitlySetAttributes;
00876 
00877     UBool actualLocaleIsSameAsValid;
00878 };
00879 
00880 U_NAMESPACE_END
00881 
00882 #endif  // !UCONFIG_NO_COLLATION
00883 
00884 #endif /* U_SHOW_CPLUSPLUS_API */
00885 
00886 #endif  // TBLCOLL_H