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 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 : 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
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 UBool operator==(const Collator& other) const;
00227
00233 virtual RuleBasedCollator* clone() const;
00234
00245 virtual CollationElementIterator* createCollationElementIterator(
00246 const UnicodeString& source) const;
00247
00257 virtual CollationElementIterator* createCollationElementIterator(
00258 const CharacterIterator& source) const;
00259
00260
00261 using Collator::compare;
00262
00275 virtual UCollationResult compare(const UnicodeString& source,
00276 const UnicodeString& target,
00277 UErrorCode &status) const;
00278
00292 virtual UCollationResult compare(const UnicodeString& source,
00293 const UnicodeString& target,
00294 int32_t length,
00295 UErrorCode &status) const;
00296
00313 virtual UCollationResult compare(const char16_t* source, int32_t sourceLength,
00314 const char16_t* target, int32_t targetLength,
00315 UErrorCode &status) const;
00316
00328 virtual UCollationResult compare(UCharIterator &sIter,
00329 UCharIterator &tIter,
00330 UErrorCode &status) const;
00331
00345 virtual UCollationResult compareUTF8(const StringPiece &source,
00346 const StringPiece &target,
00347 UErrorCode &status) const;
00348
00363 virtual CollationKey& getCollationKey(const UnicodeString& source,
00364 CollationKey& key,
00365 UErrorCode& status) const;
00366
00382 virtual CollationKey& getCollationKey(const char16_t *source,
00383 int32_t sourceLength,
00384 CollationKey& key,
00385 UErrorCode& status) const;
00386
00392 virtual int32_t hashCode() const;
00393
00394 #ifndef U_FORCE_HIDE_DEPRECATED_API
00395
00405 virtual Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const;
00406 #endif // U_FORCE_HIDE_DEPRECATED_API
00407
00413 const UnicodeString& getRules() const;
00414
00420 virtual void getVersion(UVersionInfo info) const;
00421
00422 #ifndef U_HIDE_DEPRECATED_API
00423
00439 int32_t getMaxExpansion(int32_t order) const;
00440 #endif
00441
00452 virtual UClassID getDynamicClassID(void) const;
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
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);
00515
00523 virtual UColAttributeValue getAttribute(UColAttribute attr,
00524 UErrorCode &status) const;
00525
00542 virtual Collator &setMaxVariable(UColReorderCode group, UErrorCode &errorCode);
00543
00550 virtual UColReorderCode getMaxVariable() const;
00551
00552 #ifndef U_FORCE_HIDE_DEPRECATED_API
00553
00569 virtual uint32_t setVariableTop(const char16_t *varTop, int32_t len, UErrorCode &status);
00570
00586 virtual uint32_t setVariableTop(const UnicodeString &varTop, UErrorCode &status);
00587
00599 virtual void setVariableTop(uint32_t varTop, UErrorCode &status);
00600 #endif // U_FORCE_HIDE_DEPRECATED_API
00601
00609 virtual uint32_t getVariableTop(UErrorCode &status) const;
00610
00620 virtual UnicodeSet *getTailoredSet(UErrorCode &status) const;
00621
00636 virtual int32_t getSortKey(const UnicodeString& source, uint8_t *result,
00637 int32_t resultLength) const;
00638
00655 virtual int32_t getSortKey(const char16_t *source, int32_t sourceLength,
00656 uint8_t *result, int32_t resultLength) const;
00657
00671 virtual int32_t getReorderCodes(int32_t *dest,
00672 int32_t destCapacity,
00673 UErrorCode& status) const;
00674
00686 virtual void setReorderCodes(const int32_t* reorderCodes,
00687 int32_t reorderCodesLength,
00688 UErrorCode& status) ;
00689
00694 virtual UCollationResult internalCompareUTF8(
00695 const char *left, int32_t leftLength,
00696 const char *right, int32_t rightLength,
00697 UErrorCode &errorCode) const;
00698
00722 virtual int32_t internalGetShortDefinitionString(const char *locale,
00723 char *buffer,
00724 int32_t capacity,
00725 UErrorCode &status) const;
00726
00731 virtual int32_t internalNextSortKeyPart(
00732 UCharIterator *iter, uint32_t state[2],
00733 uint8_t *dest, int32_t count, UErrorCode &errorCode) const;
00734
00735
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);
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
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
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;
00872 const CollationTailoring *tailoring;
00873 const CollationCacheEntry *cacheEntry;
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
00885
00886 #endif // TBLCOLL_H