Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(41)

Unified Diff: source/i18n/collationcompare.cpp

Issue 1621843002: ICU 56 update step 1 (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/icu.git@561
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « source/i18n/collationbuilder.cpp ('k') | source/i18n/collationdata.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: source/i18n/collationcompare.cpp
diff --git a/source/i18n/collationcompare.cpp b/source/i18n/collationcompare.cpp
index 6f9107e9db516416fdbdec4493f6cd585d9897ac..3b72d05d718a0f6bb2e7221936a23f82e5562e29 100644
--- a/source/i18n/collationcompare.cpp
+++ b/source/i18n/collationcompare.cpp
@@ -1,6 +1,6 @@
/*
*******************************************************************************
-* Copyright (C) 1996-2014, International Business Machines
+* Copyright (C) 1996-2015, International Business Machines
* Corporation and others. All Rights Reserved.
*******************************************************************************
* collationcompare.cpp
@@ -40,7 +40,6 @@ CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterat
UBool anyVariable = FALSE;
// Fetch CEs, compare primaries, store secondary & tertiary weights.
- U_ALIGN_CODE(16);
for(;;) {
// We fetch CEs until we get a non-ignorable primary or reach the end.
uint32_t leftPrimary;
@@ -95,10 +94,9 @@ CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterat
if(leftPrimary != rightPrimary) {
// Return the primary difference, with script reordering.
- const uint8_t *reorderTable = settings.reorderTable;
- if (reorderTable != NULL) {
- leftPrimary = Collation::reorder(reorderTable, leftPrimary);
- rightPrimary = Collation::reorder(reorderTable, rightPrimary);
+ if(settings.hasReordering()) {
+ leftPrimary = settings.reorder(leftPrimary);
+ rightPrimary = settings.reorder(rightPrimary);
}
return (leftPrimary < rightPrimary) ? UCOL_LESS : UCOL_GREATER;
}
@@ -136,18 +134,17 @@ CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterat
int32_t rightStart = 0;
for(;;) {
// Find the merge separator or the NO_CE terminator.
+ uint32_t p;
int32_t leftLimit = leftStart;
- uint32_t leftLower32;
- while((leftLower32 = (uint32_t)left.getCE(leftLimit)) >
- Collation::MERGE_SEPARATOR_LOWER32 ||
- leftLower32 == 0) {
+ while((p = (uint32_t)(left.getCE(leftLimit) >> 32)) >
+ Collation::MERGE_SEPARATOR_PRIMARY ||
+ p == 0) {
++leftLimit;
}
int32_t rightLimit = rightStart;
- uint32_t rightLower32;
- while((rightLower32 = (uint32_t)right.getCE(rightLimit)) >
- Collation::MERGE_SEPARATOR_LOWER32 ||
- rightLower32 == 0) {
+ while((p = (uint32_t)(right.getCE(rightLimit) >> 32)) >
+ Collation::MERGE_SEPARATOR_PRIMARY ||
+ p == 0) {
++rightLimit;
}
@@ -175,7 +172,7 @@ CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterat
// Both strings have the same number of merge separators,
// or else there would have been a primary-level difference.
U_ASSERT(left.getCE(leftLimit) == right.getCE(rightLimit));
- if(left.getCE(leftLimit) == Collation::NO_CE) { break; }
+ if(p == Collation::NO_CE_PRIMARY) { break; }
// Skip both merge separators and continue.
leftStart = leftLimit + 1;
rightStart = rightLimit + 1;
@@ -276,20 +273,19 @@ CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterat
if(leftTertiary != rightTertiary) {
if(CollationSettings::sortsTertiaryUpperCaseFirst(options)) {
- // Pass through NO_CE and MERGE_SEPARATOR
- // and keep real tertiary weights larger than the MERGE_SEPARATOR.
+ // Pass through NO_CE and keep real tertiary weights larger than that.
// Do not change the artificial uppercase weight of a tertiary CE (0.0.ut),
// to keep tertiary CEs well-formed.
// Their case+tertiary weights must be greater than those of
// primary and secondary CEs.
- if(leftTertiary > Collation::MERGE_SEPARATOR_WEIGHT16) {
+ if(leftTertiary > Collation::NO_CE_WEIGHT16) {
if(leftLower32 > 0xffff) {
leftTertiary ^= 0xc000;
} else {
leftTertiary += 0x4000;
}
}
- if(rightTertiary > Collation::MERGE_SEPARATOR_WEIGHT16) {
+ if(rightTertiary > Collation::NO_CE_WEIGHT16) {
if(rightLower32 > 0xffff) {
rightTertiary ^= 0xc000;
} else {
@@ -316,11 +312,9 @@ CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterat
do {
int64_t ce = left.getCE(leftIndex++);
leftQuaternary = (uint32_t)ce & 0xffff;
- if(leftQuaternary == 0) {
- // Variable primary or completely ignorable.
+ if(leftQuaternary <= Collation::NO_CE_WEIGHT16) {
+ // Variable primary or completely ignorable or NO_CE.
leftQuaternary = (uint32_t)(ce >> 32);
- } else if(leftQuaternary <= Collation::MERGE_SEPARATOR_WEIGHT16) {
- // Leave NO_CE or MERGE_SEPARATOR as is.
} else {
// Regular CE, not tertiary ignorable.
// Preserve the quaternary weight in bits 7..6.
@@ -332,11 +326,9 @@ CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterat
do {
int64_t ce = right.getCE(rightIndex++);
rightQuaternary = (uint32_t)ce & 0xffff;
- if(rightQuaternary == 0) {
- // Variable primary or completely ignorable.
+ if(rightQuaternary <= Collation::NO_CE_WEIGHT16) {
+ // Variable primary or completely ignorable or NO_CE.
rightQuaternary = (uint32_t)(ce >> 32);
- } else if(rightQuaternary <= Collation::MERGE_SEPARATOR_WEIGHT16) {
- // Leave NO_CE or MERGE_SEPARATOR as is.
} else {
// Regular CE, not tertiary ignorable.
// Preserve the quaternary weight in bits 7..6.
@@ -346,14 +338,13 @@ CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterat
if(leftQuaternary != rightQuaternary) {
// Return the difference, with script reordering.
- const uint8_t *reorderTable = settings.reorderTable;
- if (reorderTable != NULL) {
- leftQuaternary = Collation::reorder(reorderTable, leftQuaternary);
- rightQuaternary = Collation::reorder(reorderTable, rightQuaternary);
+ if(settings.hasReordering()) {
+ leftQuaternary = settings.reorder(leftQuaternary);
+ rightQuaternary = settings.reorder(rightQuaternary);
}
return (leftQuaternary < rightQuaternary) ? UCOL_LESS : UCOL_GREATER;
}
- if(leftQuaternary == Collation::NO_CE_WEIGHT16) { break; }
+ if(leftQuaternary == Collation::NO_CE_PRIMARY) { break; }
}
return UCOL_EQUAL;
}
« no previous file with comments | « source/i18n/collationbuilder.cpp ('k') | source/i18n/collationdata.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698