00001
00002
00003
00004
00005
00006
00007
00059 #ifndef TBLCOLL_H
00060 #define TBLCOLL_H
00061
00062 #include "unicode/utypes.h"
00063
00064
00065 #if !UCONFIG_NO_COLLATION
00066
00067 #include "unicode/coll.h"
00068 #include "unicode/ucol.h"
00069 #include "unicode/sortkey.h"
00070 #include "unicode/normlzr.h"
00071
00072 U_NAMESPACE_BEGIN
00073
00077 class StringSearch;
00081 class CollationElementIterator;
00082
00111 class U_I18N_API RuleBasedCollator : public Collator
00112 {
00113 public:
00114
00115
00116
00126 RuleBasedCollator(const UnicodeString& rules, UErrorCode& status);
00127
00138 RuleBasedCollator(const UnicodeString& rules,
00139 ECollationStrength collationStrength,
00140 UErrorCode& status);
00141
00152 RuleBasedCollator(const UnicodeString& rules,
00153 UColAttributeValue decompositionMode,
00154 UErrorCode& status);
00155
00167 RuleBasedCollator(const UnicodeString& rules,
00168 ECollationStrength collationStrength,
00169 UColAttributeValue decompositionMode,
00170 UErrorCode& status);
00171
00178 RuleBasedCollator(const RuleBasedCollator& other);
00179
00180
00198 RuleBasedCollator(const uint8_t *bin, int32_t length,
00199 const RuleBasedCollator *base,
00200 UErrorCode &status);
00201
00202
00207 virtual ~RuleBasedCollator();
00208
00209
00210
00216 RuleBasedCollator& operator=(const RuleBasedCollator& other);
00217
00224 virtual UBool operator==(const Collator& other) const;
00225
00232 virtual UBool operator!=(const Collator& other) const;
00233
00240 virtual Collator* clone(void) const;
00241
00252 virtual CollationElementIterator* createCollationElementIterator(
00253 const UnicodeString& source) const;
00254
00264 virtual CollationElementIterator* createCollationElementIterator(
00265 const CharacterIterator& source) const;
00266
00279 virtual EComparisonResult compare(const UnicodeString& source,
00280 const UnicodeString& target) const;
00281
00282
00295 virtual UCollationResult compare(const UnicodeString& source,
00296 const UnicodeString& target,
00297 UErrorCode &status) const;
00298
00312 virtual EComparisonResult compare(const UnicodeString& source,
00313 const UnicodeString& target,
00314 int32_t length) const;
00315
00329 virtual UCollationResult compare(const UnicodeString& source,
00330 const UnicodeString& target,
00331 int32_t length,
00332 UErrorCode &status) const;
00333
00367 virtual EComparisonResult compare(const UChar* source, int32_t sourceLength,
00368 const UChar* target, int32_t targetLength)
00369 const;
00370
00387 virtual UCollationResult compare(const UChar* source, int32_t sourceLength,
00388 const UChar* target, int32_t targetLength,
00389 UErrorCode &status) const;
00390
00402 virtual UCollationResult compare(UCharIterator &sIter,
00403 UCharIterator &tIter,
00404 UErrorCode &status) const;
00405
00418 virtual CollationKey& getCollationKey(const UnicodeString& source,
00419 CollationKey& key,
00420 UErrorCode& status) const;
00421
00435 virtual CollationKey& getCollationKey(const UChar *source,
00436 int32_t sourceLength,
00437 CollationKey& key,
00438 UErrorCode& status) const;
00439
00445 virtual int32_t hashCode(void) const;
00446
00457 virtual const Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const;
00458
00465 const UnicodeString& getRules(void) const;
00466
00472 virtual void getVersion(UVersionInfo info) const;
00473
00484 int32_t getMaxExpansion(int32_t order) const;
00485
00496 virtual UClassID getDynamicClassID(void) const;
00497
00509 static UClassID U_EXPORT2 getStaticClassID(void);
00510
00519 uint8_t *cloneRuleData(int32_t &length, UErrorCode &status);
00520
00521
00532 int32_t cloneBinary(uint8_t *buffer, int32_t capacity, UErrorCode &status);
00533
00541 void getRules(UColRuleOption delta, UnicodeString &buffer);
00542
00550 virtual void setAttribute(UColAttribute attr, UColAttributeValue value,
00551 UErrorCode &status);
00552
00560 virtual UColAttributeValue getAttribute(UColAttribute attr,
00561 UErrorCode &status);
00562
00573 virtual uint32_t setVariableTop(const UChar *varTop, int32_t len, UErrorCode &status);
00574
00584 virtual uint32_t setVariableTop(const UnicodeString varTop, UErrorCode &status);
00585
00593 virtual void setVariableTop(const uint32_t varTop, UErrorCode &status);
00594
00601 virtual uint32_t getVariableTop(UErrorCode &status) const;
00602
00612 virtual UnicodeSet *getTailoredSet(UErrorCode &status) const;
00613
00619 virtual Collator* safeClone(void);
00620
00631 virtual int32_t getSortKey(const UnicodeString& source, uint8_t *result,
00632 int32_t resultLength) const;
00633
00646 virtual int32_t getSortKey(const UChar *source, int32_t sourceLength,
00647 uint8_t *result, int32_t resultLength) const;
00648
00659 virtual ECollationStrength getStrength(void) const;
00660
00667 virtual void setStrength(ECollationStrength newStrength);
00668
00678 virtual int32_t getReorderCodes(int32_t* dest,
00679 int32_t destCapacity,
00680 UErrorCode& status) const;
00681
00689 virtual void setReorderCodes(const int32_t* reorderCodes,
00690 int32_t reorderCodesLength,
00691 UErrorCode& status);
00692
00693
00694 private:
00695
00696
00697
00698 enum {
00699
00700 CHARINDEX = 0x70000000,
00701
00702 EXPANDCHARINDEX = 0x7E000000,
00703
00704 CONTRACTCHARINDEX = 0x7F000000,
00705
00706 UNMAPPED = 0xFFFFFFFF,
00707
00708 PRIMARYORDERINCREMENT = 0x00010000,
00709
00710 SECONDARYORDERINCREMENT = 0x00000100,
00711
00712 TERTIARYORDERINCREMENT = 0x00000001,
00713
00714 PRIMARYORDERMASK = 0xffff0000,
00715
00716 SECONDARYORDERMASK = 0x0000ff00,
00717
00718 TERTIARYORDERMASK = 0x000000ff,
00719
00720 IGNORABLEMASK = 0x0000ffff,
00721
00722 PRIMARYDIFFERENCEONLY = 0xffff0000,
00723
00724 SECONDARYDIFFERENCEONLY = 0xffffff00,
00725
00726 PRIMARYORDERSHIFT = 16,
00727
00728 SECONDARYORDERSHIFT = 8,
00729
00730 COLELEMENTSTART = 0x02020202,
00731
00732 PRIMARYLOWZEROMASK = 0x00FF0000,
00733
00734 RESETSECONDARYTERTIARY = 0x00000202,
00735
00736 RESETTERTIARY = 0x00000002,
00737
00738 PRIMIGNORABLE = 0x0202
00739 };
00740
00741
00742
00743 UBool dataIsOwned;
00744
00745 UBool isWriteThroughAlias;
00746
00751 UCollator *ucollator;
00752
00756 UnicodeString urulestring;
00757
00758
00759
00763 friend class CollationElementIterator;
00764
00769 friend class Collator;
00770
00774 friend class StringSearch;
00775
00776
00777
00781 RuleBasedCollator();
00782
00793 RuleBasedCollator(const Locale& desiredLocale, UErrorCode& status);
00794
00803 void
00804 construct(const UnicodeString& rules,
00805 UColAttributeValue collationStrength,
00806 UColAttributeValue decompositionMode,
00807 UErrorCode& status);
00808
00809
00810
00816 void setUCollator(const Locale& locale, UErrorCode& status);
00817
00823 void setUCollator(const char* locale, UErrorCode& status);
00824
00832 void setUCollator(UCollator *collator);
00833
00834 public:
00840 const UCollator * getUCollator();
00841
00842 protected:
00850 virtual void setLocales(const Locale& requestedLocale, const Locale& validLocale, const Locale& actualLocale);
00851
00852 private:
00853
00854
00855 void checkOwned(void);
00856
00857
00858 void setRuleStringFromCollator();
00859
00866 Collator::EComparisonResult getEComparisonResult(
00867 const UCollationResult &result) const;
00868
00874 Collator::ECollationStrength getECollationStrength(
00875 const UCollationStrength &strength) const;
00876
00882 UCollationStrength getUCollationStrength(
00883 const Collator::ECollationStrength &strength) const;
00884 };
00885
00886
00887
00888 inline void RuleBasedCollator::setUCollator(const Locale &locale,
00889 UErrorCode &status)
00890 {
00891 setUCollator(locale.getName(), status);
00892 }
00893
00894
00895 inline void RuleBasedCollator::setUCollator(UCollator *collator)
00896 {
00897
00898 if (ucollator && dataIsOwned) {
00899 ucol_close(ucollator);
00900 }
00901 ucollator = collator;
00902 dataIsOwned = FALSE;
00903 isWriteThroughAlias = TRUE;
00904 setRuleStringFromCollator();
00905 }
00906
00907 inline const UCollator * RuleBasedCollator::getUCollator()
00908 {
00909 return ucollator;
00910 }
00911
00912 inline Collator::EComparisonResult RuleBasedCollator::getEComparisonResult(
00913 const UCollationResult &result) const
00914 {
00915 switch (result)
00916 {
00917 case UCOL_LESS :
00918 return Collator::LESS;
00919 case UCOL_EQUAL :
00920 return Collator::EQUAL;
00921 default :
00922 return Collator::GREATER;
00923 }
00924 }
00925
00926 inline Collator::ECollationStrength RuleBasedCollator::getECollationStrength(
00927 const UCollationStrength &strength) const
00928 {
00929 switch (strength)
00930 {
00931 case UCOL_PRIMARY :
00932 return Collator::PRIMARY;
00933 case UCOL_SECONDARY :
00934 return Collator::SECONDARY;
00935 case UCOL_TERTIARY :
00936 return Collator::TERTIARY;
00937 case UCOL_QUATERNARY :
00938 return Collator::QUATERNARY;
00939 default :
00940 return Collator::IDENTICAL;
00941 }
00942 }
00943
00944 inline UCollationStrength RuleBasedCollator::getUCollationStrength(
00945 const Collator::ECollationStrength &strength) const
00946 {
00947 switch (strength)
00948 {
00949 case Collator::PRIMARY :
00950 return UCOL_PRIMARY;
00951 case Collator::SECONDARY :
00952 return UCOL_SECONDARY;
00953 case Collator::TERTIARY :
00954 return UCOL_TERTIARY;
00955 case Collator::QUATERNARY :
00956 return UCOL_QUATERNARY;
00957 default :
00958 return UCOL_IDENTICAL;
00959 }
00960 }
00961
00962 U_NAMESPACE_END
00963
00964 #endif
00965
00966 #endif