00001
00002
00003
00004
00005
00006
00007
00060 #ifndef TBLCOLL_H
00061 #define TBLCOLL_H
00062
00063 #include "unicode/utypes.h"
00064
00065 #if !UCONFIG_NO_COLLATION
00066
00067 #include "unicode/coll.h"
00068 #include "unicode/locid.h"
00069 #include "unicode/uiter.h"
00070 #include "unicode/ucol.h"
00071
00072 U_NAMESPACE_BEGIN
00073
00074 struct CollationCacheEntry;
00075 struct CollationData;
00076 struct CollationSettings;
00077 struct CollationTailoring;
00081 class StringSearch;
00085 class CollationElementIterator;
00086 class CollationKey;
00087 class SortKeyByteSink;
00088 class UnicodeSet;
00089 class UnicodeString;
00090 class UVector64;
00091
00111 class U_I18N_API RuleBasedCollator : public Collator {
00112 public:
00121 RuleBasedCollator(const UnicodeString& rules, UErrorCode& status);
00122
00132 RuleBasedCollator(const UnicodeString& rules,
00133 ECollationStrength collationStrength,
00134 UErrorCode& status);
00135
00145 RuleBasedCollator(const UnicodeString& rules,
00146 UColAttributeValue decompositionMode,
00147 UErrorCode& status);
00148
00159 RuleBasedCollator(const UnicodeString& rules,
00160 ECollationStrength collationStrength,
00161 UColAttributeValue decompositionMode,
00162 UErrorCode& status);
00163
00164 #ifndef U_HIDE_INTERNAL_API
00165
00169 RuleBasedCollator(const UnicodeString &rules,
00170 UParseError &parseError, UnicodeString &reason,
00171 UErrorCode &errorCode);
00172 #endif
00173
00179 RuleBasedCollator(const RuleBasedCollator& other);
00180
00181
00199 RuleBasedCollator(const uint8_t *bin, int32_t length,
00200 const RuleBasedCollator *base,
00201 UErrorCode &status);
00202
00207 virtual ~RuleBasedCollator();
00208
00214 RuleBasedCollator& operator=(const RuleBasedCollator& other);
00215
00222 virtual UBool operator==(const Collator& other) const;
00223
00229 virtual Collator* clone(void) const;
00230
00241 virtual CollationElementIterator* createCollationElementIterator(
00242 const UnicodeString& source) const;
00243
00253 virtual CollationElementIterator* createCollationElementIterator(
00254 const CharacterIterator& source) const;
00255
00256
00257 using Collator::compare;
00258
00271 virtual UCollationResult compare(const UnicodeString& source,
00272 const UnicodeString& target,
00273 UErrorCode &status) const;
00274
00288 virtual UCollationResult compare(const UnicodeString& source,
00289 const UnicodeString& target,
00290 int32_t length,
00291 UErrorCode &status) const;
00292
00309 virtual UCollationResult compare(const UChar* source, int32_t sourceLength,
00310 const UChar* target, int32_t targetLength,
00311 UErrorCode &status) const;
00312
00324 virtual UCollationResult compare(UCharIterator &sIter,
00325 UCharIterator &tIter,
00326 UErrorCode &status) const;
00327
00341 virtual UCollationResult compareUTF8(const StringPiece &source,
00342 const StringPiece &target,
00343 UErrorCode &status) const;
00344
00359 virtual CollationKey& getCollationKey(const UnicodeString& source,
00360 CollationKey& key,
00361 UErrorCode& status) const;
00362
00378 virtual CollationKey& getCollationKey(const UChar *source,
00379 int32_t sourceLength,
00380 CollationKey& key,
00381 UErrorCode& status) const;
00382
00388 virtual int32_t hashCode() const;
00389
00400 virtual Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const;
00401
00407 const UnicodeString& getRules() const;
00408
00414 virtual void getVersion(UVersionInfo info) const;
00415
00416 #ifndef U_HIDE_DEPRECATED_API
00417
00433 int32_t getMaxExpansion(int32_t order) const;
00434 #endif
00435
00446 virtual UClassID getDynamicClassID(void) const;
00447
00459 static UClassID U_EXPORT2 getStaticClassID(void);
00460
00461 #ifndef U_HIDE_DEPRECATED_API
00462
00472 uint8_t *cloneRuleData(int32_t &length, UErrorCode &status) const;
00473 #endif
00474
00485 int32_t cloneBinary(uint8_t *buffer, int32_t capacity, UErrorCode &status) const;
00486
00498 void getRules(UColRuleOption delta, UnicodeString &buffer) const;
00499
00507 virtual void setAttribute(UColAttribute attr, UColAttributeValue value,
00508 UErrorCode &status);
00509
00517 virtual UColAttributeValue getAttribute(UColAttribute attr,
00518 UErrorCode &status) const;
00519
00536 virtual Collator &setMaxVariable(UColReorderCode group, UErrorCode &errorCode);
00537
00544 virtual UColReorderCode getMaxVariable() const;
00545
00562 virtual uint32_t setVariableTop(const UChar *varTop, int32_t len, UErrorCode &status);
00563
00579 virtual uint32_t setVariableTop(const UnicodeString &varTop, UErrorCode &status);
00580
00592 virtual void setVariableTop(uint32_t varTop, UErrorCode &status);
00593
00601 virtual uint32_t getVariableTop(UErrorCode &status) const;
00602
00612 virtual UnicodeSet *getTailoredSet(UErrorCode &status) const;
00613
00628 virtual int32_t getSortKey(const UnicodeString& source, uint8_t *result,
00629 int32_t resultLength) const;
00630
00647 virtual int32_t getSortKey(const UChar *source, int32_t sourceLength,
00648 uint8_t *result, int32_t resultLength) const;
00649
00663 virtual int32_t getReorderCodes(int32_t *dest,
00664 int32_t destCapacity,
00665 UErrorCode& status) const;
00666
00678 virtual void setReorderCodes(const int32_t* reorderCodes,
00679 int32_t reorderCodesLength,
00680 UErrorCode& status) ;
00681
00686 virtual UCollationResult internalCompareUTF8(
00687 const char *left, int32_t leftLength,
00688 const char *right, int32_t rightLength,
00689 UErrorCode &errorCode) const;
00690
00714 virtual int32_t internalGetShortDefinitionString(const char *locale,
00715 char *buffer,
00716 int32_t capacity,
00717 UErrorCode &status) const;
00718
00723 virtual int32_t internalNextSortKeyPart(
00724 UCharIterator *iter, uint32_t state[2],
00725 uint8_t *dest, int32_t count, UErrorCode &errorCode) const;
00726
00727
00732 RuleBasedCollator();
00733
00734 #ifndef U_HIDE_INTERNAL_API
00735
00741 const char *internalGetLocaleID(ULocDataLocaleType type, UErrorCode &errorCode) const;
00742
00755 void internalGetContractionsAndExpansions(
00756 UnicodeSet *contractions, UnicodeSet *expansions,
00757 UBool addPrefixes, UErrorCode &errorCode) const;
00758
00764 void internalAddContractions(UChar32 c, UnicodeSet &set, UErrorCode &errorCode) const;
00765
00770 void internalBuildTailoring(
00771 const UnicodeString &rules,
00772 int32_t strength,
00773 UColAttributeValue decompositionMode,
00774 UParseError *outParseError, UnicodeString *outReason,
00775 UErrorCode &errorCode);
00776
00778 static inline RuleBasedCollator *rbcFromUCollator(UCollator *uc) {
00779 return dynamic_cast<RuleBasedCollator *>(fromUCollator(uc));
00780 }
00782 static inline const RuleBasedCollator *rbcFromUCollator(const UCollator *uc) {
00783 return dynamic_cast<const RuleBasedCollator *>(fromUCollator(uc));
00784 }
00785
00790 void internalGetCEs(const UnicodeString &str, UVector64 &ces, UErrorCode &errorCode) const;
00791 #endif // U_HIDE_INTERNAL_API
00792
00793 protected:
00801 virtual void setLocales(const Locale& requestedLocale, const Locale& validLocale, const Locale& actualLocale);
00802
00803 private:
00804 friend class CollationElementIterator;
00805 friend class Collator;
00806
00807 RuleBasedCollator(const CollationCacheEntry *entry);
00808
00814 enum Attributes {
00815 ATTR_VARIABLE_TOP = UCOL_ATTRIBUTE_COUNT,
00816 ATTR_LIMIT
00817 };
00818
00819 void adoptTailoring(CollationTailoring *t, UErrorCode &errorCode);
00820
00821
00822 UCollationResult doCompare(const UChar *left, int32_t leftLength,
00823 const UChar *right, int32_t rightLength,
00824 UErrorCode &errorCode) const;
00825 UCollationResult doCompare(const uint8_t *left, int32_t leftLength,
00826 const uint8_t *right, int32_t rightLength,
00827 UErrorCode &errorCode) const;
00828
00829 void writeSortKey(const UChar *s, int32_t length,
00830 SortKeyByteSink &sink, UErrorCode &errorCode) const;
00831
00832 void writeIdenticalLevel(const UChar *s, const UChar *limit,
00833 SortKeyByteSink &sink, UErrorCode &errorCode) const;
00834
00835 const CollationSettings &getDefaultSettings() const;
00836
00837 void setAttributeDefault(int32_t attribute) {
00838 explicitlySetAttributes &= ~((uint32_t)1 << attribute);
00839 }
00840 void setAttributeExplicitly(int32_t attribute) {
00841 explicitlySetAttributes |= (uint32_t)1 << attribute;
00842 }
00843 UBool attributeHasBeenSetExplicitly(int32_t attribute) const {
00844
00845 return (UBool)((explicitlySetAttributes & ((uint32_t)1 << attribute)) != 0);
00846 }
00847
00855 UBool isUnsafe(UChar32 c) const;
00856
00857 static void computeMaxExpansions(const CollationTailoring *t, UErrorCode &errorCode);
00858 UBool initMaxExpansions(UErrorCode &errorCode) const;
00859
00860 void setFastLatinOptions(CollationSettings &ownedSettings) const;
00861
00862 const CollationData *data;
00863 const CollationSettings *settings;
00864 const CollationTailoring *tailoring;
00865 const CollationCacheEntry *cacheEntry;
00866 Locale validLocale;
00867 uint32_t explicitlySetAttributes;
00868
00869 UBool actualLocaleIsSameAsValid;
00870 };
00871
00872 U_NAMESPACE_END
00873
00874 #endif // !UCONFIG_NO_COLLATION
00875 #endif // TBLCOLL_H