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 StringSearch;
00064
class CollationElementIterator;
00065
00093 class U_I18N_API RuleBasedCollator :
public Collator
00094 {
00095
public:
00096
00097
00098
00108 RuleBasedCollator(
const UnicodeString& rules, UErrorCode& status);
00109
00120 RuleBasedCollator(
const UnicodeString& rules,
00121 ECollationStrength collationStrength,
00122 UErrorCode& status);
00123
00134 RuleBasedCollator(
const UnicodeString& rules,
00135
UColAttributeValue decompositionMode,
00136 UErrorCode& status);
00137
00149 RuleBasedCollator(
const UnicodeString& rules,
00150 ECollationStrength collationStrength,
00151
UColAttributeValue decompositionMode,
00152 UErrorCode& status);
00153
00160 RuleBasedCollator(
const RuleBasedCollator& other);
00161
00162
00163
00168
virtual ~RuleBasedCollator();
00169
00170
00171
00177 RuleBasedCollator& operator=(
const RuleBasedCollator& other);
00178
00185
virtual UBool operator==(
const Collator& other)
const;
00186
00193
virtual UBool operator!=(
const Collator& other)
const;
00194
00201
virtual Collator*
clone(
void)
const;
00202
00213
virtual CollationElementIterator* createCollationElementIterator(
00214
const UnicodeString& source)
const;
00215
00225
virtual CollationElementIterator* createCollationElementIterator(
00226
const CharacterIterator& source)
const;
00227
00240
virtual EComparisonResult compare(
const UnicodeString& source,
00241
const UnicodeString& target)
const;
00242
00243
00257
virtual EComparisonResult compare(
const UnicodeString& source,
00258
const UnicodeString& target,
00259 int32_t length)
const;
00260
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
00347
virtual const Locale getLocale(
ULocDataLocaleType type, UErrorCode& status)
const;
00348
00355
const UnicodeString& getRules(
void)
const;
00356
00362
virtual void getVersion(UVersionInfo info)
const;
00363
00374 int32_t getMaxExpansion(int32_t order)
const;
00375
00386 virtual UClassID getDynamicClassID(
void)
const
00387
{
00388
return RuleBasedCollator::getStaticClassID();
00389 }
00390
00402 static UClassID getStaticClassID(
void)
00403 {
00404
return (
UClassID)&fgClassID;
00405 }
00406
00415 uint8_t *cloneRuleData(int32_t &length, UErrorCode &status);
00416
00424
void getRules(UColRuleOption delta,
UnicodeString &buffer);
00425
00433
virtual void setAttribute(UColAttribute attr, UColAttributeValue value,
00434 UErrorCode &status);
00435
00443
virtual UColAttributeValue getAttribute(UColAttribute attr,
00444 UErrorCode &status);
00445
00456
virtual uint32_t setVariableTop(
const UChar *varTop, int32_t len, UErrorCode &status);
00457
00467
virtual uint32_t setVariableTop(
const UnicodeString varTop, UErrorCode &status);
00468
00476
virtual void setVariableTop(
const uint32_t varTop, UErrorCode &status);
00477
00484
virtual uint32_t getVariableTop(UErrorCode &status)
const;
00485
00491
virtual Collator*
safeClone(
void);
00492
00502
virtual int32_t getSortKey(
const UnicodeString& source, uint8_t *result,
00503 int32_t resultLength)
const;
00504
00517
virtual int32_t getSortKey(
const UChar *source, int32_t sourceLength,
00518 uint8_t *result, int32_t resultLength)
const;
00519
00530
virtual ECollationStrength
getStrength(
void) const;
00531
00538 virtual
void setStrength(ECollationStrength newStrength);
00539
00540
00541
00552 RuleBasedCollator(const
UnicodeString& rules,
00553
Normalizer::EMode decompositionMode,
00554 UErrorCode& status);
00555
00567 RuleBasedCollator(const
UnicodeString& rules,
00568 ECollationStrength collationStrength,
00569
Normalizer::EMode decompositionMode,
00570 UErrorCode& status);
00571
00579 virtual
void setDecomposition(
Normalizer::EMode mode);
00580
00587 virtual
Normalizer::EMode getDecomposition(
void) const;
00588
00589 private:
00590
00591
00592
00593 static const int32_t UNMAPPED;
00594 static const int32_t CHARINDEX;
00595 static const int32_t EXPANDCHARINDEX;
00596 static const int32_t CONTRACTCHARINDEX;
00597
00598 static const int32_t PRIMARYORDERINCREMENT;
00599 static const int32_t SECONDARYORDERINCREMENT;
00600 static const int32_t TERTIARYORDERINCREMENT;
00601 static const int32_t PRIMARYORDERMASK;
00602 static const int32_t SECONDARYORDERMASK;
00603 static const int32_t TERTIARYORDERMASK;
00604 static const int32_t IGNORABLEMASK;
00605 static const int32_t PRIMARYDIFFERENCEONLY;
00606 static const int32_t SECONDARYDIFFERENCEONLY;
00607 static const int32_t PRIMARYORDERSHIFT;
00608 static const int32_t SECONDARYORDERSHIFT;
00609
00610 static const int32_t COLELEMENTSTART;
00611 static const int32_t PRIMARYLOWZEROMASK;
00612 static const int32_t RESETSECONDARYTERTIARY;
00613 static const int32_t RESETTERTIARY;
00614
00615 static const int32_t PRIMIGNORABLE;
00616
00617 static const int16_t FILEID;
00618 static const
char kFilenameSuffix[];
00619
00620
00621
00625 static const
char fgClassID;
00626
00627
00628
00629 UBool dataIsOwned;
00630
00635 UCollator *ucollator;
00636
00640
UnicodeString *urulestring;
00641
00642
00643
00647 friend class
CollationElementIterator;
00648
00653 friend class
Collator;
00654
00658 friend class
StringSearch;
00659
00660
00661
00665 RuleBasedCollator();
00666
00671 RuleBasedCollator(UCollator *collator,
UnicodeString *rule);
00672
00683 RuleBasedCollator(const Locale& desiredLocale, UErrorCode& status);
00684
00686
void
00687 construct(const
UnicodeString& rules,
00688 UColAttributeValue collationStrength,
00689 UColAttributeValue decompositionMode,
00690 UErrorCode& status);
00691
00692
00693
00699
void setUCollator(const Locale& locale, UErrorCode& status);
00700
00706
void setUCollator(const
char* locale, UErrorCode& status);
00707
00712
void setUCollator(UCollator *collator);
00713
00721
void setUCollator(UCollator *collator,
UnicodeString *rules);
00722
00727 const UCollator * getUCollator();
00728
00734 Collator::EComparisonResult getEComparisonResult(
00735 const UCollationResult &result) const;
00736
00742 Collator::ECollationStrength getECollationStrength(
00743 const UCollationStrength &strength) const;
00744
00750 UCollationStrength getUCollationStrength(
00751 const Collator::ECollationStrength &strength) const;
00752 };
00753
00754
00755
00756 inline UBool RuleBasedCollator::operator!=(const Collator& other)
const
00757
{
00758
return !(*
this == other);
00759 }
00760
00761
inline void RuleBasedCollator::setUCollator(
const char *locale,
00762 UErrorCode &status)
00763 {
00764
if (
U_FAILURE(status))
00765
return;
00766
if (ucollator && dataIsOwned)
00767
ucol_close(ucollator);
00768 ucollator =
ucol_open(locale, &status);
00769 }
00770
00771
inline void RuleBasedCollator::setUCollator(
const Locale &locale,
00772 UErrorCode &status)
00773 {
00774 setUCollator(locale.getName(), status);
00775 }
00776
00777
inline void RuleBasedCollator::setUCollator(UCollator *collator)
00778 {
00779
if (ucollator && dataIsOwned) {
00780
ucol_close(ucollator);
00781 }
00782 ucollator = collator;
00783 }
00784
00785
inline void RuleBasedCollator::setUCollator(UCollator *collator,
00786
UnicodeString *rules)
00787 {
00788
if (ucollator && dataIsOwned) {
00789
ucol_close(ucollator);
00790
delete urulestring;
00791 }
00792 ucollator = collator;
00793 urulestring = rules;
00794 dataIsOwned = FALSE;
00795 }
00796
00797
inline const UCollator * RuleBasedCollator::getUCollator()
00798 {
00799
return ucollator;
00800 }
00801
00802
inline Collator::EComparisonResult RuleBasedCollator::getEComparisonResult(
00803
const UCollationResult &result)
const
00804
{
00805
switch (result)
00806 {
00807
case UCOL_LESS :
00808
return Collator::LESS;
00809
case UCOL_EQUAL :
00810
return Collator::EQUAL;
00811
default :
00812
return Collator::GREATER;
00813 }
00814 }
00815
00816
inline Collator::ECollationStrength RuleBasedCollator::getECollationStrength(
00817
const UCollationStrength &strength)
const
00818
{
00819
switch (strength)
00820 {
00821
case UCOL_PRIMARY :
00822
return Collator::PRIMARY;
00823
case UCOL_SECONDARY :
00824
return Collator::SECONDARY;
00825
case UCOL_TERTIARY :
00826
return Collator::TERTIARY;
00827
case UCOL_QUATERNARY :
00828
return Collator::QUATERNARY;
00829
default :
00830
return Collator::IDENTICAL;
00831 }
00832 }
00833
00834
inline UCollationStrength RuleBasedCollator::getUCollationStrength(
00835
const Collator::ECollationStrength &strength)
const
00836
{
00837
switch (strength)
00838 {
00839
case Collator::PRIMARY :
00840
return UCOL_PRIMARY;
00841
case Collator::SECONDARY :
00842
return UCOL_SECONDARY;
00843
case Collator::TERTIARY :
00844
return UCOL_TERTIARY;
00845
case Collator::QUATERNARY :
00846
return UCOL_QUATERNARY;
00847
default :
00848
return UCOL_IDENTICAL;
00849 }
00850 }
00851
00852 U_NAMESPACE_END
00853
00854
#endif