void CollationSettings::aliasReordering(const CollationData &data, const int32_t *codes, int32_t length, const uint32_t *ranges, int32_t rangesLength, const uint8_t *table, UErrorCode &errorCode) { if(U_FAILURE(errorCode)) { return; } if(table != NULL && (rangesLength == 0 ? !reorderTableHasSplitBytes(table) : rangesLength >= 2 && // The first offset must be 0. The last offset must not be 0. (ranges[0] & 0xffff) == 0 && (ranges[rangesLength - 1] & 0xffff) != 0)) { // We need to release the memory before setting the alias pointer. if(reorderCodesCapacity != 0) { uprv_free(const_cast<int32_t *>(reorderCodes)); reorderCodesCapacity = 0; } reorderTable = table; reorderCodes = codes; reorderCodesLength = length; // Drop ranges before the first split byte. They are reordered by the table. // This then speeds up reordering of the remaining ranges. int32_t firstSplitByteRangeIndex = 0; while(firstSplitByteRangeIndex < rangesLength && (ranges[firstSplitByteRangeIndex] & 0xff0000) == 0) { // The second byte of the primary limit is 0. ++firstSplitByteRangeIndex; } if(firstSplitByteRangeIndex == rangesLength) { U_ASSERT(!reorderTableHasSplitBytes(table)); minHighNoReorder = 0; reorderRanges = NULL; reorderRangesLength = 0; } else { U_ASSERT(table[ranges[firstSplitByteRangeIndex] >> 24] == 0); minHighNoReorder = ranges[rangesLength - 1] & 0xffff0000; reorderRanges = ranges + firstSplitByteRangeIndex; reorderRangesLength = rangesLength - firstSplitByteRangeIndex; } return; } // Regenerate missing data. setReordering(data, codes, length, errorCode); }
U_NAMESPACE_BEGIN CollationSettings::CollationSettings(const CollationSettings &other) : SharedObject(other), options(other.options), variableTop(other.variableTop), reorderTable(NULL), reorderCodes(NULL), reorderCodesLength(0), reorderCodesCapacity(0), fastLatinOptions(other.fastLatinOptions) { int32_t length = other.reorderCodesLength; if(length == 0) { U_ASSERT(other.reorderTable == NULL); } else { U_ASSERT(other.reorderTable != NULL); if(other.reorderCodesCapacity == 0) { aliasReordering(other.reorderCodes, length, other.reorderTable); } else { setReordering(other.reorderCodes, length, other.reorderTable); } } if(fastLatinOptions >= 0) { uprv_memcpy(fastLatinPrimaries, other.fastLatinPrimaries, sizeof(fastLatinPrimaries)); } }