00001
00002
00003
00004
00005
00006
00007
00054
#ifndef TBLCOLL_H
00055
#define TBLCOLL_H
00056
00057
#include "unicode/utypes.h"
00058
00059
#if !UCONFIG_NO_COLLATION
00060
00061
#include "unicode/coll.h"
00062
#include "unicode/ucol.h"
00063
#include "unicode/sortkey.h"
00064
#include "unicode/normlzr.h"
00065
00066
U_NAMESPACE_BEGIN
00067
00071
class StringSearch;
00075
class CollationElementIterator;
00076
00105
class U_I18N_API RuleBasedCollator :
public Collator
00106 {
00107 public:
00108
00109
00110
00120 RuleBasedCollator(
const UnicodeString& rules,
UErrorCode& status);
00121
00132 RuleBasedCollator(
const UnicodeString& rules,
00133 ECollationStrength collationStrength,
00134 UErrorCode& status);
00135
00146 RuleBasedCollator(
const UnicodeString& rules,
00147 UColAttributeValue decompositionMode,
00148 UErrorCode& status);
00149
00161 RuleBasedCollator(
const UnicodeString& rules,
00162 ECollationStrength collationStrength,
00163 UColAttributeValue decompositionMode,
00164 UErrorCode& status);
00165
00172 RuleBasedCollator(
const RuleBasedCollator& other);
00173
00174
00175
00180
virtual ~RuleBasedCollator();
00181
00182
00183
00189 RuleBasedCollator& operator=(
const RuleBasedCollator& other);
00190
00197
virtual UBool operator==(
const Collator& other)
const;
00198
00205
virtual UBool operator!=(
const Collator& other)
const;
00206
00213
virtual Collator*
clone(
void) const;
00214
00225 virtual
CollationElementIterator* createCollationElementIterator(
00226 const
UnicodeString& source) const;
00227
00237 virtual
CollationElementIterator* createCollationElementIterator(
00238 const
CharacterIterator& source) const;
00239
00252 virtual EComparisonResult compare(const
UnicodeString& source,
00253 const
UnicodeString& target) const;
00254
00255
00268 virtual UCollationResult compare(const
UnicodeString& source,
00269 const
UnicodeString& target,
00270 UErrorCode &status) const;
00271
00285 virtual EComparisonResult compare(const
UnicodeString& source,
00286 const
UnicodeString& target,
00287 int32_t
length) const;
00288
00302 virtual UCollationResult compare(const
UnicodeString& source,
00303 const
UnicodeString& target,
00304 int32_t length,
00305 UErrorCode &status) const;
00306
00340 virtual EComparisonResult compare(const
UChar* source, int32_t sourceLength,
00341 const UChar* target, int32_t targetLength)
00342 const;
00343
00360 virtual UCollationResult compare(const UChar* source, int32_t sourceLength,
00361 const UChar* target, int32_t targetLength,
00362 UErrorCode &status) const;
00363
00376 virtual
CollationKey& getCollationKey(const
UnicodeString& source,
00377
CollationKey& key,
00378 UErrorCode& status) const;
00379
00393 virtual
CollationKey& getCollationKey(const UChar *source,
00394 int32_t sourceLength,
00395
CollationKey& key,
00396 UErrorCode& status) const;
00397
00403 virtual int32_t hashCode(
void) const;
00404
00415 virtual const
Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const;
00416
00423 const
UnicodeString& getRules(
void) const;
00424
00430 virtual
void getVersion(
UVersionInfo info) const;
00431
00442 int32_t getMaxExpansion(int32_t order) const;
00443
00454 virtual
UClassID getDynamicClassID(
void) const;
00455
00467 static UClassID getStaticClassID(
void);
00468
00477
uint8_t *cloneRuleData(int32_t &length, UErrorCode &status);
00478
00486
void getRules(UColRuleOption delta,
UnicodeString &buffer);
00487
00495 virtual
void setAttribute(UColAttribute attr, UColAttributeValue value,
00496 UErrorCode &status);
00497
00505 virtual UColAttributeValue getAttribute(UColAttribute attr,
00506 UErrorCode &status);
00507
00518 virtual
uint32_t setVariableTop(const UChar *varTop, int32_t len, UErrorCode &status);
00519
00529 virtual uint32_t setVariableTop(const
UnicodeString varTop, UErrorCode &status);
00530
00538 virtual
void setVariableTop(const uint32_t varTop, UErrorCode &status);
00539
00546 virtual uint32_t getVariableTop(UErrorCode &status) const;
00547
00557 virtual
UnicodeSet *getTailoredSet(UErrorCode &status) const;
00558
00564 virtual
Collator* safeClone(
void);
00565
00576 virtual int32_t getSortKey(const
UnicodeString& source, uint8_t *result,
00577 int32_t resultLength) const;
00578
00591 virtual int32_t getSortKey(const UChar *source, int32_t sourceLength,
00592 uint8_t *result, int32_t resultLength) const;
00593
00604 virtual ECollationStrength getStrength(
void) const;
00605
00612 virtual
void setStrength(ECollationStrength newStrength);
00613
00614 private:
00615
00616
00617
00618 static const int32_t UNMAPPED;
00619 static const int32_t CHARINDEX;
00620 static const int32_t EXPANDCHARINDEX;
00621 static const int32_t CONTRACTCHARINDEX;
00622
00623 static const int32_t PRIMARYORDERINCREMENT;
00624 static const int32_t SECONDARYORDERINCREMENT;
00625 static const int32_t TERTIARYORDERINCREMENT;
00626 static const int32_t PRIMARYORDERMASK;
00627 static const int32_t SECONDARYORDERMASK;
00628 static const int32_t TERTIARYORDERMASK;
00629 static const int32_t IGNORABLEMASK;
00630 static const int32_t PRIMARYDIFFERENCEONLY;
00631 static const int32_t SECONDARYDIFFERENCEONLY;
00632 static const int32_t PRIMARYORDERSHIFT;
00633 static const int32_t SECONDARYORDERSHIFT;
00634
00635 static const int32_t COLELEMENTSTART;
00636 static const int32_t PRIMARYLOWZEROMASK;
00637 static const int32_t RESETSECONDARYTERTIARY;
00638 static const int32_t RESETTERTIARY;
00639
00640 static const int32_t PRIMIGNORABLE;
00641
00642
00643
00644 UBool dataIsOwned;
00645
00646 UBool isWriteThroughAlias;
00647
00652 UCollator *ucollator;
00653
00657
UnicodeString *urulestring;
00658
00659
00660
00664 friend class
CollationElementIterator;
00665
00670 friend class
Collator;
00671
00675 friend class
StringSearch;
00676
00677
00678
00682 RuleBasedCollator();
00683
00689 RuleBasedCollator(UCollator *collator,
UnicodeString *rule);
00690
00701 RuleBasedCollator(const
Locale& desiredLocale, UErrorCode& status);
00702
00711
void
00712 construct(const
UnicodeString& rules,
00713 UColAttributeValue collationStrength,
00714 UColAttributeValue decompositionMode,
00715 UErrorCode& status);
00716
00717
00718
00724
void setUCollator(const
Locale& locale, UErrorCode& status);
00725
00731
void setUCollator(const
char* locale, UErrorCode& status);
00732
00740
void setUCollator(UCollator *collator,
UnicodeString *rules);
00741
00742 public:
00748 const UCollator * getUCollator();
00749
00750 protected:
00757 virtual
void setLocales(const
Locale& requestedLocale, const
Locale& validLocale);
00758
00759 private:
00760
00761
00762
void checkOwned(
void);
00763
00764
00765
void setRuleStringFromCollator(UErrorCode& status);
00766
00773 Collator::EComparisonResult getEComparisonResult(
00774 const UCollationResult &result) const;
00775
00781 Collator::ECollationStrength getECollationStrength(
00782 const
UCollationStrength &strength) const;
00783
00789 UCollationStrength getUCollationStrength(
00790 const Collator::ECollationStrength &strength) const;
00791 };
00792
00793
00794
00795 inline
void RuleBasedCollator::setUCollator(const
Locale &locale,
00796 UErrorCode &status)
00797 {
00798 setUCollator(locale.getName(), status);
00799 }
00800
00801
00802
inline void RuleBasedCollator::setUCollator(UCollator *collator,
00803
UnicodeString *rules)
00804 {
00805
if (ucollator && dataIsOwned) {
00806
ucol_close(ucollator);
00807
delete urulestring;
00808 }
00809 ucollator = collator;
00810 urulestring = rules;
00811 dataIsOwned =
FALSE;
00812 isWriteThroughAlias =
TRUE;
00813 }
00814
00815
inline const UCollator *
RuleBasedCollator::getUCollator()
00816 {
00817
return ucollator;
00818 }
00819
00820
inline Collator::EComparisonResult RuleBasedCollator::getEComparisonResult(
00821
const UCollationResult &result)
const
00822
{
00823
switch (result)
00824 {
00825
case UCOL_LESS :
00826
return Collator::LESS;
00827
case UCOL_EQUAL :
00828
return Collator::EQUAL;
00829
default :
00830
return Collator::GREATER;
00831 }
00832 }
00833
00834
inline Collator::ECollationStrength RuleBasedCollator::getECollationStrength(
00835
const UCollationStrength &strength)
const
00836
{
00837
switch (strength)
00838 {
00839
case UCOL_PRIMARY :
00840
return Collator::PRIMARY;
00841
case UCOL_SECONDARY :
00842
return Collator::SECONDARY;
00843
case UCOL_TERTIARY :
00844
return Collator::TERTIARY;
00845
case UCOL_QUATERNARY :
00846
return Collator::QUATERNARY;
00847
default :
00848
return Collator::IDENTICAL;
00849 }
00850 }
00851
00852
inline UCollationStrength RuleBasedCollator::getUCollationStrength(
00853
const Collator::ECollationStrength &strength)
const
00854
{
00855
switch (strength)
00856 {
00857
case Collator::PRIMARY :
00858
return UCOL_PRIMARY;
00859
case Collator::SECONDARY :
00860
return UCOL_SECONDARY;
00861
case Collator::TERTIARY :
00862
return UCOL_TERTIARY;
00863
case Collator::QUATERNARY :
00864
return UCOL_QUATERNARY;
00865
default :
00866 return UCOL_IDENTICAL;
00867 }
00868 }
00869
00870
U_NAMESPACE_END
00871
00872
#endif
00873
00874
#endif