00001
00002
00003
00004
00005
00006
00007
00054 #ifndef TBLCOLL_H
00055 #define TBLCOLL_H
00056
00057 #include "unicode/coll.h"
00058 #include "unicode/sortkey.h"
00059 #include "unicode/normlzr.h"
00060
00061 class CollationElementIterator;
00062
00355 class U_I18N_API RuleBasedCollator : public Collator
00356 {
00357 public:
00358
00359
00360
00369 RuleBasedCollator(const UnicodeString& rules, UErrorCode& status);
00370
00380 RuleBasedCollator(const UnicodeString& rules,
00381 ECollationStrength collationStrength,
00382 UErrorCode& status);
00383
00393 RuleBasedCollator(const UnicodeString& rules,
00394 Normalizer::EMode decompositionMode,
00395 UErrorCode& status);
00396
00407 RuleBasedCollator(const UnicodeString& rules,
00408 ECollationStrength collationStrength,
00409 Normalizer::EMode decompositionMode,
00410 UErrorCode& status);
00411
00417 RuleBasedCollator(const RuleBasedCollator& other);
00418
00419
00420
00424 virtual ~RuleBasedCollator();
00425
00426
00427
00432 RuleBasedCollator& operator=(const RuleBasedCollator& other);
00433
00439 virtual UBool operator==(const Collator& other) const;
00440
00446 virtual UBool operator!=(const Collator& other) const;
00447
00453 virtual Collator* clone(void) const;
00454
00464 virtual CollationElementIterator* createCollationElementIterator(
00465 const UnicodeString& source) const;
00466
00475 virtual CollationElementIterator* createCollationElementIterator(
00476 const CharacterIterator& source) const;
00477
00489 virtual EComparisonResult compare(const UnicodeString& source,
00490 const UnicodeString& target) const;
00491
00492
00505 virtual EComparisonResult compare(const UnicodeString& source,
00506 const UnicodeString& target,
00507 int32_t length) const;
00508
00540 virtual EComparisonResult compare(const UChar* source, int32_t sourceLength,
00541 const UChar* target, int32_t targetLength)
00542 const;
00543
00555 virtual CollationKey& getCollationKey(const UnicodeString& source,
00556 CollationKey& key,
00557 UErrorCode& status) const;
00558
00570 virtual CollationKey& getCollationKey(const UChar *source,
00571 int32_t sourceLength,
00572 CollationKey& key,
00573 UErrorCode& status) const;
00574
00579 virtual int32_t hashCode(void) const;
00580
00586 const UnicodeString& getRules(void) const;
00587
00597 int32_t getMaxExpansion(int32_t order) const;
00598
00608 virtual UClassID getDynamicClassID(void) const
00609 {
00610 return RuleBasedCollator::getStaticClassID();
00611 }
00612
00623 static UClassID getStaticClassID(void)
00624 {
00625 return (UClassID)&fgClassID;
00626 }
00627
00635 uint8_t *cloneRuleData(int32_t &length, UErrorCode &status);
00636
00643 UnicodeString getRules(UColRuleOption delta);
00644
00651 virtual void setAttribute(UColAttribute attr, UColAttributeValue value,
00652 UErrorCode &status);
00653
00660 virtual UColAttributeValue getAttribute(UColAttribute attr,
00661 UErrorCode &status);
00662
00667 virtual Collator* safeClone(void);
00668
00680 virtual EComparisonResult compare(ForwardCharacterIterator &source,
00681 ForwardCharacterIterator &target);
00682
00692 virtual int32_t getSortKey(const UnicodeString& source, uint8_t *result,
00693 int32_t resultLength) const;
00694
00706 virtual int32_t getSortKey(const UChar *source, int32_t sourceLength,
00707 uint8_t *result, int32_t resultLength) const;
00708
00718 virtual ECollationStrength getStrength(void) const;
00719
00738 virtual void setStrength(ECollationStrength newStrength);
00739
00746 virtual void setDecomposition(Normalizer::EMode mode);
00747
00753 virtual Normalizer::EMode getDecomposition(void) const;
00754
00755 private:
00756
00757
00758
00759 static const int32_t UNMAPPED;
00760 static const int32_t CHARINDEX;
00761 static const int32_t EXPANDCHARINDEX;
00762 static const int32_t CONTRACTCHARINDEX;
00763
00764 static const int32_t PRIMARYORDERINCREMENT;
00765 static const int32_t SECONDARYORDERINCREMENT;
00766 static const int32_t TERTIARYORDERINCREMENT;
00767 static const int32_t PRIMARYORDERMASK;
00768 static const int32_t SECONDARYORDERMASK;
00769 static const int32_t TERTIARYORDERMASK;
00770 static const int32_t IGNORABLEMASK;
00771 static const int32_t PRIMARYDIFFERENCEONLY;
00772 static const int32_t SECONDARYDIFFERENCEONLY;
00773 static const int32_t PRIMARYORDERSHIFT;
00774 static const int32_t SECONDARYORDERSHIFT;
00775
00776 static const int32_t COLELEMENTSTART;
00777 static const int32_t PRIMARYLOWZEROMASK;
00778 static const int32_t RESETSECONDARYTERTIARY;
00779 static const int32_t RESETTERTIARY;
00780
00781 static const int32_t PRIMIGNORABLE;
00782
00783 static const int16_t FILEID;
00784 static const char *kFilenameSuffix;
00785
00786
00787
00791 static char fgClassID;
00792
00793
00794
00795 UBool dataIsOwned;
00796
00801 UCollator *ucollator;
00802
00806 UnicodeString *urulestring;
00807
00808
00809
00813 friend class RuleBasedCollatorStreamer;
00814
00818 friend class CollationElementIterator;
00819
00824 friend class Collator;
00825
00826
00827
00831 RuleBasedCollator();
00832
00837 RuleBasedCollator(UCollator *collator, UnicodeString *rule);
00838
00849 RuleBasedCollator(const Locale& desiredLocale, UErrorCode& status);
00850
00851
00852
00858 void setUCollator(const Locale& locale, UErrorCode& status);
00859
00865 void setUCollator(const char* locale, UErrorCode& status);
00866
00872 void setUCollator(UCollator *collator);
00873
00879 Collator::EComparisonResult getEComparisonResult(
00880 const UCollationResult &result) const;
00881
00887 Collator::ECollationStrength getECollationStrength(
00888 const UCollationStrength &strength) const;
00889
00895 UCollationStrength getUCollationStrength(
00896 const Collator::ECollationStrength &strength) const;
00897 };
00898
00899
00900
00901 inline UBool RuleBasedCollator::operator!=(const Collator& other) const
00902 {
00903 return !(*this == other);
00904 }
00905
00906 inline void RuleBasedCollator::setUCollator(const char *locale,
00907 UErrorCode &status)
00908 {
00909 if (U_FAILURE(status))
00910 return;
00911 if (ucollator && dataIsOwned)
00912 ucol_close(ucollator);
00913 ucollator = ucol_open(locale, &status);
00914 }
00915
00916 inline void RuleBasedCollator::setUCollator(const Locale &locale,
00917 UErrorCode &status)
00918 {
00919 setUCollator(locale.getName(), status);
00920 }
00921
00922 inline void RuleBasedCollator::setUCollator(UCollator *collator)
00923 {
00924 if (ucollator && dataIsOwned)
00925 ucol_close(ucollator);
00926 ucollator = collator;
00927 }
00928
00929 inline Collator::EComparisonResult RuleBasedCollator::getEComparisonResult(
00930 const UCollationResult &result) const
00931 {
00932 switch (result)
00933 {
00934 case UCOL_LESS :
00935 return Collator::LESS;
00936 case UCOL_EQUAL :
00937 return Collator::EQUAL;
00938 default :
00939 return Collator::GREATER;
00940 }
00941 }
00942
00943 inline Collator::ECollationStrength RuleBasedCollator::getECollationStrength(
00944 const UCollationStrength &strength) const
00945 {
00946 switch (strength)
00947 {
00948 case UCOL_PRIMARY :
00949 return Collator::PRIMARY;
00950 case UCOL_SECONDARY :
00951 return Collator::SECONDARY;
00952 case UCOL_TERTIARY :
00953 return Collator::TERTIARY;
00954 default :
00955 return Collator::IDENTICAL;
00956 }
00957 }
00958
00959 inline UCollationStrength RuleBasedCollator::getUCollationStrength(
00960 const Collator::ECollationStrength &strength) const
00961 {
00962 switch (strength)
00963 {
00964 case Collator::PRIMARY :
00965 return UCOL_PRIMARY;
00966 case Collator::SECONDARY :
00967 return UCOL_SECONDARY;
00968 case Collator::TERTIARY :
00969 return UCOL_TERTIARY;
00970 default :
00971 return UCOL_IDENTICAL;
00972 }
00973 }
00974
00975 #endif