| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 ********************************************************************** | |
| 3 * Copyright (c) 2013-2014, International Business Machines | |
| 4 * Corporation and others. All Rights Reserved. | |
| 5 ********************************************************************** | |
| 6 */ | |
| 7 | |
| 8 #include <string.h> | |
| 9 #include "unicode/localpointer.h" | |
| 10 #include "unicode/uperf.h" | |
| 11 #include "unicode/ucol.h" | |
| 12 #include "unicode/coll.h" | |
| 13 #include "unicode/uiter.h" | |
| 14 #include "unicode/ustring.h" | |
| 15 #include "unicode/sortkey.h" | |
| 16 #include "uarrsort.h" | |
| 17 #include "uoptions.h" | |
| 18 #include "ustr_imp.h" | |
| 19 | |
| 20 #define COMPACT_ARRAY(CompactArrays, UNIT) \ | |
| 21 struct CompactArrays{\ | |
| 22 CompactArrays(const CompactArrays & );\ | |
| 23 CompactArrays & operator=(const CompactArrays & );\ | |
| 24 int32_t count;/*total number of the strings*/ \ | |
| 25 int32_t * index;/*relative offset in data*/ \ | |
| 26 UNIT * data; /*the real space to hold strings*/ \ | |
| 27 \ | |
| 28 ~CompactArrays(){free(index);free(data);} \ | |
| 29 CompactArrays() : count(0), index(NULL), data(NULL) { \ | |
| 30 index = (int32_t *) realloc(index, sizeof(int32_t)); \ | |
| 31 index[0] = 0; \ | |
| 32 } \ | |
| 33 void append_one(int32_t theLen){ /*include terminal NULL*/ \ | |
| 34 count++; \ | |
| 35 index = (int32_t *) realloc(index, sizeof(int32_t) * (count + 1)); \ | |
| 36 index[count] = index[count - 1] + theLen; \ | |
| 37 data = (UNIT *) realloc(data, sizeof(UNIT) * index[count]); \ | |
| 38 } \ | |
| 39 UNIT * last(){return data + index[count - 1];} \ | |
| 40 const UNIT * dataOf(int32_t i) const {return data + index[i];} \ | |
| 41 int32_t lengthOf(int i) const {return index[i+1] - index[i] - 1; } /*exclude
terminating NULL*/ \ | |
| 42 }; | |
| 43 | |
| 44 COMPACT_ARRAY(CA_uchar, UChar) | |
| 45 COMPACT_ARRAY(CA_char, char) | |
| 46 | |
| 47 #define MAX_TEST_STRINGS_FOR_PERMUTING 1000 | |
| 48 | |
| 49 // C API test cases | |
| 50 | |
| 51 // | |
| 52 // Test case taking a single test data array, calling ucol_strcoll by permuting
the test data | |
| 53 // | |
| 54 class Strcoll : public UPerfFunction | |
| 55 { | |
| 56 public: | |
| 57 Strcoll(const UCollator* coll, const CA_uchar* source, UBool useLen); | |
| 58 ~Strcoll(); | |
| 59 virtual void call(UErrorCode* status); | |
| 60 virtual long getOperationsPerIteration(); | |
| 61 | |
| 62 private: | |
| 63 const UCollator *coll; | |
| 64 const CA_uchar *source; | |
| 65 UBool useLen; | |
| 66 int32_t maxTestStrings; | |
| 67 }; | |
| 68 | |
| 69 Strcoll::Strcoll(const UCollator* coll, const CA_uchar* source, UBool useLen) | |
| 70 : coll(coll), | |
| 71 source(source), | |
| 72 useLen(useLen) | |
| 73 { | |
| 74 maxTestStrings = source->count > MAX_TEST_STRINGS_FOR_PERMUTING ? MAX_TEST_S
TRINGS_FOR_PERMUTING : source->count; | |
| 75 } | |
| 76 | |
| 77 Strcoll::~Strcoll() | |
| 78 { | |
| 79 } | |
| 80 | |
| 81 void Strcoll::call(UErrorCode* status) | |
| 82 { | |
| 83 if (U_FAILURE(*status)) return; | |
| 84 | |
| 85 // call strcoll for permutation | |
| 86 int32_t divisor = source->count / maxTestStrings; | |
| 87 int32_t srcLen, tgtLen; | |
| 88 int32_t cmp = 0; | |
| 89 for (int32_t i = 0, numTestStringsI = 0; i < source->count && numTestStrings
I < maxTestStrings; i++) { | |
| 90 if (i % divisor) continue; | |
| 91 numTestStringsI++; | |
| 92 srcLen = useLen ? source->lengthOf(i) : -1; | |
| 93 for (int32_t j = 0, numTestStringsJ = 0; j < source->count && numTestStr
ingsJ < maxTestStrings; j++) { | |
| 94 if (j % divisor) continue; | |
| 95 numTestStringsJ++; | |
| 96 tgtLen = useLen ? source->lengthOf(j) : -1; | |
| 97 cmp += ucol_strcoll(coll, source->dataOf(i), srcLen, source->dataOf(
j), tgtLen); | |
| 98 } | |
| 99 } | |
| 100 // At the end, cmp must be 0 | |
| 101 if (cmp != 0) { | |
| 102 *status = U_INTERNAL_PROGRAM_ERROR; | |
| 103 } | |
| 104 } | |
| 105 | |
| 106 long Strcoll::getOperationsPerIteration() | |
| 107 { | |
| 108 return maxTestStrings * maxTestStrings; | |
| 109 } | |
| 110 | |
| 111 // | |
| 112 // Test case taking two test data arrays, calling ucol_strcoll for strings at a
same index | |
| 113 // | |
| 114 class Strcoll_2 : public UPerfFunction | |
| 115 { | |
| 116 public: | |
| 117 Strcoll_2(const UCollator* coll, const CA_uchar* source, const CA_uchar* tar
get, UBool useLen); | |
| 118 ~Strcoll_2(); | |
| 119 virtual void call(UErrorCode* status); | |
| 120 virtual long getOperationsPerIteration(); | |
| 121 | |
| 122 private: | |
| 123 const UCollator *coll; | |
| 124 const CA_uchar *source; | |
| 125 const CA_uchar *target; | |
| 126 UBool useLen; | |
| 127 }; | |
| 128 | |
| 129 Strcoll_2::Strcoll_2(const UCollator* coll, const CA_uchar* source, const CA_uch
ar* target, UBool useLen) | |
| 130 : coll(coll), | |
| 131 source(source), | |
| 132 target(target), | |
| 133 useLen(useLen) | |
| 134 { | |
| 135 } | |
| 136 | |
| 137 Strcoll_2::~Strcoll_2() | |
| 138 { | |
| 139 } | |
| 140 | |
| 141 void Strcoll_2::call(UErrorCode* status) | |
| 142 { | |
| 143 if (U_FAILURE(*status)) return; | |
| 144 | |
| 145 // call strcoll for two strings at the same index | |
| 146 if (source->count < target->count) { | |
| 147 *status = U_ILLEGAL_ARGUMENT_ERROR; | |
| 148 } else { | |
| 149 for (int32_t i = 0; i < source->count; i++) { | |
| 150 int32_t srcLen = useLen ? source->lengthOf(i) : -1; | |
| 151 int32_t tgtLen = useLen ? target->lengthOf(i) : -1; | |
| 152 ucol_strcoll(coll, source->dataOf(i), srcLen, target->dataOf(i), tgt
Len); | |
| 153 } | |
| 154 } | |
| 155 } | |
| 156 | |
| 157 long Strcoll_2::getOperationsPerIteration() | |
| 158 { | |
| 159 return source->count; | |
| 160 } | |
| 161 | |
| 162 | |
| 163 // | |
| 164 // Test case taking a single test data array, calling ucol_strcollUTF8 by permut
ing the test data | |
| 165 // | |
| 166 class StrcollUTF8 : public UPerfFunction | |
| 167 { | |
| 168 public: | |
| 169 StrcollUTF8(const UCollator* coll, const CA_char* source, UBool useLen); | |
| 170 ~StrcollUTF8(); | |
| 171 virtual void call(UErrorCode* status); | |
| 172 virtual long getOperationsPerIteration(); | |
| 173 | |
| 174 private: | |
| 175 const UCollator *coll; | |
| 176 const CA_char *source; | |
| 177 UBool useLen; | |
| 178 int32_t maxTestStrings; | |
| 179 }; | |
| 180 | |
| 181 StrcollUTF8::StrcollUTF8(const UCollator* coll, const CA_char* source, UBool use
Len) | |
| 182 : coll(coll), | |
| 183 source(source), | |
| 184 useLen(useLen) | |
| 185 { | |
| 186 maxTestStrings = source->count > MAX_TEST_STRINGS_FOR_PERMUTING ? MAX_TEST_S
TRINGS_FOR_PERMUTING : source->count; | |
| 187 } | |
| 188 | |
| 189 StrcollUTF8::~StrcollUTF8() | |
| 190 { | |
| 191 } | |
| 192 | |
| 193 void StrcollUTF8::call(UErrorCode* status) | |
| 194 { | |
| 195 if (U_FAILURE(*status)) return; | |
| 196 | |
| 197 // call strcollUTF8 for permutation | |
| 198 int32_t divisor = source->count / maxTestStrings; | |
| 199 int32_t srcLen, tgtLen; | |
| 200 int32_t cmp = 0; | |
| 201 for (int32_t i = 0, numTestStringsI = 0; U_SUCCESS(*status) && i < source->c
ount && numTestStringsI < maxTestStrings; i++) { | |
| 202 if (i % divisor) continue; | |
| 203 numTestStringsI++; | |
| 204 srcLen = useLen ? source->lengthOf(i) : -1; | |
| 205 for (int32_t j = 0, numTestStringsJ = 0; U_SUCCESS(*status) && j < sourc
e->count && numTestStringsJ < maxTestStrings; j++) { | |
| 206 if (j % divisor) continue; | |
| 207 numTestStringsJ++; | |
| 208 tgtLen = useLen ? source->lengthOf(j) : -1; | |
| 209 cmp += ucol_strcollUTF8(coll, source->dataOf(i), srcLen, source->dat
aOf(j), tgtLen, status); | |
| 210 } | |
| 211 } | |
| 212 // At the end, cmp must be 0 | |
| 213 if (cmp != 0) { | |
| 214 *status = U_INTERNAL_PROGRAM_ERROR; | |
| 215 } | |
| 216 } | |
| 217 | |
| 218 long StrcollUTF8::getOperationsPerIteration() | |
| 219 { | |
| 220 return maxTestStrings * maxTestStrings; | |
| 221 } | |
| 222 | |
| 223 // | |
| 224 // Test case taking two test data arrays, calling ucol_strcoll for strings at a
same index | |
| 225 // | |
| 226 class StrcollUTF8_2 : public UPerfFunction | |
| 227 { | |
| 228 public: | |
| 229 StrcollUTF8_2(const UCollator* coll, const CA_char* source, const CA_char* t
arget, UBool useLen); | |
| 230 ~StrcollUTF8_2(); | |
| 231 virtual void call(UErrorCode* status); | |
| 232 virtual long getOperationsPerIteration(); | |
| 233 | |
| 234 private: | |
| 235 const UCollator *coll; | |
| 236 const CA_char *source; | |
| 237 const CA_char *target; | |
| 238 UBool useLen; | |
| 239 }; | |
| 240 | |
| 241 StrcollUTF8_2::StrcollUTF8_2(const UCollator* coll, const CA_char* source, const
CA_char* target, UBool useLen) | |
| 242 : coll(coll), | |
| 243 source(source), | |
| 244 target(target), | |
| 245 useLen(useLen) | |
| 246 { | |
| 247 } | |
| 248 | |
| 249 StrcollUTF8_2::~StrcollUTF8_2() | |
| 250 { | |
| 251 } | |
| 252 | |
| 253 void StrcollUTF8_2::call(UErrorCode* status) | |
| 254 { | |
| 255 if (U_FAILURE(*status)) return; | |
| 256 | |
| 257 // call strcoll for two strings at the same index | |
| 258 if (source->count < target->count) { | |
| 259 *status = U_ILLEGAL_ARGUMENT_ERROR; | |
| 260 } else { | |
| 261 for (int32_t i = 0; U_SUCCESS(*status) && i < source->count; i++) { | |
| 262 int32_t srcLen = useLen ? source->lengthOf(i) : -1; | |
| 263 int32_t tgtLen = useLen ? target->lengthOf(i) : -1; | |
| 264 ucol_strcollUTF8(coll, source->dataOf(i), srcLen, target->dataOf(i),
tgtLen, status); | |
| 265 } | |
| 266 } | |
| 267 } | |
| 268 | |
| 269 long StrcollUTF8_2::getOperationsPerIteration() | |
| 270 { | |
| 271 return source->count; | |
| 272 } | |
| 273 | |
| 274 // | |
| 275 // Test case taking a single test data array, calling ucol_getSortKey for each | |
| 276 // | |
| 277 class GetSortKey : public UPerfFunction | |
| 278 { | |
| 279 public: | |
| 280 GetSortKey(const UCollator* coll, const CA_uchar* source, UBool useLen); | |
| 281 ~GetSortKey(); | |
| 282 virtual void call(UErrorCode* status); | |
| 283 virtual long getOperationsPerIteration(); | |
| 284 | |
| 285 private: | |
| 286 const UCollator *coll; | |
| 287 const CA_uchar *source; | |
| 288 UBool useLen; | |
| 289 }; | |
| 290 | |
| 291 GetSortKey::GetSortKey(const UCollator* coll, const CA_uchar* source, UBool useL
en) | |
| 292 : coll(coll), | |
| 293 source(source), | |
| 294 useLen(useLen) | |
| 295 { | |
| 296 } | |
| 297 | |
| 298 GetSortKey::~GetSortKey() | |
| 299 { | |
| 300 } | |
| 301 | |
| 302 #define KEY_BUF_SIZE 512 | |
| 303 | |
| 304 void GetSortKey::call(UErrorCode* status) | |
| 305 { | |
| 306 if (U_FAILURE(*status)) return; | |
| 307 | |
| 308 uint8_t key[KEY_BUF_SIZE]; | |
| 309 int32_t len; | |
| 310 | |
| 311 if (useLen) { | |
| 312 for (int32_t i = 0; i < source->count; i++) { | |
| 313 len = ucol_getSortKey(coll, source->dataOf(i), source->lengthOf(i),
key, KEY_BUF_SIZE); | |
| 314 } | |
| 315 } else { | |
| 316 for (int32_t i = 0; i < source->count; i++) { | |
| 317 len = ucol_getSortKey(coll, source->dataOf(i), -1, key, KEY_BUF_SIZE
); | |
| 318 } | |
| 319 } | |
| 320 } | |
| 321 | |
| 322 long GetSortKey::getOperationsPerIteration() | |
| 323 { | |
| 324 return source->count; | |
| 325 } | |
| 326 | |
| 327 // | |
| 328 // Test case taking a single test data array in UTF-16, calling ucol_nextSortKey
Part for each for the | |
| 329 // given buffer size | |
| 330 // | |
| 331 class NextSortKeyPart : public UPerfFunction | |
| 332 { | |
| 333 public: | |
| 334 NextSortKeyPart(const UCollator* coll, const CA_uchar* source, int32_t bufSi
ze, int32_t maxIteration = -1); | |
| 335 ~NextSortKeyPart(); | |
| 336 virtual void call(UErrorCode* status); | |
| 337 virtual long getOperationsPerIteration(); | |
| 338 virtual long getEventsPerIteration(); | |
| 339 | |
| 340 private: | |
| 341 const UCollator *coll; | |
| 342 const CA_uchar *source; | |
| 343 int32_t bufSize; | |
| 344 int32_t maxIteration; | |
| 345 long events; | |
| 346 }; | |
| 347 | |
| 348 // Note: maxIteration = -1 -> repeat until the end of collation key | |
| 349 NextSortKeyPart::NextSortKeyPart(const UCollator* coll, const CA_uchar* source,
int32_t bufSize, int32_t maxIteration /* = -1 */) | |
| 350 : coll(coll), | |
| 351 source(source), | |
| 352 bufSize(bufSize), | |
| 353 maxIteration(maxIteration), | |
| 354 events(0) | |
| 355 { | |
| 356 } | |
| 357 | |
| 358 NextSortKeyPart::~NextSortKeyPart() | |
| 359 { | |
| 360 } | |
| 361 | |
| 362 void NextSortKeyPart::call(UErrorCode* status) | |
| 363 { | |
| 364 if (U_FAILURE(*status)) return; | |
| 365 | |
| 366 uint8_t *part = (uint8_t *)malloc(bufSize); | |
| 367 uint32_t state[2]; | |
| 368 UCharIterator iter; | |
| 369 | |
| 370 events = 0; | |
| 371 for (int i = 0; i < source->count && U_SUCCESS(*status); i++) { | |
| 372 uiter_setString(&iter, source->dataOf(i), source->lengthOf(i)); | |
| 373 state[0] = 0; | |
| 374 state[1] = 0; | |
| 375 int32_t partLen = bufSize; | |
| 376 for (int32_t n = 0; U_SUCCESS(*status) && partLen == bufSize && (maxIter
ation < 0 || n < maxIteration); n++) { | |
| 377 partLen = ucol_nextSortKeyPart(coll, &iter, state, part, bufSize, st
atus); | |
| 378 events++; | |
| 379 } | |
| 380 } | |
| 381 free(part); | |
| 382 } | |
| 383 | |
| 384 long NextSortKeyPart::getOperationsPerIteration() | |
| 385 { | |
| 386 return source->count; | |
| 387 } | |
| 388 | |
| 389 long NextSortKeyPart::getEventsPerIteration() | |
| 390 { | |
| 391 return events; | |
| 392 } | |
| 393 | |
| 394 // | |
| 395 // Test case taking a single test data array in UTF-8, calling ucol_nextSortKeyP
art for each for the | |
| 396 // given buffer size | |
| 397 // | |
| 398 class NextSortKeyPartUTF8 : public UPerfFunction | |
| 399 { | |
| 400 public: | |
| 401 NextSortKeyPartUTF8(const UCollator* coll, const CA_char* source, int32_t bu
fSize, int32_t maxIteration = -1); | |
| 402 ~NextSortKeyPartUTF8(); | |
| 403 virtual void call(UErrorCode* status); | |
| 404 virtual long getOperationsPerIteration(); | |
| 405 virtual long getEventsPerIteration(); | |
| 406 | |
| 407 private: | |
| 408 const UCollator *coll; | |
| 409 const CA_char *source; | |
| 410 int32_t bufSize; | |
| 411 int32_t maxIteration; | |
| 412 long events; | |
| 413 }; | |
| 414 | |
| 415 // Note: maxIteration = -1 -> repeat until the end of collation key | |
| 416 NextSortKeyPartUTF8::NextSortKeyPartUTF8(const UCollator* coll, const CA_char* s
ource, int32_t bufSize, int32_t maxIteration /* = -1 */) | |
| 417 : coll(coll), | |
| 418 source(source), | |
| 419 bufSize(bufSize), | |
| 420 maxIteration(maxIteration), | |
| 421 events(0) | |
| 422 { | |
| 423 } | |
| 424 | |
| 425 NextSortKeyPartUTF8::~NextSortKeyPartUTF8() | |
| 426 { | |
| 427 } | |
| 428 | |
| 429 void NextSortKeyPartUTF8::call(UErrorCode* status) | |
| 430 { | |
| 431 if (U_FAILURE(*status)) return; | |
| 432 | |
| 433 uint8_t *part = (uint8_t *)malloc(bufSize); | |
| 434 uint32_t state[2]; | |
| 435 UCharIterator iter; | |
| 436 | |
| 437 events = 0; | |
| 438 for (int i = 0; i < source->count && U_SUCCESS(*status); i++) { | |
| 439 uiter_setUTF8(&iter, source->dataOf(i), source->lengthOf(i)); | |
| 440 state[0] = 0; | |
| 441 state[1] = 0; | |
| 442 int32_t partLen = bufSize; | |
| 443 for (int32_t n = 0; U_SUCCESS(*status) && partLen == bufSize && (maxIter
ation < 0 || n < maxIteration); n++) { | |
| 444 partLen = ucol_nextSortKeyPart(coll, &iter, state, part, bufSize, st
atus); | |
| 445 events++; | |
| 446 } | |
| 447 } | |
| 448 free(part); | |
| 449 } | |
| 450 | |
| 451 long NextSortKeyPartUTF8::getOperationsPerIteration() | |
| 452 { | |
| 453 return source->count; | |
| 454 } | |
| 455 | |
| 456 long NextSortKeyPartUTF8::getEventsPerIteration() | |
| 457 { | |
| 458 return events; | |
| 459 } | |
| 460 | |
| 461 // CPP API test cases | |
| 462 | |
| 463 // | |
| 464 // Test case taking a single test data array, calling Collator::compare by permu
ting the test data | |
| 465 // | |
| 466 class CppCompare : public UPerfFunction | |
| 467 { | |
| 468 public: | |
| 469 CppCompare(const Collator* coll, const CA_uchar* source, UBool useLen); | |
| 470 ~CppCompare(); | |
| 471 virtual void call(UErrorCode* status); | |
| 472 virtual long getOperationsPerIteration(); | |
| 473 | |
| 474 private: | |
| 475 const Collator *coll; | |
| 476 const CA_uchar *source; | |
| 477 UBool useLen; | |
| 478 int32_t maxTestStrings; | |
| 479 }; | |
| 480 | |
| 481 CppCompare::CppCompare(const Collator* coll, const CA_uchar* source, UBool useLe
n) | |
| 482 : coll(coll), | |
| 483 source(source), | |
| 484 useLen(useLen) | |
| 485 { | |
| 486 maxTestStrings = source->count > MAX_TEST_STRINGS_FOR_PERMUTING ? MAX_TEST_S
TRINGS_FOR_PERMUTING : source->count; | |
| 487 } | |
| 488 | |
| 489 CppCompare::~CppCompare() | |
| 490 { | |
| 491 } | |
| 492 | |
| 493 void CppCompare::call(UErrorCode* status) { | |
| 494 if (U_FAILURE(*status)) return; | |
| 495 | |
| 496 // call compare for permutation of test data | |
| 497 int32_t divisor = source->count / maxTestStrings; | |
| 498 int32_t srcLen, tgtLen; | |
| 499 int32_t cmp = 0; | |
| 500 for (int32_t i = 0, numTestStringsI = 0; i < source->count && numTestStrings
I < maxTestStrings; i++) { | |
| 501 if (i % divisor) continue; | |
| 502 numTestStringsI++; | |
| 503 srcLen = useLen ? source->lengthOf(i) : -1; | |
| 504 for (int32_t j = 0, numTestStringsJ = 0; j < source->count && numTestStr
ingsJ < maxTestStrings; j++) { | |
| 505 if (j % divisor) continue; | |
| 506 numTestStringsJ++; | |
| 507 tgtLen = useLen ? source->lengthOf(j) : -1; | |
| 508 cmp += coll->compare(source->dataOf(i), srcLen, source->dataOf(j), t
gtLen); | |
| 509 } | |
| 510 } | |
| 511 // At the end, cmp must be 0 | |
| 512 if (cmp != 0) { | |
| 513 *status = U_INTERNAL_PROGRAM_ERROR; | |
| 514 } | |
| 515 } | |
| 516 | |
| 517 long CppCompare::getOperationsPerIteration() | |
| 518 { | |
| 519 return maxTestStrings * maxTestStrings; | |
| 520 } | |
| 521 | |
| 522 // | |
| 523 // Test case taking two test data arrays, calling Collator::compare for strings
at a same index | |
| 524 // | |
| 525 class CppCompare_2 : public UPerfFunction | |
| 526 { | |
| 527 public: | |
| 528 CppCompare_2(const Collator* coll, const CA_uchar* source, const CA_uchar* t
arget, UBool useLen); | |
| 529 ~CppCompare_2(); | |
| 530 virtual void call(UErrorCode* status); | |
| 531 virtual long getOperationsPerIteration(); | |
| 532 | |
| 533 private: | |
| 534 const Collator *coll; | |
| 535 const CA_uchar *source; | |
| 536 const CA_uchar *target; | |
| 537 UBool useLen; | |
| 538 }; | |
| 539 | |
| 540 CppCompare_2::CppCompare_2(const Collator* coll, const CA_uchar* source, const C
A_uchar* target, UBool useLen) | |
| 541 : coll(coll), | |
| 542 source(source), | |
| 543 target(target), | |
| 544 useLen(useLen) | |
| 545 { | |
| 546 } | |
| 547 | |
| 548 CppCompare_2::~CppCompare_2() | |
| 549 { | |
| 550 } | |
| 551 | |
| 552 void CppCompare_2::call(UErrorCode* status) { | |
| 553 if (U_FAILURE(*status)) return; | |
| 554 | |
| 555 // call strcoll for two strings at the same index | |
| 556 if (source->count < target->count) { | |
| 557 *status = U_ILLEGAL_ARGUMENT_ERROR; | |
| 558 } else { | |
| 559 for (int32_t i = 0; i < source->count; i++) { | |
| 560 int32_t srcLen = useLen ? source->lengthOf(i) : -1; | |
| 561 int32_t tgtLen = useLen ? target->lengthOf(i) : -1; | |
| 562 coll->compare(source->dataOf(i), srcLen, target->dataOf(i), tgtLen); | |
| 563 } | |
| 564 } | |
| 565 } | |
| 566 | |
| 567 long CppCompare_2::getOperationsPerIteration() | |
| 568 { | |
| 569 return source->count; | |
| 570 } | |
| 571 | |
| 572 | |
| 573 // | |
| 574 // Test case taking a single test data array, calling Collator::compareUTF8 by p
ermuting the test data | |
| 575 // | |
| 576 class CppCompareUTF8 : public UPerfFunction | |
| 577 { | |
| 578 public: | |
| 579 CppCompareUTF8(const Collator* coll, const CA_char* source, UBool useLen); | |
| 580 ~CppCompareUTF8(); | |
| 581 virtual void call(UErrorCode* status); | |
| 582 virtual long getOperationsPerIteration(); | |
| 583 | |
| 584 private: | |
| 585 const Collator *coll; | |
| 586 const CA_char *source; | |
| 587 UBool useLen; | |
| 588 int32_t maxTestStrings; | |
| 589 }; | |
| 590 | |
| 591 CppCompareUTF8::CppCompareUTF8(const Collator* coll, const CA_char* source, UBoo
l useLen) | |
| 592 : coll(coll), | |
| 593 source(source), | |
| 594 useLen(useLen) | |
| 595 { | |
| 596 maxTestStrings = source->count > MAX_TEST_STRINGS_FOR_PERMUTING ? MAX_TEST_S
TRINGS_FOR_PERMUTING : source->count; | |
| 597 } | |
| 598 | |
| 599 CppCompareUTF8::~CppCompareUTF8() | |
| 600 { | |
| 601 } | |
| 602 | |
| 603 void CppCompareUTF8::call(UErrorCode* status) { | |
| 604 if (U_FAILURE(*status)) return; | |
| 605 | |
| 606 // call compareUTF8 for all permutations | |
| 607 int32_t divisor = source->count / maxTestStrings; | |
| 608 StringPiece src, tgt; | |
| 609 int32_t cmp = 0; | |
| 610 for (int32_t i = 0, numTestStringsI = 0; U_SUCCESS(*status) && i < source->c
ount && numTestStringsI < maxTestStrings; i++) { | |
| 611 if (i % divisor) continue; | |
| 612 numTestStringsI++; | |
| 613 | |
| 614 if (useLen) { | |
| 615 src.set(source->dataOf(i), source->lengthOf(i)); | |
| 616 } else { | |
| 617 src.set(source->dataOf(i)); | |
| 618 } | |
| 619 for (int32_t j = 0, numTestStringsJ = 0; U_SUCCESS(*status) && j < sourc
e->count && numTestStringsJ < maxTestStrings; j++) { | |
| 620 if (j % divisor) continue; | |
| 621 numTestStringsJ++; | |
| 622 | |
| 623 if (useLen) { | |
| 624 tgt.set(source->dataOf(i), source->lengthOf(i)); | |
| 625 } else { | |
| 626 tgt.set(source->dataOf(i)); | |
| 627 } | |
| 628 cmp += coll->compareUTF8(src, tgt, *status); | |
| 629 } | |
| 630 } | |
| 631 // At the end, cmp must be 0 | |
| 632 if (cmp != 0) { | |
| 633 *status = U_INTERNAL_PROGRAM_ERROR; | |
| 634 } | |
| 635 } | |
| 636 | |
| 637 long CppCompareUTF8::getOperationsPerIteration() | |
| 638 { | |
| 639 return maxTestStrings * maxTestStrings; | |
| 640 } | |
| 641 | |
| 642 | |
| 643 // | |
| 644 // Test case taking two test data arrays, calling Collator::compareUTF8 for stri
ngs at a same index | |
| 645 // | |
| 646 class CppCompareUTF8_2 : public UPerfFunction | |
| 647 { | |
| 648 public: | |
| 649 CppCompareUTF8_2(const Collator* coll, const CA_char* source, const CA_char*
target, UBool useLen); | |
| 650 ~CppCompareUTF8_2(); | |
| 651 virtual void call(UErrorCode* status); | |
| 652 virtual long getOperationsPerIteration(); | |
| 653 | |
| 654 private: | |
| 655 const Collator *coll; | |
| 656 const CA_char *source; | |
| 657 const CA_char *target; | |
| 658 UBool useLen; | |
| 659 }; | |
| 660 | |
| 661 CppCompareUTF8_2::CppCompareUTF8_2(const Collator* coll, const CA_char* source,
const CA_char* target, UBool useLen) | |
| 662 : coll(coll), | |
| 663 source(source), | |
| 664 target(target), | |
| 665 useLen(useLen) | |
| 666 { | |
| 667 } | |
| 668 | |
| 669 CppCompareUTF8_2::~CppCompareUTF8_2() | |
| 670 { | |
| 671 } | |
| 672 | |
| 673 void CppCompareUTF8_2::call(UErrorCode* status) { | |
| 674 if (U_FAILURE(*status)) return; | |
| 675 | |
| 676 // call strcoll for two strings at the same index | |
| 677 StringPiece src, tgt; | |
| 678 if (source->count < target->count) { | |
| 679 *status = U_ILLEGAL_ARGUMENT_ERROR; | |
| 680 } else { | |
| 681 for (int32_t i = 0; U_SUCCESS(*status) && i < source->count; i++) { | |
| 682 if (useLen) { | |
| 683 src.set(source->dataOf(i), source->lengthOf(i)); | |
| 684 tgt.set(target->dataOf(i), target->lengthOf(i)); | |
| 685 } else { | |
| 686 src.set(source->dataOf(i)); | |
| 687 tgt.set(target->dataOf(i)); | |
| 688 } | |
| 689 coll->compareUTF8(src, tgt, *status); | |
| 690 } | |
| 691 } | |
| 692 } | |
| 693 | |
| 694 long CppCompareUTF8_2::getOperationsPerIteration() | |
| 695 { | |
| 696 return source->count; | |
| 697 } | |
| 698 | |
| 699 | |
| 700 // | |
| 701 // Test case taking a single test data array, calling Collator::getCollationKey
for each | |
| 702 // | |
| 703 class CppGetCollationKey : public UPerfFunction | |
| 704 { | |
| 705 public: | |
| 706 CppGetCollationKey(const Collator* coll, const CA_uchar* source, UBool useLe
n); | |
| 707 ~CppGetCollationKey(); | |
| 708 virtual void call(UErrorCode* status); | |
| 709 virtual long getOperationsPerIteration(); | |
| 710 | |
| 711 private: | |
| 712 const Collator *coll; | |
| 713 const CA_uchar *source; | |
| 714 UBool useLen; | |
| 715 }; | |
| 716 | |
| 717 CppGetCollationKey::CppGetCollationKey(const Collator* coll, const CA_uchar* sou
rce, UBool useLen) | |
| 718 : coll(coll), | |
| 719 source(source), | |
| 720 useLen(useLen) | |
| 721 { | |
| 722 } | |
| 723 | |
| 724 CppGetCollationKey::~CppGetCollationKey() | |
| 725 { | |
| 726 } | |
| 727 | |
| 728 void CppGetCollationKey::call(UErrorCode* status) | |
| 729 { | |
| 730 if (U_FAILURE(*status)) return; | |
| 731 | |
| 732 CollationKey key; | |
| 733 for (int32_t i = 0; U_SUCCESS(*status) && i < source->count; i++) { | |
| 734 coll->getCollationKey(source->dataOf(i), source->lengthOf(i), key, *stat
us); | |
| 735 } | |
| 736 } | |
| 737 | |
| 738 long CppGetCollationKey::getOperationsPerIteration() { | |
| 739 return source->count; | |
| 740 } | |
| 741 | |
| 742 namespace { | |
| 743 | |
| 744 struct CollatorAndCounter { | |
| 745 CollatorAndCounter(const Collator& coll) : coll(coll), ucoll(NULL), counter(
0) {} | |
| 746 CollatorAndCounter(const Collator& coll, const UCollator *ucoll) | |
| 747 : coll(coll), ucoll(ucoll), counter(0) {} | |
| 748 const Collator& coll; | |
| 749 const UCollator *ucoll; | |
| 750 int32_t counter; | |
| 751 }; | |
| 752 | |
| 753 int32_t U_CALLCONV | |
| 754 UniStrCollatorComparator(const void* context, const void* left, const void* righ
t) { | |
| 755 CollatorAndCounter& cc = *(CollatorAndCounter*)context; | |
| 756 const UnicodeString& leftString = **(const UnicodeString**)left; | |
| 757 const UnicodeString& rightString = **(const UnicodeString**)right; | |
| 758 UErrorCode errorCode = U_ZERO_ERROR; | |
| 759 ++cc.counter; | |
| 760 return cc.coll.compare(leftString, rightString, errorCode); | |
| 761 } | |
| 762 | |
| 763 } // namespace | |
| 764 | |
| 765 class CollPerfFunction : public UPerfFunction { | |
| 766 public: | |
| 767 CollPerfFunction(const Collator& coll, const UCollator *ucoll) | |
| 768 : coll(coll), ucoll(ucoll), ops(0) {} | |
| 769 virtual ~CollPerfFunction(); | |
| 770 /** Calls call() to set the ops field, and returns that. */ | |
| 771 virtual long getOperationsPerIteration(); | |
| 772 | |
| 773 protected: | |
| 774 const Collator& coll; | |
| 775 const UCollator *ucoll; | |
| 776 int32_t ops; | |
| 777 }; | |
| 778 | |
| 779 CollPerfFunction::~CollPerfFunction() {} | |
| 780 | |
| 781 long CollPerfFunction::getOperationsPerIteration() { | |
| 782 UErrorCode errorCode = U_ZERO_ERROR; | |
| 783 call(&errorCode); | |
| 784 return U_SUCCESS(errorCode) ? ops : 0; | |
| 785 } | |
| 786 | |
| 787 class UniStrCollPerfFunction : public CollPerfFunction { | |
| 788 public: | |
| 789 UniStrCollPerfFunction(const Collator& coll, const UCollator *ucoll, const C
A_uchar* data16) | |
| 790 : CollPerfFunction(coll, ucoll), d16(data16), | |
| 791 source(new UnicodeString*[d16->count]) { | |
| 792 for (int32_t i = 0; i < d16->count; ++i) { | |
| 793 source[i] = new UnicodeString(TRUE, d16->dataOf(i), d16->lengthOf(i)
); | |
| 794 } | |
| 795 } | |
| 796 virtual ~UniStrCollPerfFunction(); | |
| 797 | |
| 798 protected: | |
| 799 const CA_uchar* d16; | |
| 800 UnicodeString** source; | |
| 801 }; | |
| 802 | |
| 803 UniStrCollPerfFunction::~UniStrCollPerfFunction() { | |
| 804 for (int32_t i = 0; i < d16->count; ++i) { | |
| 805 delete source[i]; | |
| 806 } | |
| 807 delete[] source; | |
| 808 } | |
| 809 | |
| 810 // | |
| 811 // Test case sorting an array of UnicodeString pointers. | |
| 812 // | |
| 813 class UniStrSort : public UniStrCollPerfFunction { | |
| 814 public: | |
| 815 UniStrSort(const Collator& coll, const UCollator *ucoll, const CA_uchar* dat
a16) | |
| 816 : UniStrCollPerfFunction(coll, ucoll, data16), | |
| 817 dest(new UnicodeString*[d16->count]) {} | |
| 818 virtual ~UniStrSort(); | |
| 819 virtual void call(UErrorCode* status); | |
| 820 | |
| 821 private: | |
| 822 UnicodeString** dest; // aliases only | |
| 823 }; | |
| 824 | |
| 825 UniStrSort::~UniStrSort() { | |
| 826 delete[] dest; | |
| 827 } | |
| 828 | |
| 829 void UniStrSort::call(UErrorCode* status) { | |
| 830 if (U_FAILURE(*status)) return; | |
| 831 | |
| 832 CollatorAndCounter cc(coll); | |
| 833 int32_t count = d16->count; | |
| 834 memcpy(dest, source, count * sizeof(UnicodeString *)); | |
| 835 uprv_sortArray(dest, count, (int32_t)sizeof(UnicodeString *), | |
| 836 UniStrCollatorComparator, &cc, TRUE, status); | |
| 837 ops = cc.counter; | |
| 838 } | |
| 839 | |
| 840 namespace { | |
| 841 | |
| 842 int32_t U_CALLCONV | |
| 843 StringPieceCollatorComparator(const void* context, const void* left, const void*
right) { | |
| 844 CollatorAndCounter& cc = *(CollatorAndCounter*)context; | |
| 845 const StringPiece& leftString = *(const StringPiece*)left; | |
| 846 const StringPiece& rightString = *(const StringPiece*)right; | |
| 847 UErrorCode errorCode = U_ZERO_ERROR; | |
| 848 ++cc.counter; | |
| 849 return cc.coll.compareUTF8(leftString, rightString, errorCode); | |
| 850 } | |
| 851 | |
| 852 int32_t U_CALLCONV | |
| 853 StringPieceUCollatorComparator(const void* context, const void* left, const void
* right) { | |
| 854 CollatorAndCounter& cc = *(CollatorAndCounter*)context; | |
| 855 const StringPiece& leftString = *(const StringPiece*)left; | |
| 856 const StringPiece& rightString = *(const StringPiece*)right; | |
| 857 UErrorCode errorCode = U_ZERO_ERROR; | |
| 858 ++cc.counter; | |
| 859 return ucol_strcollUTF8(cc.ucoll, | |
| 860 leftString.data(), leftString.length(), | |
| 861 rightString.data(), rightString.length(), &errorCode
); | |
| 862 } | |
| 863 | |
| 864 } // namespace | |
| 865 | |
| 866 class StringPieceCollPerfFunction : public CollPerfFunction { | |
| 867 public: | |
| 868 StringPieceCollPerfFunction(const Collator& coll, const UCollator *ucoll, co
nst CA_char* data8) | |
| 869 : CollPerfFunction(coll, ucoll), d8(data8), | |
| 870 source(new StringPiece[d8->count]) { | |
| 871 for (int32_t i = 0; i < d8->count; ++i) { | |
| 872 source[i].set(d8->dataOf(i), d8->lengthOf(i)); | |
| 873 } | |
| 874 } | |
| 875 virtual ~StringPieceCollPerfFunction(); | |
| 876 | |
| 877 protected: | |
| 878 const CA_char* d8; | |
| 879 StringPiece* source; | |
| 880 }; | |
| 881 | |
| 882 StringPieceCollPerfFunction::~StringPieceCollPerfFunction() { | |
| 883 delete[] source; | |
| 884 } | |
| 885 | |
| 886 class StringPieceSort : public StringPieceCollPerfFunction { | |
| 887 public: | |
| 888 StringPieceSort(const Collator& coll, const UCollator *ucoll, const CA_char*
data8) | |
| 889 : StringPieceCollPerfFunction(coll, ucoll, data8), | |
| 890 dest(new StringPiece[d8->count]) {} | |
| 891 virtual ~StringPieceSort(); | |
| 892 | |
| 893 protected: | |
| 894 StringPiece* dest; | |
| 895 }; | |
| 896 | |
| 897 StringPieceSort::~StringPieceSort() { | |
| 898 delete[] dest; | |
| 899 } | |
| 900 | |
| 901 // | |
| 902 // Test case sorting an array of UTF-8 StringPiece's with Collator::compareUTF8(
). | |
| 903 // | |
| 904 class StringPieceSortCpp : public StringPieceSort { | |
| 905 public: | |
| 906 StringPieceSortCpp(const Collator& coll, const UCollator *ucoll, const CA_ch
ar* data8) | |
| 907 : StringPieceSort(coll, ucoll, data8) {} | |
| 908 virtual ~StringPieceSortCpp(); | |
| 909 virtual void call(UErrorCode* status); | |
| 910 }; | |
| 911 | |
| 912 StringPieceSortCpp::~StringPieceSortCpp() {} | |
| 913 | |
| 914 void StringPieceSortCpp::call(UErrorCode* status) { | |
| 915 if (U_FAILURE(*status)) return; | |
| 916 | |
| 917 CollatorAndCounter cc(coll); | |
| 918 int32_t count = d8->count; | |
| 919 memcpy(dest, source, count * sizeof(StringPiece)); | |
| 920 uprv_sortArray(dest, count, (int32_t)sizeof(StringPiece), | |
| 921 StringPieceCollatorComparator, &cc, TRUE, status); | |
| 922 ops = cc.counter; | |
| 923 } | |
| 924 | |
| 925 // | |
| 926 // Test case sorting an array of UTF-8 StringPiece's with ucol_strcollUTF8(). | |
| 927 // | |
| 928 class StringPieceSortC : public StringPieceSort { | |
| 929 public: | |
| 930 StringPieceSortC(const Collator& coll, const UCollator *ucoll, const CA_char
* data8) | |
| 931 : StringPieceSort(coll, ucoll, data8) {} | |
| 932 virtual ~StringPieceSortC(); | |
| 933 virtual void call(UErrorCode* status); | |
| 934 }; | |
| 935 | |
| 936 StringPieceSortC::~StringPieceSortC() {} | |
| 937 | |
| 938 void StringPieceSortC::call(UErrorCode* status) { | |
| 939 if (U_FAILURE(*status)) return; | |
| 940 | |
| 941 CollatorAndCounter cc(coll, ucoll); | |
| 942 int32_t count = d8->count; | |
| 943 memcpy(dest, source, count * sizeof(StringPiece)); | |
| 944 uprv_sortArray(dest, count, (int32_t)sizeof(StringPiece), | |
| 945 StringPieceUCollatorComparator, &cc, TRUE, status); | |
| 946 ops = cc.counter; | |
| 947 } | |
| 948 | |
| 949 // | |
| 950 // Test case performing binary searches in a sorted array of UnicodeString point
ers. | |
| 951 // | |
| 952 class UniStrBinSearch : public UniStrCollPerfFunction { | |
| 953 public: | |
| 954 UniStrBinSearch(const Collator& coll, const UCollator *ucoll, const CA_uchar
* data16) | |
| 955 : UniStrCollPerfFunction(coll, ucoll, data16) {} | |
| 956 virtual ~UniStrBinSearch(); | |
| 957 virtual void call(UErrorCode* status); | |
| 958 }; | |
| 959 | |
| 960 UniStrBinSearch::~UniStrBinSearch() {} | |
| 961 | |
| 962 void UniStrBinSearch::call(UErrorCode* status) { | |
| 963 if (U_FAILURE(*status)) return; | |
| 964 | |
| 965 CollatorAndCounter cc(coll); | |
| 966 int32_t count = d16->count; | |
| 967 for (int32_t i = 0; i < count; ++i) { | |
| 968 (void)uprv_stableBinarySearch((char *)source, count, | |
| 969 source + i, (int32_t)sizeof(UnicodeString
*), | |
| 970 UniStrCollatorComparator, &cc); | |
| 971 } | |
| 972 ops = cc.counter; | |
| 973 } | |
| 974 | |
| 975 class StringPieceBinSearch : public StringPieceCollPerfFunction { | |
| 976 public: | |
| 977 StringPieceBinSearch(const Collator& coll, const UCollator *ucoll, const CA_
char* data8) | |
| 978 : StringPieceCollPerfFunction(coll, ucoll, data8) {} | |
| 979 virtual ~StringPieceBinSearch(); | |
| 980 }; | |
| 981 | |
| 982 StringPieceBinSearch::~StringPieceBinSearch() {} | |
| 983 | |
| 984 // | |
| 985 // Test case performing binary searches in a sorted array of UTF-8 StringPiece's | |
| 986 // with Collator::compareUTF8(). | |
| 987 // | |
| 988 class StringPieceBinSearchCpp : public StringPieceBinSearch { | |
| 989 public: | |
| 990 StringPieceBinSearchCpp(const Collator& coll, const UCollator *ucoll, const
CA_char* data8) | |
| 991 : StringPieceBinSearch(coll, ucoll, data8) {} | |
| 992 virtual ~StringPieceBinSearchCpp(); | |
| 993 virtual void call(UErrorCode* status); | |
| 994 }; | |
| 995 | |
| 996 StringPieceBinSearchCpp::~StringPieceBinSearchCpp() {} | |
| 997 | |
| 998 void StringPieceBinSearchCpp::call(UErrorCode* status) { | |
| 999 if (U_FAILURE(*status)) return; | |
| 1000 | |
| 1001 CollatorAndCounter cc(coll); | |
| 1002 int32_t count = d8->count; | |
| 1003 for (int32_t i = 0; i < count; ++i) { | |
| 1004 (void)uprv_stableBinarySearch((char *)source, count, | |
| 1005 source + i, (int32_t)sizeof(StringPiece), | |
| 1006 StringPieceCollatorComparator, &cc); | |
| 1007 } | |
| 1008 ops = cc.counter; | |
| 1009 } | |
| 1010 | |
| 1011 // | |
| 1012 // Test case performing binary searches in a sorted array of UTF-8 StringPiece's | |
| 1013 // with ucol_strcollUTF8(). | |
| 1014 // | |
| 1015 class StringPieceBinSearchC : public StringPieceBinSearch { | |
| 1016 public: | |
| 1017 StringPieceBinSearchC(const Collator& coll, const UCollator *ucoll, const CA
_char* data8) | |
| 1018 : StringPieceBinSearch(coll, ucoll, data8) {} | |
| 1019 virtual ~StringPieceBinSearchC(); | |
| 1020 virtual void call(UErrorCode* status); | |
| 1021 }; | |
| 1022 | |
| 1023 StringPieceBinSearchC::~StringPieceBinSearchC() {} | |
| 1024 | |
| 1025 void StringPieceBinSearchC::call(UErrorCode* status) { | |
| 1026 if (U_FAILURE(*status)) return; | |
| 1027 | |
| 1028 CollatorAndCounter cc(coll, ucoll); | |
| 1029 int32_t count = d8->count; | |
| 1030 for (int32_t i = 0; i < count; ++i) { | |
| 1031 (void)uprv_stableBinarySearch((char *)source, count, | |
| 1032 source + i, (int32_t)sizeof(StringPiece), | |
| 1033 StringPieceUCollatorComparator, &cc); | |
| 1034 } | |
| 1035 ops = cc.counter; | |
| 1036 } | |
| 1037 | |
| 1038 | |
| 1039 class CollPerf2Test : public UPerfTest | |
| 1040 { | |
| 1041 public: | |
| 1042 CollPerf2Test(int32_t argc, const char *argv[], UErrorCode &status); | |
| 1043 ~CollPerf2Test(); | |
| 1044 virtual UPerfFunction* runIndexedTest( | |
| 1045 int32_t index, UBool exec, const char *&name, char *par = NULL); | |
| 1046 | |
| 1047 private: | |
| 1048 UCollator* coll; | |
| 1049 Collator* collObj; | |
| 1050 | |
| 1051 int32_t count; | |
| 1052 CA_uchar* data16; | |
| 1053 CA_char* data8; | |
| 1054 | |
| 1055 CA_uchar* modData16; | |
| 1056 CA_char* modData8; | |
| 1057 | |
| 1058 CA_uchar* sortedData16; | |
| 1059 CA_char* sortedData8; | |
| 1060 | |
| 1061 CA_uchar* randomData16; | |
| 1062 CA_char* randomData8; | |
| 1063 | |
| 1064 const CA_uchar* getData16(UErrorCode &status); | |
| 1065 const CA_char* getData8(UErrorCode &status); | |
| 1066 | |
| 1067 const CA_uchar* getModData16(UErrorCode &status); | |
| 1068 const CA_char* getModData8(UErrorCode &status); | |
| 1069 | |
| 1070 const CA_uchar* getSortedData16(UErrorCode &status); | |
| 1071 const CA_char* getSortedData8(UErrorCode &status); | |
| 1072 | |
| 1073 const CA_uchar* getRandomData16(UErrorCode &status); | |
| 1074 const CA_char* getRandomData8(UErrorCode &status); | |
| 1075 | |
| 1076 static CA_uchar* sortData16( | |
| 1077 const CA_uchar* d16, | |
| 1078 UComparator *cmp, const void *context, | |
| 1079 UErrorCode &status); | |
| 1080 static CA_char* getData8FromData16(const CA_uchar* d16, UErrorCode &status); | |
| 1081 | |
| 1082 UPerfFunction* TestStrcoll(); | |
| 1083 UPerfFunction* TestStrcollNull(); | |
| 1084 UPerfFunction* TestStrcollSimilar(); | |
| 1085 | |
| 1086 UPerfFunction* TestStrcollUTF8(); | |
| 1087 UPerfFunction* TestStrcollUTF8Null(); | |
| 1088 UPerfFunction* TestStrcollUTF8Similar(); | |
| 1089 | |
| 1090 UPerfFunction* TestGetSortKey(); | |
| 1091 UPerfFunction* TestGetSortKeyNull(); | |
| 1092 | |
| 1093 UPerfFunction* TestNextSortKeyPart_4All(); | |
| 1094 UPerfFunction* TestNextSortKeyPart_4x2(); | |
| 1095 UPerfFunction* TestNextSortKeyPart_4x4(); | |
| 1096 UPerfFunction* TestNextSortKeyPart_4x8(); | |
| 1097 UPerfFunction* TestNextSortKeyPart_32All(); | |
| 1098 UPerfFunction* TestNextSortKeyPart_32x2(); | |
| 1099 | |
| 1100 UPerfFunction* TestNextSortKeyPartUTF8_4All(); | |
| 1101 UPerfFunction* TestNextSortKeyPartUTF8_4x2(); | |
| 1102 UPerfFunction* TestNextSortKeyPartUTF8_4x4(); | |
| 1103 UPerfFunction* TestNextSortKeyPartUTF8_4x8(); | |
| 1104 UPerfFunction* TestNextSortKeyPartUTF8_32All(); | |
| 1105 UPerfFunction* TestNextSortKeyPartUTF8_32x2(); | |
| 1106 | |
| 1107 UPerfFunction* TestCppCompare(); | |
| 1108 UPerfFunction* TestCppCompareNull(); | |
| 1109 UPerfFunction* TestCppCompareSimilar(); | |
| 1110 | |
| 1111 UPerfFunction* TestCppCompareUTF8(); | |
| 1112 UPerfFunction* TestCppCompareUTF8Null(); | |
| 1113 UPerfFunction* TestCppCompareUTF8Similar(); | |
| 1114 | |
| 1115 UPerfFunction* TestCppGetCollationKey(); | |
| 1116 UPerfFunction* TestCppGetCollationKeyNull(); | |
| 1117 | |
| 1118 UPerfFunction* TestUniStrSort(); | |
| 1119 UPerfFunction* TestStringPieceSortCpp(); | |
| 1120 UPerfFunction* TestStringPieceSortC(); | |
| 1121 | |
| 1122 UPerfFunction* TestUniStrBinSearch(); | |
| 1123 UPerfFunction* TestStringPieceBinSearchCpp(); | |
| 1124 UPerfFunction* TestStringPieceBinSearchC(); | |
| 1125 }; | |
| 1126 | |
| 1127 CollPerf2Test::CollPerf2Test(int32_t argc, const char *argv[], UErrorCode &statu
s) : | |
| 1128 UPerfTest(argc, argv, status), | |
| 1129 coll(NULL), | |
| 1130 collObj(NULL), | |
| 1131 count(0), | |
| 1132 data16(NULL), | |
| 1133 data8(NULL), | |
| 1134 modData16(NULL), | |
| 1135 modData8(NULL), | |
| 1136 sortedData16(NULL), | |
| 1137 sortedData8(NULL), | |
| 1138 randomData16(NULL), | |
| 1139 randomData8(NULL) | |
| 1140 { | |
| 1141 if (U_FAILURE(status)) { | |
| 1142 return; | |
| 1143 } | |
| 1144 | |
| 1145 if (locale == NULL){ | |
| 1146 locale = "root"; | |
| 1147 } | |
| 1148 | |
| 1149 // Set up an ICU collator. | |
| 1150 // Starting with ICU 54 (ticket #8260), this supports standard collation loc
ale keywords. | |
| 1151 coll = ucol_open(locale, &status); | |
| 1152 collObj = Collator::createInstance(locale, status); | |
| 1153 } | |
| 1154 | |
| 1155 CollPerf2Test::~CollPerf2Test() | |
| 1156 { | |
| 1157 ucol_close(coll); | |
| 1158 delete collObj; | |
| 1159 | |
| 1160 delete data16; | |
| 1161 delete data8; | |
| 1162 delete modData16; | |
| 1163 delete modData8; | |
| 1164 delete sortedData16; | |
| 1165 delete sortedData8; | |
| 1166 delete randomData16; | |
| 1167 delete randomData8; | |
| 1168 } | |
| 1169 | |
| 1170 #define MAX_NUM_DATA 10000 | |
| 1171 | |
| 1172 const CA_uchar* CollPerf2Test::getData16(UErrorCode &status) | |
| 1173 { | |
| 1174 if (U_FAILURE(status)) return NULL; | |
| 1175 if (data16) return data16; | |
| 1176 | |
| 1177 CA_uchar* d16 = new CA_uchar(); | |
| 1178 const UChar *line = NULL; | |
| 1179 int32_t len = 0; | |
| 1180 int32_t numData = 0; | |
| 1181 | |
| 1182 for (;;) { | |
| 1183 line = ucbuf_readline(ucharBuf, &len, &status); | |
| 1184 if (line == NULL || U_FAILURE(status)) break; | |
| 1185 | |
| 1186 // Refer to the source code of ucbuf_readline() | |
| 1187 // 1. 'len' includes the line terminal symbols | |
| 1188 // 2. The length of the line terminal symbols is only one character | |
| 1189 // 3. The Windows CR LF line terminal symbols will be converted to CR | |
| 1190 | |
| 1191 if (len == 1 || line[0] == 0x23 /* '#' */) { | |
| 1192 continue; // skip empty/comment line | |
| 1193 } else { | |
| 1194 d16->append_one(len); | |
| 1195 UChar *p = d16->last(); | |
| 1196 u_memcpy(p, line, len - 1); // exclude the CR | |
| 1197 p[len - 1] = 0; // NUL-terminate | |
| 1198 | |
| 1199 numData++; | |
| 1200 if (numData >= MAX_NUM_DATA) break; | |
| 1201 } | |
| 1202 } | |
| 1203 | |
| 1204 if (U_SUCCESS(status)) { | |
| 1205 data16 = d16; | |
| 1206 } else { | |
| 1207 delete d16; | |
| 1208 } | |
| 1209 | |
| 1210 return data16; | |
| 1211 } | |
| 1212 | |
| 1213 const CA_char* CollPerf2Test::getData8(UErrorCode &status) | |
| 1214 { | |
| 1215 if (U_FAILURE(status)) return NULL; | |
| 1216 if (data8) return data8; | |
| 1217 return data8 = getData8FromData16(getData16(status), status); | |
| 1218 } | |
| 1219 | |
| 1220 const CA_uchar* CollPerf2Test::getModData16(UErrorCode &status) | |
| 1221 { | |
| 1222 if (U_FAILURE(status)) return NULL; | |
| 1223 if (modData16) return modData16; | |
| 1224 | |
| 1225 const CA_uchar* d16 = getData16(status); | |
| 1226 if (U_FAILURE(status)) return NULL; | |
| 1227 | |
| 1228 CA_uchar* modData16 = new CA_uchar(); | |
| 1229 | |
| 1230 for (int32_t i = 0; i < d16->count; i++) { | |
| 1231 const UChar *s = d16->dataOf(i); | |
| 1232 int32_t len = d16->lengthOf(i) + 1; // including NULL terminator | |
| 1233 | |
| 1234 modData16->append_one(len); | |
| 1235 u_memcpy(modData16->last(), s, len); | |
| 1236 | |
| 1237 // replacing the last character with a different character | |
| 1238 UChar *lastChar = &modData16->last()[len -2]; | |
| 1239 for (int32_t j = i + 1; j != i; j++) { | |
| 1240 if (j >= d16->count) { | |
| 1241 j = 0; | |
| 1242 } | |
| 1243 const UChar *s1 = d16->dataOf(j); | |
| 1244 UChar lastChar1 = s1[d16->lengthOf(j) - 1]; | |
| 1245 if (*lastChar != lastChar1) { | |
| 1246 *lastChar = lastChar1; | |
| 1247 break; | |
| 1248 } | |
| 1249 } | |
| 1250 } | |
| 1251 | |
| 1252 return modData16; | |
| 1253 } | |
| 1254 | |
| 1255 const CA_char* CollPerf2Test::getModData8(UErrorCode &status) | |
| 1256 { | |
| 1257 if (U_FAILURE(status)) return NULL; | |
| 1258 if (modData8) return modData8; | |
| 1259 return modData8 = getData8FromData16(getModData16(status), status); | |
| 1260 } | |
| 1261 | |
| 1262 namespace { | |
| 1263 | |
| 1264 struct ArrayAndColl { | |
| 1265 ArrayAndColl(const CA_uchar* a, const Collator& c) : d16(a), coll(c) {} | |
| 1266 const CA_uchar* d16; | |
| 1267 const Collator& coll; | |
| 1268 }; | |
| 1269 | |
| 1270 int32_t U_CALLCONV | |
| 1271 U16CollatorComparator(const void* context, const void* left, const void* right)
{ | |
| 1272 const ArrayAndColl& ac = *(const ArrayAndColl*)context; | |
| 1273 const CA_uchar* d16 = ac.d16; | |
| 1274 int32_t leftIndex = *(const int32_t*)left; | |
| 1275 int32_t rightIndex = *(const int32_t*)right; | |
| 1276 UErrorCode errorCode = U_ZERO_ERROR; | |
| 1277 return ac.coll.compare(d16->dataOf(leftIndex), d16->lengthOf(leftIndex), | |
| 1278 d16->dataOf(rightIndex), d16->lengthOf(rightIndex), | |
| 1279 errorCode); | |
| 1280 } | |
| 1281 | |
| 1282 int32_t U_CALLCONV | |
| 1283 U16HashComparator(const void* context, const void* left, const void* right) { | |
| 1284 const CA_uchar* d16 = (const CA_uchar*)context; | |
| 1285 int32_t leftIndex = *(const int32_t*)left; | |
| 1286 int32_t rightIndex = *(const int32_t*)right; | |
| 1287 int32_t leftHash = ustr_hashUCharsN(d16->dataOf(leftIndex), d16->lengthOf(le
ftIndex)); | |
| 1288 int32_t rightHash = ustr_hashUCharsN(d16->dataOf(rightIndex), d16->lengthOf(
rightIndex)); | |
| 1289 return leftHash < rightHash ? -1 : leftHash == rightHash ? 0 : 1; | |
| 1290 } | |
| 1291 | |
| 1292 } // namespace | |
| 1293 | |
| 1294 const CA_uchar* CollPerf2Test::getSortedData16(UErrorCode &status) { | |
| 1295 if (U_FAILURE(status)) return NULL; | |
| 1296 if (sortedData16) return sortedData16; | |
| 1297 | |
| 1298 ArrayAndColl ac(getData16(status), *collObj); | |
| 1299 return sortedData16 = sortData16(ac.d16, U16CollatorComparator, &ac, status)
; | |
| 1300 } | |
| 1301 | |
| 1302 const CA_char* CollPerf2Test::getSortedData8(UErrorCode &status) { | |
| 1303 if (U_FAILURE(status)) return NULL; | |
| 1304 if (sortedData8) return sortedData8; | |
| 1305 return sortedData8 = getData8FromData16(getSortedData16(status), status); | |
| 1306 } | |
| 1307 | |
| 1308 const CA_uchar* CollPerf2Test::getRandomData16(UErrorCode &status) { | |
| 1309 if (U_FAILURE(status)) return NULL; | |
| 1310 if (randomData16) return randomData16; | |
| 1311 | |
| 1312 // Sort the strings by their hash codes, which should be a reasonably pseudo
-random order. | |
| 1313 const CA_uchar* d16 = getData16(status); | |
| 1314 return randomData16 = sortData16(d16, U16HashComparator, d16, status); | |
| 1315 } | |
| 1316 | |
| 1317 const CA_char* CollPerf2Test::getRandomData8(UErrorCode &status) { | |
| 1318 if (U_FAILURE(status)) return NULL; | |
| 1319 if (randomData8) return randomData8; | |
| 1320 return randomData8 = getData8FromData16(getRandomData16(status), status); | |
| 1321 } | |
| 1322 | |
| 1323 CA_uchar* CollPerf2Test::sortData16(const CA_uchar* d16, | |
| 1324 UComparator *cmp, const void *context, | |
| 1325 UErrorCode &status) { | |
| 1326 if (U_FAILURE(status)) return NULL; | |
| 1327 | |
| 1328 LocalArray<int32_t> indexes(new int32_t[d16->count]); | |
| 1329 for (int32_t i = 0; i < d16->count; ++i) { | |
| 1330 indexes[i] = i; | |
| 1331 } | |
| 1332 uprv_sortArray(indexes.getAlias(), d16->count, 4, cmp, context, TRUE, &statu
s); | |
| 1333 if (U_FAILURE(status)) return NULL; | |
| 1334 | |
| 1335 // Copy the strings in sorted order into a new array. | |
| 1336 LocalPointer<CA_uchar> newD16(new CA_uchar()); | |
| 1337 for (int32_t i = 0; i < d16->count; i++) { | |
| 1338 int32_t j = indexes[i]; | |
| 1339 const UChar* s = d16->dataOf(j); | |
| 1340 int32_t len = d16->lengthOf(j); | |
| 1341 int32_t capacity = len + 1; // including NULL terminator | |
| 1342 newD16->append_one(capacity); | |
| 1343 u_memcpy(newD16->last(), s, capacity); | |
| 1344 } | |
| 1345 | |
| 1346 if (U_SUCCESS(status)) { | |
| 1347 return newD16.orphan(); | |
| 1348 } else { | |
| 1349 return NULL; | |
| 1350 } | |
| 1351 } | |
| 1352 | |
| 1353 CA_char* CollPerf2Test::getData8FromData16(const CA_uchar* d16, UErrorCode &stat
us) { | |
| 1354 if (U_FAILURE(status)) return NULL; | |
| 1355 | |
| 1356 // UTF-16 -> UTF-8 conversion | |
| 1357 LocalPointer<CA_char> d8(new CA_char()); | |
| 1358 for (int32_t i = 0; i < d16->count; i++) { | |
| 1359 const UChar *s16 = d16->dataOf(i); | |
| 1360 int32_t length16 = d16->lengthOf(i); | |
| 1361 | |
| 1362 // get length in UTF-8 | |
| 1363 int32_t length8; | |
| 1364 u_strToUTF8(NULL, 0, &length8, s16, length16, &status); | |
| 1365 if (status == U_BUFFER_OVERFLOW_ERROR || status == U_ZERO_ERROR){ | |
| 1366 status = U_ZERO_ERROR; | |
| 1367 } else { | |
| 1368 break; | |
| 1369 } | |
| 1370 int32_t capacity8 = length8 + 1; // plus terminal NULL | |
| 1371 d8->append_one(capacity8); | |
| 1372 | |
| 1373 // convert to UTF-8 | |
| 1374 u_strToUTF8(d8->last(), capacity8, NULL, s16, length16, &status); | |
| 1375 if (U_FAILURE(status)) break; | |
| 1376 } | |
| 1377 | |
| 1378 if (U_SUCCESS(status)) { | |
| 1379 return d8.orphan(); | |
| 1380 } else { | |
| 1381 return NULL; | |
| 1382 } | |
| 1383 } | |
| 1384 | |
| 1385 UPerfFunction* | |
| 1386 CollPerf2Test::runIndexedTest(int32_t index, UBool exec, const char *&name, char
*par /*= NULL*/) | |
| 1387 { | |
| 1388 (void)par; | |
| 1389 TESTCASE_AUTO_BEGIN; | |
| 1390 | |
| 1391 TESTCASE_AUTO(TestStrcoll); | |
| 1392 TESTCASE_AUTO(TestStrcollNull); | |
| 1393 TESTCASE_AUTO(TestStrcollSimilar); | |
| 1394 | |
| 1395 TESTCASE_AUTO(TestStrcollUTF8); | |
| 1396 TESTCASE_AUTO(TestStrcollUTF8Null); | |
| 1397 TESTCASE_AUTO(TestStrcollUTF8Similar); | |
| 1398 | |
| 1399 TESTCASE_AUTO(TestGetSortKey); | |
| 1400 TESTCASE_AUTO(TestGetSortKeyNull); | |
| 1401 | |
| 1402 TESTCASE_AUTO(TestNextSortKeyPart_4All); | |
| 1403 TESTCASE_AUTO(TestNextSortKeyPart_4x4); | |
| 1404 TESTCASE_AUTO(TestNextSortKeyPart_4x8); | |
| 1405 TESTCASE_AUTO(TestNextSortKeyPart_32All); | |
| 1406 TESTCASE_AUTO(TestNextSortKeyPart_32x2); | |
| 1407 | |
| 1408 TESTCASE_AUTO(TestNextSortKeyPartUTF8_4All); | |
| 1409 TESTCASE_AUTO(TestNextSortKeyPartUTF8_4x4); | |
| 1410 TESTCASE_AUTO(TestNextSortKeyPartUTF8_4x8); | |
| 1411 TESTCASE_AUTO(TestNextSortKeyPartUTF8_32All); | |
| 1412 TESTCASE_AUTO(TestNextSortKeyPartUTF8_32x2); | |
| 1413 | |
| 1414 TESTCASE_AUTO(TestCppCompare); | |
| 1415 TESTCASE_AUTO(TestCppCompareNull); | |
| 1416 TESTCASE_AUTO(TestCppCompareSimilar); | |
| 1417 | |
| 1418 TESTCASE_AUTO(TestCppCompareUTF8); | |
| 1419 TESTCASE_AUTO(TestCppCompareUTF8Null); | |
| 1420 TESTCASE_AUTO(TestCppCompareUTF8Similar); | |
| 1421 | |
| 1422 TESTCASE_AUTO(TestCppGetCollationKey); | |
| 1423 TESTCASE_AUTO(TestCppGetCollationKeyNull); | |
| 1424 | |
| 1425 TESTCASE_AUTO(TestUniStrSort); | |
| 1426 TESTCASE_AUTO(TestStringPieceSortCpp); | |
| 1427 TESTCASE_AUTO(TestStringPieceSortC); | |
| 1428 | |
| 1429 TESTCASE_AUTO(TestUniStrBinSearch); | |
| 1430 TESTCASE_AUTO(TestStringPieceBinSearchCpp); | |
| 1431 TESTCASE_AUTO(TestStringPieceBinSearchC); | |
| 1432 | |
| 1433 TESTCASE_AUTO_END; | |
| 1434 return NULL; | |
| 1435 } | |
| 1436 | |
| 1437 | |
| 1438 | |
| 1439 UPerfFunction* CollPerf2Test::TestStrcoll() | |
| 1440 { | |
| 1441 UErrorCode status = U_ZERO_ERROR; | |
| 1442 Strcoll *testCase = new Strcoll(coll, getData16(status), TRUE /* useLen */); | |
| 1443 if (U_FAILURE(status)) { | |
| 1444 delete testCase; | |
| 1445 return NULL; | |
| 1446 } | |
| 1447 return testCase; | |
| 1448 } | |
| 1449 | |
| 1450 UPerfFunction* CollPerf2Test::TestStrcollNull() | |
| 1451 { | |
| 1452 UErrorCode status = U_ZERO_ERROR; | |
| 1453 Strcoll *testCase = new Strcoll(coll, getData16(status), FALSE /* useLen */)
; | |
| 1454 if (U_FAILURE(status)) { | |
| 1455 delete testCase; | |
| 1456 return NULL; | |
| 1457 } | |
| 1458 return testCase; | |
| 1459 } | |
| 1460 | |
| 1461 UPerfFunction* CollPerf2Test::TestStrcollSimilar() | |
| 1462 { | |
| 1463 UErrorCode status = U_ZERO_ERROR; | |
| 1464 Strcoll_2 *testCase = new Strcoll_2(coll, getData16(status), getModData16(st
atus), TRUE /* useLen */); | |
| 1465 if (U_FAILURE(status)) { | |
| 1466 delete testCase; | |
| 1467 return NULL; | |
| 1468 } | |
| 1469 return testCase; | |
| 1470 } | |
| 1471 | |
| 1472 UPerfFunction* CollPerf2Test::TestStrcollUTF8() | |
| 1473 { | |
| 1474 UErrorCode status = U_ZERO_ERROR; | |
| 1475 StrcollUTF8 *testCase = new StrcollUTF8(coll, getData8(status), TRUE /* useL
en */); | |
| 1476 if (U_FAILURE(status)) { | |
| 1477 delete testCase; | |
| 1478 return NULL; | |
| 1479 } | |
| 1480 return testCase; | |
| 1481 } | |
| 1482 | |
| 1483 UPerfFunction* CollPerf2Test::TestStrcollUTF8Null() | |
| 1484 { | |
| 1485 UErrorCode status = U_ZERO_ERROR; | |
| 1486 StrcollUTF8 *testCase = new StrcollUTF8(coll, getData8(status),FALSE /* useL
en */); | |
| 1487 if (U_FAILURE(status)) { | |
| 1488 delete testCase; | |
| 1489 return NULL; | |
| 1490 } | |
| 1491 return testCase; | |
| 1492 } | |
| 1493 | |
| 1494 UPerfFunction* CollPerf2Test::TestStrcollUTF8Similar() | |
| 1495 { | |
| 1496 UErrorCode status = U_ZERO_ERROR; | |
| 1497 StrcollUTF8_2 *testCase = new StrcollUTF8_2(coll, getData8(status), getModDa
ta8(status), TRUE /* useLen */); | |
| 1498 if (U_FAILURE(status)) { | |
| 1499 delete testCase; | |
| 1500 return NULL; | |
| 1501 } | |
| 1502 return testCase; | |
| 1503 } | |
| 1504 | |
| 1505 UPerfFunction* CollPerf2Test::TestGetSortKey() | |
| 1506 { | |
| 1507 UErrorCode status = U_ZERO_ERROR; | |
| 1508 GetSortKey *testCase = new GetSortKey(coll, getData16(status), TRUE /* useLe
n */); | |
| 1509 if (U_FAILURE(status)) { | |
| 1510 delete testCase; | |
| 1511 return NULL; | |
| 1512 } | |
| 1513 return testCase; | |
| 1514 } | |
| 1515 | |
| 1516 UPerfFunction* CollPerf2Test::TestGetSortKeyNull() | |
| 1517 { | |
| 1518 UErrorCode status = U_ZERO_ERROR; | |
| 1519 GetSortKey *testCase = new GetSortKey(coll, getData16(status), FALSE /* useL
en */); | |
| 1520 if (U_FAILURE(status)) { | |
| 1521 delete testCase; | |
| 1522 return NULL; | |
| 1523 } | |
| 1524 return testCase; | |
| 1525 } | |
| 1526 | |
| 1527 UPerfFunction* CollPerf2Test::TestNextSortKeyPart_4All() | |
| 1528 { | |
| 1529 UErrorCode status = U_ZERO_ERROR; | |
| 1530 NextSortKeyPart *testCase = new NextSortKeyPart(coll, getData16(status), 4 /
* bufSize */); | |
| 1531 if (U_FAILURE(status)) { | |
| 1532 delete testCase; | |
| 1533 return NULL; | |
| 1534 } | |
| 1535 return testCase; | |
| 1536 } | |
| 1537 | |
| 1538 UPerfFunction* CollPerf2Test::TestNextSortKeyPart_4x4() | |
| 1539 { | |
| 1540 UErrorCode status = U_ZERO_ERROR; | |
| 1541 NextSortKeyPart *testCase = new NextSortKeyPart(coll, getData16(status), 4 /
* bufSize */, 4 /* maxIteration */); | |
| 1542 if (U_FAILURE(status)) { | |
| 1543 delete testCase; | |
| 1544 return NULL; | |
| 1545 } | |
| 1546 return testCase; | |
| 1547 } | |
| 1548 | |
| 1549 UPerfFunction* CollPerf2Test::TestNextSortKeyPart_4x8() | |
| 1550 { | |
| 1551 UErrorCode status = U_ZERO_ERROR; | |
| 1552 NextSortKeyPart *testCase = new NextSortKeyPart(coll, getData16(status), 4 /
* bufSize */, 8 /* maxIteration */); | |
| 1553 if (U_FAILURE(status)) { | |
| 1554 delete testCase; | |
| 1555 return NULL; | |
| 1556 } | |
| 1557 return testCase; | |
| 1558 } | |
| 1559 | |
| 1560 UPerfFunction* CollPerf2Test::TestNextSortKeyPart_32All() | |
| 1561 { | |
| 1562 UErrorCode status = U_ZERO_ERROR; | |
| 1563 NextSortKeyPart *testCase = new NextSortKeyPart(coll, getData16(status), 32
/* bufSize */); | |
| 1564 if (U_FAILURE(status)) { | |
| 1565 delete testCase; | |
| 1566 return NULL; | |
| 1567 } | |
| 1568 return testCase; | |
| 1569 } | |
| 1570 | |
| 1571 UPerfFunction* CollPerf2Test::TestNextSortKeyPart_32x2() | |
| 1572 { | |
| 1573 UErrorCode status = U_ZERO_ERROR; | |
| 1574 NextSortKeyPart *testCase = new NextSortKeyPart(coll, getData16(status), 32
/* bufSize */, 2 /* maxIteration */); | |
| 1575 if (U_FAILURE(status)) { | |
| 1576 delete testCase; | |
| 1577 return NULL; | |
| 1578 } | |
| 1579 return testCase; | |
| 1580 } | |
| 1581 | |
| 1582 UPerfFunction* CollPerf2Test::TestNextSortKeyPartUTF8_4All() | |
| 1583 { | |
| 1584 UErrorCode status = U_ZERO_ERROR; | |
| 1585 NextSortKeyPartUTF8 *testCase = new NextSortKeyPartUTF8(coll, getData8(statu
s), 4 /* bufSize */); | |
| 1586 if (U_FAILURE(status)) { | |
| 1587 delete testCase; | |
| 1588 return NULL; | |
| 1589 } | |
| 1590 return testCase; | |
| 1591 } | |
| 1592 | |
| 1593 UPerfFunction* CollPerf2Test::TestNextSortKeyPartUTF8_4x4() | |
| 1594 { | |
| 1595 UErrorCode status = U_ZERO_ERROR; | |
| 1596 NextSortKeyPartUTF8 *testCase = new NextSortKeyPartUTF8(coll, getData8(statu
s), 4 /* bufSize */, 4 /* maxIteration */); | |
| 1597 if (U_FAILURE(status)) { | |
| 1598 delete testCase; | |
| 1599 return NULL; | |
| 1600 } | |
| 1601 return testCase; | |
| 1602 } | |
| 1603 | |
| 1604 UPerfFunction* CollPerf2Test::TestNextSortKeyPartUTF8_4x8() | |
| 1605 { | |
| 1606 UErrorCode status = U_ZERO_ERROR; | |
| 1607 NextSortKeyPartUTF8 *testCase = new NextSortKeyPartUTF8(coll, getData8(statu
s), 4 /* bufSize */, 8 /* maxIteration */); | |
| 1608 if (U_FAILURE(status)) { | |
| 1609 delete testCase; | |
| 1610 return NULL; | |
| 1611 } | |
| 1612 return testCase; | |
| 1613 } | |
| 1614 | |
| 1615 UPerfFunction* CollPerf2Test::TestNextSortKeyPartUTF8_32All() | |
| 1616 { | |
| 1617 UErrorCode status = U_ZERO_ERROR; | |
| 1618 NextSortKeyPartUTF8 *testCase = new NextSortKeyPartUTF8(coll, getData8(statu
s), 32 /* bufSize */); | |
| 1619 if (U_FAILURE(status)) { | |
| 1620 delete testCase; | |
| 1621 return NULL; | |
| 1622 } | |
| 1623 return testCase; | |
| 1624 } | |
| 1625 | |
| 1626 UPerfFunction* CollPerf2Test::TestNextSortKeyPartUTF8_32x2() | |
| 1627 { | |
| 1628 UErrorCode status = U_ZERO_ERROR; | |
| 1629 NextSortKeyPartUTF8 *testCase = new NextSortKeyPartUTF8(coll, getData8(statu
s), 32 /* bufSize */, 2 /* maxIteration */); | |
| 1630 if (U_FAILURE(status)) { | |
| 1631 delete testCase; | |
| 1632 return NULL; | |
| 1633 } | |
| 1634 return testCase; | |
| 1635 } | |
| 1636 | |
| 1637 UPerfFunction* CollPerf2Test::TestCppCompare() | |
| 1638 { | |
| 1639 UErrorCode status = U_ZERO_ERROR; | |
| 1640 CppCompare *testCase = new CppCompare(collObj, getData16(status), TRUE /* us
eLen */); | |
| 1641 if (U_FAILURE(status)) { | |
| 1642 delete testCase; | |
| 1643 return NULL; | |
| 1644 } | |
| 1645 return testCase; | |
| 1646 } | |
| 1647 | |
| 1648 UPerfFunction* CollPerf2Test::TestCppCompareNull() | |
| 1649 { | |
| 1650 UErrorCode status = U_ZERO_ERROR; | |
| 1651 CppCompare *testCase = new CppCompare(collObj, getData16(status), FALSE /* u
seLen */); | |
| 1652 if (U_FAILURE(status)) { | |
| 1653 delete testCase; | |
| 1654 return NULL; | |
| 1655 } | |
| 1656 return testCase; | |
| 1657 } | |
| 1658 | |
| 1659 UPerfFunction* CollPerf2Test::TestCppCompareSimilar() | |
| 1660 { | |
| 1661 UErrorCode status = U_ZERO_ERROR; | |
| 1662 CppCompare_2 *testCase = new CppCompare_2(collObj, getData16(status), getMod
Data16(status), TRUE /* useLen */); | |
| 1663 if (U_FAILURE(status)) { | |
| 1664 delete testCase; | |
| 1665 return NULL; | |
| 1666 } | |
| 1667 return testCase; | |
| 1668 } | |
| 1669 | |
| 1670 UPerfFunction* CollPerf2Test::TestCppCompareUTF8() | |
| 1671 { | |
| 1672 UErrorCode status = U_ZERO_ERROR; | |
| 1673 CppCompareUTF8 *testCase = new CppCompareUTF8(collObj, getData8(status), TRU
E /* useLen */); | |
| 1674 if (U_FAILURE(status)) { | |
| 1675 delete testCase; | |
| 1676 return NULL; | |
| 1677 } | |
| 1678 return testCase; | |
| 1679 } | |
| 1680 | |
| 1681 UPerfFunction* CollPerf2Test::TestCppCompareUTF8Null() | |
| 1682 { | |
| 1683 UErrorCode status = U_ZERO_ERROR; | |
| 1684 CppCompareUTF8 *testCase = new CppCompareUTF8(collObj, getData8(status), FAL
SE /* useLen */); | |
| 1685 if (U_FAILURE(status)) { | |
| 1686 delete testCase; | |
| 1687 return NULL; | |
| 1688 } | |
| 1689 return testCase; | |
| 1690 } | |
| 1691 | |
| 1692 UPerfFunction* CollPerf2Test::TestCppCompareUTF8Similar() | |
| 1693 { | |
| 1694 UErrorCode status = U_ZERO_ERROR; | |
| 1695 CppCompareUTF8_2 *testCase = new CppCompareUTF8_2(collObj, getData8(status),
getModData8(status), TRUE /* useLen */); | |
| 1696 if (U_FAILURE(status)) { | |
| 1697 delete testCase; | |
| 1698 return NULL; | |
| 1699 } | |
| 1700 return testCase; | |
| 1701 } | |
| 1702 | |
| 1703 UPerfFunction* CollPerf2Test::TestCppGetCollationKey() | |
| 1704 { | |
| 1705 UErrorCode status = U_ZERO_ERROR; | |
| 1706 CppGetCollationKey *testCase = new CppGetCollationKey(collObj, getData16(sta
tus), TRUE /* useLen */); | |
| 1707 if (U_FAILURE(status)) { | |
| 1708 delete testCase; | |
| 1709 return NULL; | |
| 1710 } | |
| 1711 return testCase; | |
| 1712 } | |
| 1713 | |
| 1714 UPerfFunction* CollPerf2Test::TestCppGetCollationKeyNull() | |
| 1715 { | |
| 1716 UErrorCode status = U_ZERO_ERROR; | |
| 1717 CppGetCollationKey *testCase = new CppGetCollationKey(collObj, getData16(sta
tus), FALSE /* useLen */); | |
| 1718 if (U_FAILURE(status)) { | |
| 1719 delete testCase; | |
| 1720 return NULL; | |
| 1721 } | |
| 1722 return testCase; | |
| 1723 } | |
| 1724 | |
| 1725 UPerfFunction* CollPerf2Test::TestUniStrSort() { | |
| 1726 UErrorCode status = U_ZERO_ERROR; | |
| 1727 UPerfFunction *testCase = new UniStrSort(*collObj, coll, getRandomData16(sta
tus)); | |
| 1728 if (U_FAILURE(status)) { | |
| 1729 delete testCase; | |
| 1730 return NULL; | |
| 1731 } | |
| 1732 return testCase; | |
| 1733 } | |
| 1734 | |
| 1735 UPerfFunction* CollPerf2Test::TestStringPieceSortCpp() { | |
| 1736 UErrorCode status = U_ZERO_ERROR; | |
| 1737 UPerfFunction *testCase = new StringPieceSortCpp(*collObj, coll, getRandomDa
ta8(status)); | |
| 1738 if (U_FAILURE(status)) { | |
| 1739 delete testCase; | |
| 1740 return NULL; | |
| 1741 } | |
| 1742 return testCase; | |
| 1743 } | |
| 1744 | |
| 1745 UPerfFunction* CollPerf2Test::TestStringPieceSortC() { | |
| 1746 UErrorCode status = U_ZERO_ERROR; | |
| 1747 UPerfFunction *testCase = new StringPieceSortC(*collObj, coll, getRandomData
8(status)); | |
| 1748 if (U_FAILURE(status)) { | |
| 1749 delete testCase; | |
| 1750 return NULL; | |
| 1751 } | |
| 1752 return testCase; | |
| 1753 } | |
| 1754 | |
| 1755 UPerfFunction* CollPerf2Test::TestUniStrBinSearch() { | |
| 1756 UErrorCode status = U_ZERO_ERROR; | |
| 1757 UPerfFunction *testCase = new UniStrBinSearch(*collObj, coll, getSortedData1
6(status)); | |
| 1758 if (U_FAILURE(status)) { | |
| 1759 delete testCase; | |
| 1760 return NULL; | |
| 1761 } | |
| 1762 return testCase; | |
| 1763 } | |
| 1764 | |
| 1765 UPerfFunction* CollPerf2Test::TestStringPieceBinSearchCpp() { | |
| 1766 UErrorCode status = U_ZERO_ERROR; | |
| 1767 UPerfFunction *testCase = new StringPieceBinSearchCpp(*collObj, coll, getSor
tedData8(status)); | |
| 1768 if (U_FAILURE(status)) { | |
| 1769 delete testCase; | |
| 1770 return NULL; | |
| 1771 } | |
| 1772 return testCase; | |
| 1773 } | |
| 1774 | |
| 1775 UPerfFunction* CollPerf2Test::TestStringPieceBinSearchC() { | |
| 1776 UErrorCode status = U_ZERO_ERROR; | |
| 1777 UPerfFunction *testCase = new StringPieceBinSearchC(*collObj, coll, getSorte
dData8(status)); | |
| 1778 if (U_FAILURE(status)) { | |
| 1779 delete testCase; | |
| 1780 return NULL; | |
| 1781 } | |
| 1782 return testCase; | |
| 1783 } | |
| 1784 | |
| 1785 | |
| 1786 int main(int argc, const char *argv[]) | |
| 1787 { | |
| 1788 UErrorCode status = U_ZERO_ERROR; | |
| 1789 CollPerf2Test test(argc, argv, status); | |
| 1790 | |
| 1791 if (U_FAILURE(status)){ | |
| 1792 printf("The error is %s\n", u_errorName(status)); | |
| 1793 //TODO: print usage here | |
| 1794 return status; | |
| 1795 } | |
| 1796 | |
| 1797 if (test.run() == FALSE){ | |
| 1798 fprintf(stderr, "FAILED: Tests could not be run please check the argumen
ts.\n"); | |
| 1799 return -1; | |
| 1800 } | |
| 1801 return 0; | |
| 1802 } | |
| OLD | NEW |