00001
00002
00003
00004
00005
00006
00007
00008
00009
00062 #ifndef TBLCOLL_H
00063 #define TBLCOLL_H
00064
00065 #include "unicode/utypes.h"
00066
00067 #if !UCONFIG_NO_COLLATION
00068
00069 #include "unicode/coll.h"
00070 #include "unicode/locid.h"
00071 #include "unicode/uiter.h"
00072 #include "unicode/ucol.h"
00073
00074 U_NAMESPACE_BEGIN
00075
00076 struct CollationCacheEntry;
00077 struct CollationData;
00078 struct CollationSettings;
00079 struct CollationTailoring;
00083 class StringSearch;
00087 class CollationElementIterator;
00088 class CollationKey;
00089 class SortKeyByteSink;
00090 class UnicodeSet;
00091 class UnicodeString;
00092 class UVector64;
00093
00113 class U_I18N_API RuleBasedCollator : public Collator {
00114 public:
00123 RuleBasedCollator(const UnicodeString& rules, UErrorCode& status);
00124
00134 RuleBasedCollator(const UnicodeString& rules,
00135 ECollationStrength collationStrength,
00136 UErrorCode& status);
00137
00147 RuleBasedCollator(const UnicodeString& rules,
00148 UColAttributeValue decompositionMode,
00149 UErrorCode& status);
00150
00161 RuleBasedCollator(const UnicodeString& rules,
00162 ECollationStrength collationStrength,
00163 UColAttributeValue decompositionMode,
00164 UErrorCode& status);
00165
00166 #ifndef U_HIDE_INTERNAL_API
00167
00171 RuleBasedCollator(const UnicodeString &rules,
00172 UParseError &parseError, UnicodeString &reason,
00173 UErrorCode &errorCode);
00174 #endif
00175
00181 RuleBasedCollator(const RuleBasedCollator& other);
00182
00183
00201 RuleBasedCollator(const uint8_t *bin, int32_t length,
00202 const RuleBasedCollator *base,
00203 UErrorCode &status);
00204
00209 virtual ~RuleBasedCollator();
00210
00216 RuleBasedCollator& operator=(const RuleBasedCollator& other);
00217
00224 virtual UBool operator==(const Collator& other) const;
00225
00231 virtual Collator* clone(void) const;
00232
00243 virtual CollationElementIterator* createCollationElementIterator(
00244 const UnicodeString& source) const;
00245
00255 virtual CollationElementIterator* createCollationElementIterator(
00256 const CharacterIterator& source) const;
00257
00258
00259 using Collator::compare;
00260
00273 virtual UCollationResult compare(const UnicodeString& source,
00274 const UnicodeString& target,
00275 UErrorCode &status) const;
00276
00290 virtual UCollationResult compare(const UnicodeString& source,
00291 const UnicodeString& target,
00292 int32_t length,
00293 UErrorCode &status) const;
00294
00311 virtual UCollationResult compare(const char16_t* source, int32_t sourceLength,
00312 const char16_t* target, int32_t targetLength,
00313 UErrorCode &status) const;
00314
00326 virtual UCollationResult compare(UCharIterator &sIter,
00327 UCharIterator &tIter,
00328 UErrorCode &status) const;
00329
00343 virtual UCollationResult compareUTF8(const StringPiece &source,
00344 const StringPiece &target,
00345 UErrorCode &status) const;
00346
00361 virtual CollationKey& getCollationKey(const UnicodeString& source,
00362 CollationKey& key,
00363 UErrorCode& status) const;
00364
00380 virtual CollationKey& getCollationKey(const char16_t *source,
00381 int32_t sourceLength,
00382 CollationKey& key,
00383 UErrorCode& status) const;
00384
00390 virtual int32_t hashCode() const;
00391
00402 virtual Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const;
00403
00409 const UnicodeString& getRules() const;
00410
00416 virtual void getVersion(UVersionInfo info) const;
00417
00418 #ifndef U_HIDE_DEPRECATED_API
00419
00435 int32_t getMaxExpansion(int32_t order) const;
00436 #endif
00437
00448 virtual UClassID getDynamicClassID(void) const;
00449
00461 static UClassID U_EXPORT2 getStaticClassID(void);
00462
00463 #ifndef U_HIDE_DEPRECATED_API
00464
00474 uint8_t *cloneRuleData(int32_t &length, UErrorCode &status) const;
00475 #endif
00476
00487 int32_t cloneBinary(uint8_t *buffer, int32_t capacity, UErrorCode &status) const;
00488
00500 void getRules(UColRuleOption delta, UnicodeString &buffer) const;
00501
00509 virtual void setAttribute(UColAttribute attr, UColAttributeValue value,
00510 UErrorCode &status);
00511
00519 virtual UColAttributeValue getAttribute(UColAttribute attr,
00520 UErrorCode &status) const;
00521
00538 virtual Collator &setMaxVariable(UColReorderCode group, UErrorCode &errorCode);
00539
00546 virtual UColReorderCode getMaxVariable() const;
00547
00564 virtual uint32_t setVariableTop(const char16_t *varTop, int32_t len, UErrorCode &status);
00565
00581 virtual uint32_t setVariableTop(const UnicodeString &varTop, UErrorCode &status);
00582
00594 virtual void setVariableTop(uint32_t varTop, UErrorCode &status);
00595
00603 virtual uint32_t getVariableTop(UErrorCode &status) const;
00604
00614 virtual UnicodeSet *getTailoredSet(UErrorCode &status) const;
00615
00630 virtual int32_t getSortKey(const UnicodeString& source, uint8_t *result,
00631 int32_t resultLength) const;
00632
00649 virtual int32_t getSortKey(const char16_t *source, int32_t sourceLength,
00650 uint8_t *result, int32_t resultLength) const;
00651
00665 virtual int32_t getReorderCodes(int32_t *dest,
00666 int32_t destCapacity,
00667 UErrorCode& status) const;
00668
00680 virtual void setReorderCodes(const int32_t* reorderCodes,
00681 int32_t reorderCodesLength,
00682 UErrorCode& status) ;
00683
00688 virtual UCollationResult internalCompareUTF8(
00689 const char *left, int32_t leftLength,
00690 const char *right, int32_t rightLength,
00691 UErrorCode &errorCode) const;
00692
00716 virtual int32_t internalGetShortDefinitionString(const char *locale,
00717 char *buffer,
00718 int32_t capacity,
00719 UErrorCode &status) const;
00720
00725 virtual int32_t internalNextSortKeyPart(
00726 UCharIterator *iter, uint32_t state[2],
00727 uint8_t *dest, int32_t count, UErrorCode &errorCode) const;
00728
00729
00734 RuleBasedCollator();
00735
00736 #ifndef U_HIDE_INTERNAL_API
00737
00743 const char *internalGetLocaleID(ULocDataLocaleType type, UErrorCode &errorCode) const;
00744
00757 void internalGetContractionsAndExpansions(
00758 UnicodeSet *contractions, UnicodeSet *expansions,
00759 UBool addPrefixes, UErrorCode &errorCode) const;
00760
00766 void internalAddContractions(UChar32 c, UnicodeSet &set, UErrorCode &errorCode) const;
00767
00772 void internalBuildTailoring(
00773 const UnicodeString &rules,
00774 int32_t strength,
00775 UColAttributeValue decompositionMode,
00776 UParseError *outParseError, UnicodeString *outReason,
00777 UErrorCode &errorCode);
00778
00780 static inline RuleBasedCollator *rbcFromUCollator(UCollator *uc) {
00781 return dynamic_cast<RuleBasedCollator *>(fromUCollator(uc));
00782 }
00784 static inline const RuleBasedCollator *rbcFromUCollator(const UCollator *uc) {
00785 return dynamic_cast<const RuleBasedCollator *>(fromUCollator(uc));
00786 }
00787
00792 void internalGetCEs(const UnicodeString &str, UVector64 &ces, UErrorCode &errorCode) const;
00793 #endif // U_HIDE_INTERNAL_API
00794
00795 protected:
00803 virtual void setLocales(const Locale& requestedLocale, const Locale& validLocale, const Locale& actualLocale);
00804
00805 private:
00806 friend class CollationElementIterator;
00807 friend class Collator;
00808
00809 RuleBasedCollator(const CollationCacheEntry *entry);
00810
00816 enum Attributes {
00817 ATTR_VARIABLE_TOP = UCOL_ATTRIBUTE_COUNT,
00818 ATTR_LIMIT
00819 };
00820
00821 void adoptTailoring(CollationTailoring *t, UErrorCode &errorCode);
00822
00823
00824 UCollationResult doCompare(const char16_t *left, int32_t leftLength,
00825 const char16_t *right, int32_t rightLength,
00826 UErrorCode &errorCode) const;
00827 UCollationResult doCompare(const uint8_t *left, int32_t leftLength,
00828 const uint8_t *right, int32_t rightLength,
00829 UErrorCode &errorCode) const;
00830
00831 void writeSortKey(const char16_t *s, int32_t length,
00832 SortKeyByteSink &sink, UErrorCode &errorCode) const;
00833
00834 void writeIdenticalLevel(const char16_t *s, const char16_t *limit,
00835 SortKeyByteSink &sink, UErrorCode &errorCode) const;
00836
00837 const CollationSettings &getDefaultSettings() const;
00838
00839 void setAttributeDefault(int32_t attribute) {
00840 explicitlySetAttributes &= ~((uint32_t)1 << attribute);
00841 }
00842 void setAttributeExplicitly(int32_t attribute) {
00843 explicitlySetAttributes |= (uint32_t)1 << attribute;
00844 }
00845 UBool attributeHasBeenSetExplicitly(int32_t attribute) const {
00846
00847 return (UBool)((explicitlySetAttributes & ((uint32_t)1 << attribute)) != 0);
00848 }
00849
00857 UBool isUnsafe(UChar32 c) const;
00858
00859 static void U_CALLCONV computeMaxExpansions(const CollationTailoring *t, UErrorCode &errorCode);
00860 UBool initMaxExpansions(UErrorCode &errorCode) const;
00861
00862 void setFastLatinOptions(CollationSettings &ownedSettings) const;
00863
00864 const CollationData *data;
00865 const CollationSettings *settings;
00866 const CollationTailoring *tailoring;
00867 const CollationCacheEntry *cacheEntry;
00868 Locale validLocale;
00869 uint32_t explicitlySetAttributes;
00870
00871 UBool actualLocaleIsSameAsValid;
00872 };
00873
00874 U_NAMESPACE_END
00875
00876 #endif // !UCONFIG_NO_COLLATION
00877 #endif // TBLCOLL_H