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