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 U_NAMESPACE_BEGIN
00062
00063 class RuleBasedCollatorStreamer;
00064 class StringSearch;
00065 class CollationElementIterator;
00066
00094 class U_I18N_API RuleBasedCollator : public Collator
00095 {
00096 public:
00097
00098
00099
00109 RuleBasedCollator(const UnicodeString& rules, UErrorCode& status);
00110
00121 RuleBasedCollator(const UnicodeString& rules,
00122 ECollationStrength collationStrength,
00123 UErrorCode& status);
00124
00135 RuleBasedCollator(const UnicodeString& rules,
00136 UColAttributeValue decompositionMode,
00137 UErrorCode& status);
00138
00150 RuleBasedCollator(const UnicodeString& rules,
00151 ECollationStrength collationStrength,
00152 UColAttributeValue decompositionMode,
00153 UErrorCode& status);
00154
00161 RuleBasedCollator(const RuleBasedCollator& other);
00162
00163
00164
00169 virtual ~RuleBasedCollator();
00170
00171
00172
00178 RuleBasedCollator& operator=(const RuleBasedCollator& other);
00179
00186 virtual UBool operator==(const Collator& other) const;
00187
00194 virtual UBool operator!=(const Collator& other) const;
00195
00202 virtual Collator* clone(void) const;
00203
00214 virtual CollationElementIterator* createCollationElementIterator(
00215 const UnicodeString& source) const;
00216
00226 virtual CollationElementIterator* createCollationElementIterator(
00227 const CharacterIterator& source) const;
00228
00241 virtual EComparisonResult compare(const UnicodeString& source,
00242 const UnicodeString& target) const;
00243
00244
00258 virtual EComparisonResult compare(const UnicodeString& source,
00259 const UnicodeString& target,
00260 int32_t length) const;
00261
00294 virtual EComparisonResult compare(const UChar* source, int32_t sourceLength,
00295 const UChar* target, int32_t targetLength)
00296 const;
00297
00310 virtual CollationKey& getCollationKey(const UnicodeString& source,
00311 CollationKey& key,
00312 UErrorCode& status) const;
00313
00326 virtual CollationKey& getCollationKey(const UChar *source,
00327 int32_t sourceLength,
00328 CollationKey& key,
00329 UErrorCode& status) const;
00330
00336 virtual int32_t hashCode(void) const;
00337
00344 const UnicodeString& getRules(void) const;
00345
00356 int32_t getMaxExpansion(int32_t order) const;
00357
00368 virtual UClassID getDynamicClassID(void) const
00369 {
00370 return RuleBasedCollator::getStaticClassID();
00371 }
00372
00384 static UClassID getStaticClassID(void)
00385 {
00386 return (UClassID)&fgClassID;
00387 }
00388
00397 uint8_t *cloneRuleData(int32_t &length, UErrorCode &status);
00398
00406 UnicodeString getRules(UColRuleOption delta);
00407
00415 virtual void setAttribute(UColAttribute attr, UColAttributeValue value,
00416 UErrorCode &status);
00417
00425 virtual UColAttributeValue getAttribute(UColAttribute attr,
00426 UErrorCode &status);
00427
00438 virtual uint32_t setVariableTop(const UChar *varTop, int32_t len, UErrorCode &status);
00439
00449 virtual uint32_t setVariableTop(const UnicodeString varTop, UErrorCode &status);
00450
00458 virtual void setVariableTop(const uint32_t varTop, UErrorCode &status);
00459
00466 virtual uint32_t getVariableTop(UErrorCode &status) const;
00467
00473 virtual Collator* safeClone(void);
00474
00484 virtual int32_t getSortKey(const UnicodeString& source, uint8_t *result,
00485 int32_t resultLength) const;
00486
00499 virtual int32_t getSortKey(const UChar *source, int32_t sourceLength,
00500 uint8_t *result, int32_t resultLength) const;
00501
00512 virtual ECollationStrength getStrength(void) const;
00513
00520 virtual void setStrength(ECollationStrength newStrength);
00521
00522
00523
00534 RuleBasedCollator(const UnicodeString& rules,
00535 Normalizer::EMode decompositionMode,
00536 UErrorCode& status);
00537
00549 RuleBasedCollator(const UnicodeString& rules,
00550 ECollationStrength collationStrength,
00551 Normalizer::EMode decompositionMode,
00552 UErrorCode& status);
00553
00561 virtual void setDecomposition(Normalizer::EMode mode);
00562
00569 virtual Normalizer::EMode getDecomposition(void) const;
00570
00571 private:
00572
00573
00574
00575 static const int32_t UNMAPPED;
00576 static const int32_t CHARINDEX;
00577 static const int32_t EXPANDCHARINDEX;
00578 static const int32_t CONTRACTCHARINDEX;
00579
00580 static const int32_t PRIMARYORDERINCREMENT;
00581 static const int32_t SECONDARYORDERINCREMENT;
00582 static const int32_t TERTIARYORDERINCREMENT;
00583 static const int32_t PRIMARYORDERMASK;
00584 static const int32_t SECONDARYORDERMASK;
00585 static const int32_t TERTIARYORDERMASK;
00586 static const int32_t IGNORABLEMASK;
00587 static const int32_t PRIMARYDIFFERENCEONLY;
00588 static const int32_t SECONDARYDIFFERENCEONLY;
00589 static const int32_t PRIMARYORDERSHIFT;
00590 static const int32_t SECONDARYORDERSHIFT;
00591
00592 static const int32_t COLELEMENTSTART;
00593 static const int32_t PRIMARYLOWZEROMASK;
00594 static const int32_t RESETSECONDARYTERTIARY;
00595 static const int32_t RESETTERTIARY;
00596
00597 static const int32_t PRIMIGNORABLE;
00598
00599 static const int16_t FILEID;
00600 static const char kFilenameSuffix[];
00601
00602
00603
00607 static const char fgClassID;
00608
00609
00610
00611 UBool dataIsOwned;
00612
00617 UCollator *ucollator;
00618
00622 UnicodeString *urulestring;
00623
00624
00625
00629 friend class RuleBasedCollatorStreamer;
00630
00634 friend class CollationElementIterator;
00635
00640 friend class Collator;
00641
00645 friend class StringSearch;
00646
00647
00648
00652 RuleBasedCollator();
00653
00658 RuleBasedCollator(UCollator *collator, UnicodeString *rule);
00659
00670 RuleBasedCollator(const Locale& desiredLocale, UErrorCode& status);
00671
00673 void
00674 construct(const UnicodeString& rules,
00675 UColAttributeValue collationStrength,
00676 UColAttributeValue decompositionMode,
00677 UErrorCode& status);
00678
00679
00680
00686 void setUCollator(const Locale& locale, UErrorCode& status);
00687
00693 void setUCollator(const char* locale, UErrorCode& status);
00694
00699 void setUCollator(UCollator *collator);
00700
00708 void setUCollator(UCollator *collator, UnicodeString *rules);
00709
00714 const UCollator * getUCollator();
00715
00721 Collator::EComparisonResult getEComparisonResult(
00722 const UCollationResult &result) const;
00723
00729 Collator::ECollationStrength getECollationStrength(
00730 const UCollationStrength &strength) const;
00731
00737 UCollationStrength getUCollationStrength(
00738 const Collator::ECollationStrength &strength) const;
00739 };
00740
00741
00742
00743 inline UBool RuleBasedCollator::operator!=(const Collator& other) const
00744 {
00745 return !(*this == other);
00746 }
00747
00748 inline void RuleBasedCollator::setUCollator(const char *locale,
00749 UErrorCode &status)
00750 {
00751 if (U_FAILURE(status))
00752 return;
00753 if (ucollator && dataIsOwned)
00754 ucol_close(ucollator);
00755 ucollator = ucol_open(locale, &status);
00756 }
00757
00758 inline void RuleBasedCollator::setUCollator(const Locale &locale,
00759 UErrorCode &status)
00760 {
00761 setUCollator(locale.getName(), status);
00762 }
00763
00764 inline void RuleBasedCollator::setUCollator(UCollator *collator)
00765 {
00766 if (ucollator && dataIsOwned) {
00767 ucol_close(ucollator);
00768 }
00769 ucollator = collator;
00770 }
00771
00772 inline void RuleBasedCollator::setUCollator(UCollator *collator,
00773 UnicodeString *rules)
00774 {
00775 if (ucollator && dataIsOwned) {
00776 ucol_close(ucollator);
00777 delete urulestring;
00778 }
00779 ucollator = collator;
00780 urulestring = rules;
00781 dataIsOwned = FALSE;
00782 }
00783
00784 inline const UCollator * RuleBasedCollator::getUCollator()
00785 {
00786 return ucollator;
00787 }
00788
00789 inline Collator::EComparisonResult RuleBasedCollator::getEComparisonResult(
00790 const UCollationResult &result) const
00791 {
00792 switch (result)
00793 {
00794 case UCOL_LESS :
00795 return Collator::LESS;
00796 case UCOL_EQUAL :
00797 return Collator::EQUAL;
00798 default :
00799 return Collator::GREATER;
00800 }
00801 }
00802
00803 inline Collator::ECollationStrength RuleBasedCollator::getECollationStrength(
00804 const UCollationStrength &strength) const
00805 {
00806 switch (strength)
00807 {
00808 case UCOL_PRIMARY :
00809 return Collator::PRIMARY;
00810 case UCOL_SECONDARY :
00811 return Collator::SECONDARY;
00812 case UCOL_TERTIARY :
00813 return Collator::TERTIARY;
00814 case UCOL_QUATERNARY :
00815 return Collator::QUATERNARY;
00816 default :
00817 return Collator::IDENTICAL;
00818 }
00819 }
00820
00821 inline UCollationStrength RuleBasedCollator::getUCollationStrength(
00822 const Collator::ECollationStrength &strength) const
00823 {
00824 switch (strength)
00825 {
00826 case Collator::PRIMARY :
00827 return UCOL_PRIMARY;
00828 case Collator::SECONDARY :
00829 return UCOL_SECONDARY;
00830 case Collator::TERTIARY :
00831 return UCOL_TERTIARY;
00832 case Collator::QUATERNARY :
00833 return UCOL_QUATERNARY;
00834 default :
00835 return UCOL_IDENTICAL;
00836 }
00837 }
00838
00839 U_NAMESPACE_END
00840
00841 #endif