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