123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272 |
- #ifndef COLL_H
- #define COLL_H
- #include "unicode/utypes.h"
- #if !UCONFIG_NO_COLLATION
- #include "unicode/uobject.h"
- #include "unicode/ucol.h"
- #include "unicode/normlzr.h"
- #include "unicode/locid.h"
- #include "unicode/uniset.h"
- #include "unicode/umisc.h"
- #include "unicode/uiter.h"
- #include "unicode/stringpiece.h"
- U_NAMESPACE_BEGIN
- class StringEnumeration;
- #if !UCONFIG_NO_SERVICE
- /**
- * @stable ICU 2.6
- */
- class CollatorFactory;
- #endif
- /**
- * @stable ICU 2.0
- */
- class CollationKey;
- /**
- * The <code>Collator</code> class performs locale-sensitive string
- * comparison.<br>
- * You use this class to build searching and sorting routines for natural
- * language text.
- * <p>
- * <code>Collator</code> is an abstract base class. Subclasses implement
- * specific collation strategies. One subclass,
- * <code>RuleBasedCollator</code>, is currently provided and is applicable
- * to a wide set of languages. Other subclasses may be created to handle more
- * specialized needs.
- * <p>
- * Like other locale-sensitive classes, you can use the static factory method,
- * <code>createInstance</code>, to obtain the appropriate
- * <code>Collator</code> object for a given locale. You will only need to
- * look at the subclasses of <code>Collator</code> if you need to
- * understand the details of a particular collation strategy or if you need to
- * modify that strategy.
- * <p>
- * The following example shows how to compare two strings using the
- * <code>Collator</code> for the default locale.
- * \htmlonly<blockquote>\endhtmlonly
- * <pre>
- * \code
- * // Compare two strings in the default locale
- * UErrorCode success = U_ZERO_ERROR;
- * Collator* myCollator = Collator::createInstance(success);
- * if (myCollator->compare("abc", "ABC") < 0)
- * cout << "abc is less than ABC" << endl;
- * else
- * cout << "abc is greater than or equal to ABC" << endl;
- * \endcode
- * </pre>
- * \htmlonly</blockquote>\endhtmlonly
- * <p>
- * You can set a <code>Collator</code>'s <em>strength</em> attribute to
- * determine the level of difference considered significant in comparisons.
- * Five strengths are provided: <code>PRIMARY</code>, <code>SECONDARY</code>,
- * <code>TERTIARY</code>, <code>QUATERNARY</code> and <code>IDENTICAL</code>.
- * The exact assignment of strengths to language features is locale dependent.
- * For example, in Czech, "e" and "f" are considered primary differences,
- * while "e" and "\u00EA" are secondary differences, "e" and "E" are tertiary
- * differences and "e" and "e" are identical. The following shows how both case
- * and accents could be ignored for US English.
- * \htmlonly<blockquote>\endhtmlonly
- * <pre>
- * \code
- * //Get the Collator for US English and set its strength to PRIMARY
- * UErrorCode success = U_ZERO_ERROR;
- * Collator* usCollator = Collator::createInstance(Locale::getUS(), success);
- * usCollator->setStrength(Collator::PRIMARY);
- * if (usCollator->compare("abc", "ABC") == 0)
- * cout << "'abc' and 'ABC' strings are equivalent with strength PRIMARY" << endl;
- * \endcode
- * </pre>
- * \htmlonly</blockquote>\endhtmlonly
- *
- * The <code>getSortKey</code> methods
- * convert a string to a series of bytes that can be compared bitwise against
- * other sort keys using <code>strcmp()</code>. Sort keys are written as
- * zero-terminated byte strings.
- *
- * Another set of APIs returns a <code>CollationKey</code> object that wraps
- * the sort key bytes instead of returning the bytes themselves.
- * </p>
- * <p>
- * <strong>Note:</strong> <code>Collator</code>s with different Locale,
- * and CollationStrength settings will return different sort
- * orders for the same set of strings. Locales have specific collation rules,
- * and the way in which secondary and tertiary differences are taken into
- * account, for example, will result in a different sorting order for same
- * strings.
- * </p>
- * @see RuleBasedCollator
- * @see CollationKey
- * @see CollationElementIterator
- * @see Locale
- * @see Normalizer
- * @version 2.0 11/15/01
- */
- class U_I18N_API Collator : public UObject {
- public:
-
-
- enum ECollationStrength
- {
- PRIMARY = UCOL_PRIMARY,
- SECONDARY = UCOL_SECONDARY,
- TERTIARY = UCOL_TERTIARY,
- QUATERNARY = UCOL_QUATERNARY,
- IDENTICAL = UCOL_IDENTICAL
- };
-
-
-
- enum EComparisonResult
- {
- LESS = UCOL_LESS,
- EQUAL = UCOL_EQUAL,
- GREATER = UCOL_GREATER
- };
-
-
- virtual ~Collator();
-
-
- virtual UBool operator==(const Collator& other) const;
-
- virtual UBool operator!=(const Collator& other) const;
-
- virtual Collator* clone(void) const = 0;
-
- static Collator* U_EXPORT2 createInstance(UErrorCode& err);
-
- static Collator* U_EXPORT2 createInstance(const Locale& loc, UErrorCode& err);
-
- virtual EComparisonResult compare(const UnicodeString& source,
- const UnicodeString& target) const;
-
- virtual UCollationResult compare(const UnicodeString& source,
- const UnicodeString& target,
- UErrorCode &status) const = 0;
-
- virtual EComparisonResult compare(const UnicodeString& source,
- const UnicodeString& target,
- int32_t length) const;
-
- virtual UCollationResult compare(const UnicodeString& source,
- const UnicodeString& target,
- int32_t length,
- UErrorCode &status) const = 0;
-
- virtual EComparisonResult compare(const UChar* source, int32_t sourceLength,
- const UChar* target, int32_t targetLength)
- const;
-
- virtual UCollationResult compare(const UChar* source, int32_t sourceLength,
- const UChar* target, int32_t targetLength,
- UErrorCode &status) const = 0;
-
- virtual UCollationResult compare(UCharIterator &sIter,
- UCharIterator &tIter,
- UErrorCode &status) const;
-
- virtual UCollationResult compareUTF8(const StringPiece &source,
- const StringPiece &target,
- UErrorCode &status) const;
-
- virtual CollationKey& getCollationKey(const UnicodeString& source,
- CollationKey& key,
- UErrorCode& status) const = 0;
-
- virtual CollationKey& getCollationKey(const UChar*source,
- int32_t sourceLength,
- CollationKey& key,
- UErrorCode& status) const = 0;
-
- virtual int32_t hashCode(void) const = 0;
-
- virtual Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const = 0;
-
- UBool greater(const UnicodeString& source, const UnicodeString& target)
- const;
-
- UBool greaterOrEqual(const UnicodeString& source,
- const UnicodeString& target) const;
-
- UBool equals(const UnicodeString& source, const UnicodeString& target) const;
-
- virtual ECollationStrength getStrength(void) const;
-
- virtual void setStrength(ECollationStrength newStrength);
-
- virtual int32_t getReorderCodes(int32_t *dest,
- int32_t destCapacity,
- UErrorCode& status) const;
-
- virtual void setReorderCodes(const int32_t* reorderCodes,
- int32_t reorderCodesLength,
- UErrorCode& status) ;
-
- static int32_t U_EXPORT2 getEquivalentReorderCodes(int32_t reorderCode,
- int32_t* dest,
- int32_t destCapacity,
- UErrorCode& status);
-
- static UnicodeString& U_EXPORT2 getDisplayName(const Locale& objectLocale,
- const Locale& displayLocale,
- UnicodeString& name);
-
- static UnicodeString& U_EXPORT2 getDisplayName(const Locale& objectLocale,
- UnicodeString& name);
-
- static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count);
-
- static StringEnumeration* U_EXPORT2 getAvailableLocales(void);
-
- static StringEnumeration* U_EXPORT2 getKeywords(UErrorCode& status);
-
- static StringEnumeration* U_EXPORT2 getKeywordValues(const char *keyword, UErrorCode& status);
-
- static StringEnumeration* U_EXPORT2 getKeywordValuesForLocale(const char* keyword, const Locale& locale,
- UBool commonlyUsed, UErrorCode& status);
-
- static Locale U_EXPORT2 getFunctionalEquivalent(const char* keyword, const Locale& locale,
- UBool& isAvailable, UErrorCode& status);
- #if !UCONFIG_NO_SERVICE
-
- static URegistryKey U_EXPORT2 registerInstance(Collator* toAdopt, const Locale& locale, UErrorCode& status);
-
- static URegistryKey U_EXPORT2 registerFactory(CollatorFactory* toAdopt, UErrorCode& status);
-
- static UBool U_EXPORT2 unregister(URegistryKey key, UErrorCode& status);
- #endif
-
- virtual void getVersion(UVersionInfo info) const = 0;
-
- virtual UClassID getDynamicClassID(void) const = 0;
-
- virtual void setAttribute(UColAttribute attr, UColAttributeValue value,
- UErrorCode &status) = 0;
-
- virtual UColAttributeValue getAttribute(UColAttribute attr,
- UErrorCode &status) const = 0;
-
- virtual Collator &setMaxVariable(UColReorderCode group, UErrorCode &errorCode);
-
- virtual UColReorderCode getMaxVariable() const;
-
- virtual uint32_t setVariableTop(const UChar *varTop, int32_t len, UErrorCode &status) = 0;
-
- virtual uint32_t setVariableTop(const UnicodeString &varTop, UErrorCode &status) = 0;
-
- virtual void setVariableTop(uint32_t varTop, UErrorCode &status) = 0;
-
- virtual uint32_t getVariableTop(UErrorCode &status) const = 0;
-
- virtual UnicodeSet *getTailoredSet(UErrorCode &status) const;
-
- virtual Collator* safeClone(void) const;
-
- virtual int32_t getSortKey(const UnicodeString& source,
- uint8_t* result,
- int32_t resultLength) const = 0;
-
- virtual int32_t getSortKey(const UChar*source, int32_t sourceLength,
- uint8_t*result, int32_t resultLength) const = 0;
-
- static int32_t U_EXPORT2 getBound(const uint8_t *source,
- int32_t sourceLength,
- UColBoundMode boundType,
- uint32_t noOfLevels,
- uint8_t *result,
- int32_t resultLength,
- UErrorCode &status);
- protected:
-
-
- Collator();
- #ifndef U_HIDE_DEPRECATED_API
-
- Collator(UCollationStrength collationStrength,
- UNormalizationMode decompositionMode);
- #endif
-
- Collator(const Collator& other);
- public:
-
- virtual void setLocales(const Locale& requestedLocale, const Locale& validLocale, const Locale& actualLocale);
-
- virtual int32_t internalGetShortDefinitionString(const char *locale,
- char *buffer,
- int32_t capacity,
- UErrorCode &status) const;
-
- virtual UCollationResult internalCompareUTF8(
- const char *left, int32_t leftLength,
- const char *right, int32_t rightLength,
- UErrorCode &errorCode) const;
-
- virtual int32_t
- internalNextSortKeyPart(
- UCharIterator *iter, uint32_t state[2],
- uint8_t *dest, int32_t count, UErrorCode &errorCode) const;
- #ifndef U_HIDE_INTERNAL_API
-
- static inline Collator *fromUCollator(UCollator *uc) {
- return reinterpret_cast<Collator *>(uc);
- }
-
- static inline const Collator *fromUCollator(const UCollator *uc) {
- return reinterpret_cast<const Collator *>(uc);
- }
-
- inline UCollator *toUCollator() {
- return reinterpret_cast<UCollator *>(this);
- }
-
- inline const UCollator *toUCollator() const {
- return reinterpret_cast<const UCollator *>(this);
- }
- #endif
- private:
-
- Collator& operator=(const Collator& other);
- friend class CFactory;
- friend class SimpleCFactory;
- friend class ICUCollatorFactory;
- friend class ICUCollatorService;
- static Collator* makeInstance(const Locale& desiredLocale,
- UErrorCode& status);
- };
- #if !UCONFIG_NO_SERVICE
- /**
- * A factory, used with registerFactory, the creates multiple collators and provides
- * display names for them. A factory supports some number of locales-- these are the
- * locales for which it can create collators. The factory can be visible, in which
- * case the supported locales will be enumerated by getAvailableLocales, or invisible,
- * in which they are not. Invisible locales are still supported, they are just not
- * listed by getAvailableLocales.
- * <p>
- * If standard locale display names are sufficient, Collator instances can
- * be registered using registerInstance instead.</p>
- * <p>
- * Note: if the collators are to be used from C APIs, they must be instances
- * of RuleBasedCollator.</p>
- *
- * @stable ICU 2.6
- */
- class U_I18N_API CollatorFactory : public UObject {
- public:
-
- virtual ~CollatorFactory();
-
- virtual UBool visible(void) const;
-
- virtual Collator* createCollator(const Locale& loc) = 0;
-
- virtual UnicodeString& getDisplayName(const Locale& objectLocale,
- const Locale& displayLocale,
- UnicodeString& result);
-
- virtual const UnicodeString * getSupportedIDs(int32_t &count, UErrorCode& status) = 0;
- };
- #endif
- U_NAMESPACE_END
- #endif
- #endif
|