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