/* ****************************************************************************** * Copyright (C) 1996-2001, International Business Machines Corporation and * * others. All Rights Reserved. * ****************************************************************************** */ /** * File coll.cpp * * Created by: Helena Shih * * Modification History: * * Date Name Description * 2/5/97 aliu Modified createDefault to load collation data from * binary files when possible. Added related methods * createCollationFromFile, chopLocale, createPathName. * 2/11/97 aliu Added methods addToCache, findInCache, which implement * a Collation cache. Modified createDefault to look in * cache first, and also to store newly created Collation * objects in the cache. Modified to not use gLocPath. * 2/12/97 aliu Modified to create objects from RuleBasedCollator cache. * Moved cache out of Collation class. * 2/13/97 aliu Moved several methods out of this class and into * RuleBasedCollator, with modifications. Modified * createDefault() to call new RuleBasedCollator(Locale&) * constructor. General clean up and documentation. * 2/20/97 helena Added clone, operator==, operator!=, operator=, and copy * constructor. * 05/06/97 helena Added memory allocation error detection. * 05/08/97 helena Added createInstance(). * 6/20/97 helena Java class name change. * 04/23/99 stephen Removed EDecompositionMode, merged with * Normalizer::EMode * 11/23/9 srl Inlining of some critical functions * 01/29/01 synwee Modified into a C++ wrapper calling C APIs (ucol.h) */ #include "unicode/coll.h" #include "unicode/tblcoll.h" #include "cmemory.h" // Collator public methods ----------------------------------------------- Collator* Collator::createInstance(UErrorCode& success) { if (U_FAILURE(success)) return 0; return createInstance(Locale::getDefault(), success); } Collator* Collator::createInstance(const Locale& desiredLocale, UErrorCode& status) { if (U_FAILURE(status)) return 0; // A bit of explanation is required here. Although in the current // implementation // Collator::createInstance() is just turning around and calling // RuleBasedCollator(Locale&), this will not necessarily always be the // case. For example, suppose we modify this code to handle a // non-table-based Collator, such as that for Thai. In this case, // createInstance() will have to be modified to somehow determine this fact // (perhaps a field in the resource bundle). Then it can construct the // non-table-based Collator in some other way, when it sees that it needs // to. // The specific caution is this: RuleBasedCollator(Locale&) will ALWAYS // return a valid collation object, if the system if functioning properly. // The reason is that it will fall back, use the default locale, and even // use the built-in default collation rules. THEREFORE, createInstance() // should in general ONLY CALL RuleBasedCollator(Locale&) IF IT KNOWS IN // ADVANCE that the given locale's collation is properly implemented as a // RuleBasedCollator. // Currently, we don't do this...we always return a RuleBasedCollator, // whether it is strictly correct to do so or not, without checking, because // we currently have no way of checking. RuleBasedCollator* collation = new RuleBasedCollator(desiredLocale, status); if (U_FAILURE(status)) { delete collation; collation = NULL; } return collation; } Collator * Collator::createInstance(const Locale &loc, UVersionInfo version, UErrorCode &status) { Collator *collator; UVersionInfo info; collator=new RuleBasedCollator(loc, status); if(U_SUCCESS(status)) { collator->getVersion(info); if(0!=uprv_memcmp(version, info, sizeof(UVersionInfo))) { delete collator; status=U_MISSING_RESOURCE_ERROR; return NULL; } } return collator; } UBool Collator::equals(const UnicodeString& source, const UnicodeString& target) const { return (compare(source, target) == EQUAL); } UBool Collator::greaterOrEqual(const UnicodeString& source, const UnicodeString& target) const { return (compare(source, target) != LESS); } UBool Collator::greater(const UnicodeString& source, const UnicodeString& target) const { return (compare(source, target) == GREATER); } const Locale* Collator::getAvailableLocales(int32_t& count) { return Locale::getAvailableLocales(count); } UnicodeString& Collator::getDisplayName(const Locale& objectLocale, const Locale& displayLocale, UnicodeString& name) { // synwee : in a dilemma whether to change to UCollator. Since // UCollator is basically using the below operation. // Change means more mantainability where else no change means faster speed. return objectLocale.getDisplayName(displayLocale, name); } UnicodeString& Collator::getDisplayName(const Locale& objectLocale, UnicodeString& name) { // synwee : in a dilemma whether to change to UCollator. Since // UCollator is basically using the below operation. // Change means more mantainability where else no change means faster speed. return objectLocale.getDisplayName(Locale::getDefault(), name); } void Collator::getVersion(UVersionInfo versionInfo) const { if (versionInfo!=NULL) uprv_memcpy(versionInfo, fVersion, U_MAX_VERSION_LENGTH); } // UCollator protected constructor destructor ---------------------------- /** * Default constructor. * Constructor is different from the old default Collator constructor. * The task for determing the default collation strength and normalization mode * is left to the child class. */ Collator::Collator() { } /** * Constructor. * Empty constructor, does not handle the arguments. * This constructor is done for backward compatibility with 1.7 and 1.8. * The task for handling the argument collation strength and normalization * mode is left to the child class. * @param collationStrength collation strength * @param decompositionMode */ Collator::Collator(UCollationStrength /* collationStrength */, UNormalizationMode /* decompositionMode */) { } Collator::~Collator() { } Collator::Collator(const Collator& /* other */) { } // UCollator private data members ---------------------------------------- const UVersionInfo Collator::fVersion = {1, 1, 0, 0};