| Index: source/i18n/collationtailoring.cpp
|
| diff --git a/source/i18n/collationtailoring.cpp b/source/i18n/collationtailoring.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..caa0c082d0718922b840d7eb24eb1efc66c45776
|
| --- /dev/null
|
| +++ b/source/i18n/collationtailoring.cpp
|
| @@ -0,0 +1,110 @@
|
| +/*
|
| +*******************************************************************************
|
| +* Copyright (C) 2013-2014, International Business Machines
|
| +* Corporation and others. All Rights Reserved.
|
| +*******************************************************************************
|
| +* collationtailoring.cpp
|
| +*
|
| +* created on: 2013mar12
|
| +* created by: Markus W. Scherer
|
| +*/
|
| +
|
| +#include "unicode/utypes.h"
|
| +
|
| +#if !UCONFIG_NO_COLLATION
|
| +
|
| +#include "unicode/udata.h"
|
| +#include "unicode/unistr.h"
|
| +#include "unicode/ures.h"
|
| +#include "unicode/uversion.h"
|
| +#include "unicode/uvernum.h"
|
| +#include "cmemory.h"
|
| +#include "collationdata.h"
|
| +#include "collationsettings.h"
|
| +#include "collationtailoring.h"
|
| +#include "normalizer2impl.h"
|
| +#include "uassert.h"
|
| +#include "uhash.h"
|
| +#include "umutex.h"
|
| +#include "utrie2.h"
|
| +
|
| +U_NAMESPACE_BEGIN
|
| +
|
| +CollationTailoring::CollationTailoring(const CollationSettings *baseSettings)
|
| + : data(NULL), settings(baseSettings),
|
| + actualLocale(""),
|
| + ownedData(NULL),
|
| + builder(NULL), memory(NULL), bundle(NULL),
|
| + trie(NULL), unsafeBackwardSet(NULL),
|
| + maxExpansions(NULL) {
|
| + if(baseSettings != NULL) {
|
| + U_ASSERT(baseSettings->reorderCodesLength == 0);
|
| + U_ASSERT(baseSettings->reorderTable == NULL);
|
| + } else {
|
| + settings = new CollationSettings();
|
| + }
|
| + if(settings != NULL) {
|
| + settings->addRef();
|
| + }
|
| + rules.getTerminatedBuffer(); // ensure NUL-termination
|
| + version[0] = version[1] = version[2] = version[3] = 0;
|
| + maxExpansionsInitOnce.reset();
|
| +}
|
| +
|
| +CollationTailoring::~CollationTailoring() {
|
| + SharedObject::clearPtr(settings);
|
| + delete ownedData;
|
| + delete builder;
|
| + udata_close(memory);
|
| + ures_close(bundle);
|
| + utrie2_close(trie);
|
| + delete unsafeBackwardSet;
|
| + uhash_close(maxExpansions);
|
| + maxExpansionsInitOnce.reset();
|
| +}
|
| +
|
| +UBool
|
| +CollationTailoring::ensureOwnedData(UErrorCode &errorCode) {
|
| + if(U_FAILURE(errorCode)) { return FALSE; }
|
| + if(ownedData == NULL) {
|
| + const Normalizer2Impl *nfcImpl = Normalizer2Factory::getNFCImpl(errorCode);
|
| + if(U_FAILURE(errorCode)) { return FALSE; }
|
| + ownedData = new CollationData(*nfcImpl);
|
| + if(ownedData == NULL) {
|
| + errorCode = U_MEMORY_ALLOCATION_ERROR;
|
| + return FALSE;
|
| + }
|
| + }
|
| + data = ownedData;
|
| + return TRUE;
|
| +}
|
| +
|
| +void
|
| +CollationTailoring::makeBaseVersion(const UVersionInfo ucaVersion, UVersionInfo version) {
|
| + version[0] = UCOL_BUILDER_VERSION;
|
| + version[1] = (ucaVersion[0] << 3) + ucaVersion[1];
|
| + version[2] = ucaVersion[2] << 6;
|
| + version[3] = 0;
|
| +}
|
| +
|
| +void
|
| +CollationTailoring::setVersion(const UVersionInfo baseVersion, const UVersionInfo rulesVersion) {
|
| + version[0] = UCOL_BUILDER_VERSION;
|
| + version[1] = baseVersion[1];
|
| + version[2] = (baseVersion[2] & 0xc0) + ((rulesVersion[0] + (rulesVersion[0] >> 6)) & 0x3f);
|
| + version[3] = (rulesVersion[1] << 3) + (rulesVersion[1] >> 5) + rulesVersion[2] +
|
| + (rulesVersion[3] << 4) + (rulesVersion[3] >> 4);
|
| +}
|
| +
|
| +int32_t
|
| +CollationTailoring::getUCAVersion() const {
|
| + return ((int32_t)version[1] << 4) | (version[2] >> 6);
|
| +}
|
| +
|
| +CollationCacheEntry::~CollationCacheEntry() {
|
| + SharedObject::clearPtr(tailoring);
|
| +}
|
| +
|
| +U_NAMESPACE_END
|
| +
|
| +#endif // !UCONFIG_NO_COLLATION
|
|
|