1f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/******************************************************************** 2f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* COPYRIGHT: 3f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* Copyright (C) 2001-2006 IBM, Inc. All Rights Reserved. 4f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* 5f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)********************************************************************/ 6f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 7f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include <stdio.h> 8f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include <stdlib.h> 9f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include <locale.h> 10f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include <limits.h> 11f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include <string.h> 12f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/uperf.h" 13f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "uoptions.h" 14f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/coll.h" 15f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include <unicode/ucoleitr.h> 16f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 17f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 18f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 19f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/* To store an array of string<UNIT> in continue space. 20f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)Since string<UNIT> itself is treated as an array of UNIT, this 21f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)class will ease our memory management for an array of string<UNIT>. 22f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*/ 23f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 24f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//template<typename UNIT> 25f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define COMPATCT_ARRAY(CompactArrays, UNIT) \ 26f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)struct CompactArrays{\ 27f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) CompactArrays(const CompactArrays & );\ 28f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) CompactArrays & operator=(const CompactArrays & );\ 29f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t count;/*total number of the strings*/ \ 30f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t * index;/*relative offset in data*/ \ 31f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UNIT * data; /*the real space to hold strings*/ \ 32f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) \ 33f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ~CompactArrays(){free(index);free(data);} \ 34f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) CompactArrays():data(NULL), index(NULL), count(0){ \ 35f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) index = (int32_t *) realloc(index, sizeof(int32_t)); \ 36f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) index[0] = 0; \ 37f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } \ 38f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) void append_one(int32_t theLen){ /*include terminal NULL*/ \ 39f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) count++; \ 40f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) index = (int32_t *) realloc(index, sizeof(int32_t) * (count + 1)); \ 41f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) index[count] = index[count - 1] + theLen; \ 42f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) data = (UNIT *) realloc(data, sizeof(UNIT) * index[count]); \ 43f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } \ 44f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UNIT * last(){return data + index[count - 1];} \ 45f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UNIT * dataOf(int32_t i){return data + index[i];} \ 46f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t lengthOf(int i){return index[i+1] - index[i] - 1; } /*exclude terminating NULL*/ \ 47f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}; 48f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 49f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//typedef CompactArrays<UChar> CA_uchar; 50f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//typedef CompactArrays<char> CA_char; 51f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//typedef CompactArrays<uint8_t> CA_uint8; 52f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//typedef CompactArrays<WCHAR> CA_win_wchar; 53f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 54f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)COMPATCT_ARRAY(CA_uchar, UChar) 55f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)COMPATCT_ARRAY(CA_char, char) 56f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)COMPATCT_ARRAY(CA_uint8, uint8_t) 57f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)COMPATCT_ARRAY(CA_win_wchar, WCHAR) 58f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 59f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 60f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)struct DataIndex { 61f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) static DWORD win_langid; // for qsort callback function 62f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) static UCollator * col; // for qsort callback function 63f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) uint8_t * icu_key; 64f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UChar * icu_data; 65f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t icu_data_len; 66f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) char* posix_key; 67f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) char* posix_data; 68f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t posix_data_len; 69f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) char* win_key; 70f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) WCHAR * win_data; 71f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t win_data_len; 72f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}; 73f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)DWORD DataIndex::win_langid; 74f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)UCollator * DataIndex::col; 75f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 76f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 77f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 78f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)class CmdKeyGen : public UPerfFunction { 79f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) typedef void (CmdKeyGen::* Func)(int32_t); 80f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) enum{MAX_KEY_LENGTH = 5000}; 81f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UCollator * col; 82f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) DWORD win_langid; 83f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t count; 84f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) DataIndex * data; 85f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) Func fn; 86f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 87f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) union { // to save sapce 88f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) uint8_t icu_key[MAX_KEY_LENGTH]; 89f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) char posix_key[MAX_KEY_LENGTH]; 90f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) WCHAR win_key[MAX_KEY_LENGTH]; 91f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) }; 92f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)public: 93f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) CmdKeyGen(UErrorCode, UCollator * col,DWORD win_langid, int32_t count, DataIndex * data,Func fn,int32_t) 94f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) :col(col),win_langid(win_langid), count(count), data(data), fn(fn){} 95f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 96f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) virtual long getOperationsPerIteration(){return count;} 97f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 98f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) virtual void call(UErrorCode* status){ 99f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) for(int32_t i = 0; i< count; i++){ 100f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) (this->*fn)(i); 101f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 102f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 103f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 104f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) void icu_key_null(int32_t i){ 105f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucol_getSortKey(col, data[i].icu_data, -1, icu_key, MAX_KEY_LENGTH); 106f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 107f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 108f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) void icu_key_len(int32_t i){ 109f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucol_getSortKey(col, data[i].icu_data, data[i].icu_data_len, icu_key, MAX_KEY_LENGTH); 110f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 111f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 112f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // pre-generated in CollPerfTest::prepareData(), need not to check error here 113f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) void win_key_null(int32_t i){ 114f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) //LCMAP_SORTsk 0x00000400 // WC sort sk (normalize) 115f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) LCMapStringW(win_langid, LCMAP_SORTKEY, data[i].win_data, -1, win_key, MAX_KEY_LENGTH); 116f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 117f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 118f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) void win_key_len(int32_t i){ 119f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) LCMapStringW(win_langid, LCMAP_SORTKEY, data[i].win_data, data[i].win_data_len, win_key, MAX_KEY_LENGTH); 120f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 121f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 122f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) void posix_key_null(int32_t i){ 123f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) strxfrm(posix_key, data[i].posix_data, MAX_KEY_LENGTH); 124f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 125f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}; 126f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 127f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 128f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)class CmdIter : public UPerfFunction { 129f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) typedef void (CmdIter::* Func)(UErrorCode* , int32_t ); 130f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t count; 131f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) CA_uchar * data; 132f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) Func fn; 133f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UCollationElements *iter; 134f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t exec_count; 135f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)public: 136f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) CmdIter(UErrorCode & status, UCollator * col, int32_t count, CA_uchar *data, Func fn, int32_t,int32_t) 137f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) :count(count), data(data), fn(fn){ 138f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) exec_count = 0; 139f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UChar dummytext[] = {0, 0}; 140f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) iter = ucol_openElements(col, NULL, 0, &status); 141f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucol_setText(iter, dummytext, 1, &status); 142f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 143f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ~CmdIter(){ 144f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucol_closeElements(iter); 145f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 146f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 147f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) virtual long getOperationsPerIteration(){return exec_count ? exec_count : 1;} 148f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 149f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) virtual void call(UErrorCode* status){ 150f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) exec_count = 0; 151f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) for(int32_t i = 0; i< count; i++){ 152f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) (this->*fn)(status, i); 153f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 154f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 155f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 156f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) void icu_forward_null(UErrorCode* status, int32_t i){ 157f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucol_setText(iter, data->dataOf(i), -1, status); 158f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) while (ucol_next(iter, status) != UCOL_NULLORDER) exec_count++; 159f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 160f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 161f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) void icu_forward_len(UErrorCode* status, int32_t i){ 162f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucol_setText(iter, data->dataOf(i), data->lengthOf(i) , status); 163f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) while (ucol_next(iter, status) != UCOL_NULLORDER) exec_count++; 164f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 165f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 166f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) void icu_backward_null(UErrorCode* status, int32_t i){ 167f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucol_setText(iter, data->dataOf(i), -1, status); 168f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) while (ucol_previous(iter, status) != UCOL_NULLORDER) exec_count++; 169f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 170f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 171f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) void icu_backward_len(UErrorCode* status, int32_t i){ 172f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucol_setText(iter, data->dataOf(i), data->lengthOf(i) , status); 173f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) while (ucol_previous(iter, status) != UCOL_NULLORDER) exec_count++; 174f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 175f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}; 176f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 177f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)class CmdIterAll : public UPerfFunction { 178f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) typedef void (CmdIterAll::* Func)(UErrorCode* status); 179f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t count; 180f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UChar * data; 181f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) Func fn; 182f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UCollationElements *iter; 183f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t exec_count; 184f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 185f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)public: 186f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) enum CALL {forward_null, forward_len, backward_null, backward_len}; 187f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 188f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ~CmdIterAll(){ 189f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucol_closeElements(iter); 190f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 191f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) CmdIterAll(UErrorCode & status, UCollator * col, int32_t count, UChar * data, CALL call,int32_t,int32_t) 192f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) :count(count),data(data) 193f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) { 194f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) exec_count = 0; 195f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (call == forward_null || call == backward_null) { 196f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) iter = ucol_openElements(col, data, -1, &status); 197f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else { 198f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) iter = ucol_openElements(col, data, count, &status); 199f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 200f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 201f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (call == forward_null || call == forward_len){ 202f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fn = &CmdIterAll::icu_forward_all; 203f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else { 204f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fn = &CmdIterAll::icu_backward_all; 205f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 206f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 207f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) virtual long getOperationsPerIteration(){return exec_count ? exec_count : 1;} 208f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 209f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) virtual void call(UErrorCode* status){ 210f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) (this->*fn)(status); 211f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 212f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 213f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) void icu_forward_all(UErrorCode* status){ 214f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int strlen = count - 5; 215f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int count5 = 5; 216f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int strindex = 0; 217f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucol_setOffset(iter, strindex, status); 218f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) while (TRUE) { 219f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (ucol_next(iter, status) == UCOL_NULLORDER) { 220f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) break; 221f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 222f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) exec_count++; 223f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) count5 --; 224f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (count5 == 0) { 225f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) strindex += 10; 226f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (strindex > strlen) { 227f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) break; 228f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 229f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucol_setOffset(iter, strindex, status); 230f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) count5 = 5; 231f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 232f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 233f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 234f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 235f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) void icu_backward_all(UErrorCode* status){ 236f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int strlen = count; 237f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int count5 = 5; 238f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int strindex = 5; 239f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucol_setOffset(iter, strindex, status); 240f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) while (TRUE) { 241f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (ucol_previous(iter, status) == UCOL_NULLORDER) { 242f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) break; 243f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 244f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) exec_count++; 245f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) count5 --; 246f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (count5 == 0) { 247f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) strindex += 10; 248f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (strindex > strlen) { 249f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) break; 250f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 251f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucol_setOffset(iter, strindex, status); 252f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) count5 = 5; 253f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 254f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 255f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 256f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 257f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}; 258f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 259f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)struct CmdQsort : public UPerfFunction{ 260f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 261f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) static int q_random(const void * a, const void * b){ 262f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) uint8_t * key_a = ((DataIndex *)a)->icu_key; 263f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) uint8_t * key_b = ((DataIndex *)b)->icu_key; 264f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 265f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int val_a = 0; 266f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int val_b = 0; 267f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) while (*key_a != 0) {val_a += val_a*37 + *key_a++;} 268f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) while (*key_b != 0) {val_b += val_b*37 + *key_b++;} 269f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return val_a - val_b; 270f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 271f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 272f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define QCAST() \ 273f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) DataIndex * da = (DataIndex *) a; \ 274f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) DataIndex * db = (DataIndex *) b; \ 275f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ++exec_count 276f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 277f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) static int icu_strcoll_null(const void *a, const void *b){ 278f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) QCAST(); 279f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return ucol_strcoll(da->col, da->icu_data, -1, db->icu_data, -1) - UCOL_EQUAL; 280f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 281f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 282f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) static int icu_strcoll_len(const void *a, const void *b){ 283f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) QCAST(); 284f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return ucol_strcoll(da->col, da->icu_data, da->icu_data_len, db->icu_data, db->icu_data_len) - UCOL_EQUAL; 285f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 286f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 287f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) static int icu_cmpkey (const void *a, const void *b){ 288f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) QCAST(); 289f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return strcmp((char *) da->icu_key, (char *) db->icu_key); 290f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 291f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 292f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) static int win_cmp_null(const void *a, const void *b) { 293f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) QCAST(); 294f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) //CSTR_LESS_THAN 1 295f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) //CSTR_EQUAL 2 296f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) //CSTR_GREATER_THAN 3 297f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int t = CompareStringW(da->win_langid, 0, da->win_data, -1, db->win_data, -1); 298f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (t == 0){ 299f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fprintf(stderr, "CompareStringW error, error number %x\n", GetLastError()); 300f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) exit(-1); 301f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else{ 302f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return t - CSTR_EQUAL; 303f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 304f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 305f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 306f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) static int win_cmp_len(const void *a, const void *b) { 307f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) QCAST(); 308f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int t = CompareStringW(da->win_langid, 0, da->win_data, da->win_data_len, db->win_data, db->win_data_len); 309f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (t == 0){ 310f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fprintf(stderr, "CompareStringW error, error number %x\n", GetLastError()); 311f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) exit(-1); 312f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else{ 313f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return t - CSTR_EQUAL; 314f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 315f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 316f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 317f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define QFUNC(name, func, data) \ 318f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) static int name (const void *a, const void *b){ \ 319f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) QCAST(); \ 320f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return func(da->data, db->data); \ 321f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 322f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 323f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) QFUNC(posix_strcoll_null, strcoll, posix_data) 324f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) QFUNC(posix_cmpkey, strcmp, posix_key) 325f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) QFUNC(win_cmpkey, strcmp, win_key) 326f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) QFUNC(win_wcscmp, wcscmp, win_data) 327f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) QFUNC(icu_strcmp, u_strcmp, icu_data) 328f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) QFUNC(icu_cmpcpo, u_strcmpCodePointOrder, icu_data) 329f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 330f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)private: 331f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) static int32_t exec_count; // potential muilt-thread problem 332f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 333f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) typedef int (* Func)(const void *, const void *); 334f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 335f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) Func fn; 336f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) void * base; //Start of target array. 337f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t num; //Array size in elements. 338f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t width; //Element size in bytes. 339f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 340f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) void * backup; //copy source of base 341f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)public: 342f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) CmdQsort(UErrorCode & status,void *theBase, int32_t num, int32_t width, Func fn, int32_t,int32_t) 343f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) :backup(theBase),num(num),width(width),fn(fn){ 344f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) base = malloc(num * width); 345f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) time_empty(100, &status); // warm memory/cache 346f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 347f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 348f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ~CmdQsort(){ 349f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) free(base); 350f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 351f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 352f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) void empty_call(){ 353f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) exec_count = 0; 354f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) memcpy(base, backup, num * width); 355f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 356f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 357f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) double time_empty(int32_t n, UErrorCode* status) { 358f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UTimer start, stop; 359f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) utimer_getTime(&start); 360f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) while (n-- > 0) { 361f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) empty_call(); 362f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 363f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) utimer_getTime(&stop); 364f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return utimer_getDeltaSeconds(&start,&stop); // ms 365f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 366f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 367f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) virtual void call(UErrorCode* status){ 368f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) exec_count = 0; 369f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) memcpy(base, backup, num * width); 370f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) qsort(base, num, width, fn); 371f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 372f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) virtual double time(int32_t n, UErrorCode* status) { 373f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) double t1 = time_empty(n,status); 374f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) double t2 = UPerfFunction::time(n, status); 375f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return t2-t1;// < 0 ? t2 : t2-t1; 376f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 377f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 378f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) virtual long getOperationsPerIteration(){ return exec_count?exec_count:1;} 379f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}; 380f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)int32_t CmdQsort::exec_count; 381f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 382f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 383f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)class CmdBinSearch : public UPerfFunction{ 384f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)public: 385f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) typedef int (CmdBinSearch::* Func)(int, int); 386f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 387f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UCollator * col; 388f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) DWORD win_langid; 389f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t count; 390f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) DataIndex * rnd; 391f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) DataIndex * ord; 392f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) Func fn; 393f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t exec_count; 394f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 395f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) CmdBinSearch(UErrorCode, UCollator * col,DWORD win_langid,int32_t count,DataIndex * rnd,DataIndex * ord,Func fn) 396f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) :col(col),win_langid(win_langid), count(count), rnd(rnd), ord(ord), fn(fn),exec_count(0){} 397f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 398f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 399f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) virtual void call(UErrorCode* status){ 400f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) exec_count = 0; 401f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) for(int32_t i = 0; i< count; i++){ // search all data 402f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) binary_search(i); 403f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 404f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 405f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) virtual long getOperationsPerIteration(){ return exec_count?exec_count:1;} 406f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 407f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) void binary_search(int32_t random) { 408f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int low = 0; 409f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int high = count - 1; 410f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int guess; 411f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int last_guess = -1; 412f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int r; 413f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) while (TRUE) { 414f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) guess = (high + low)/2; 415f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (last_guess == guess) break; // nothing to search 416f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 417f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) r = (this->*fn)(random, guess); 418f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) exec_count++; 419f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 420f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (r == 0) 421f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; // found, search end. 422f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (r < 0) { 423f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) high = guess; 424f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else { 425f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) low = guess; 426f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 427f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) last_guess = guess; 428f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 429f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 430f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 431f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int icu_strcoll_null(int32_t i, int32_t j){ 432f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return ucol_strcoll(col, rnd[i].icu_data, -1, ord[j].icu_data,-1); 433f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 434f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 435f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int icu_strcoll_len(int32_t i, int32_t j){ 436f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return ucol_strcoll(col, rnd[i].icu_data, rnd[i].icu_data_len, ord[j].icu_data, ord[j].icu_data_len); 437f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 438f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 439f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int icu_cmpkey(int32_t i, int32_t j) { 440f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return strcmp( (char *) rnd[i].icu_key, (char *) ord[j].icu_key ); 441f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 442f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 443f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int win_cmp_null(int32_t i, int32_t j) { 444f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int t = CompareStringW(win_langid, 0, rnd[i].win_data, -1, ord[j].win_data, -1); 445f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (t == 0){ 446f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fprintf(stderr, "CompareStringW error, error number %x\n", GetLastError()); 447f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) exit(-1); 448f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else{ 449f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return t - CSTR_EQUAL; 450f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 451f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 452f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 453f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int win_cmp_len(int32_t i, int32_t j) { 454f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int t = CompareStringW(win_langid, 0, rnd[i].win_data, rnd[i].win_data_len, ord[j].win_data, ord[j].win_data_len); 455f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (t == 0){ 456f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fprintf(stderr, "CompareStringW error, error number %x\n", GetLastError()); 457f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) exit(-1); 458f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else{ 459f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return t - CSTR_EQUAL; 460f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 461f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 462f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 463f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define BFUNC(name, func, data) \ 464f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int name(int32_t i, int32_t j) { \ 465f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return func(rnd[i].data, ord[j].data); \ 466f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 467f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 468f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) BFUNC(posix_strcoll_null, strcoll, posix_data) 469f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) BFUNC(posix_cmpkey, strcmp, posix_key) 470f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) BFUNC(win_cmpkey, strcmp, win_key) 471f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) BFUNC(win_wcscmp, wcscmp, win_data) 472f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) BFUNC(icu_strcmp, u_strcmp, icu_data) 473f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) BFUNC(icu_cmpcpo, u_strcmpCodePointOrder, icu_data) 474f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}; 475f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 476f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)class CollPerfTest : public UPerfTest { 477f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)public: 478f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UCollator * col; 479f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) DWORD win_langid; 480f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 481f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UChar * icu_data_all; 482f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t icu_data_all_len; 483f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 484f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t count; 485f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) CA_uchar * icu_data; 486f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) CA_uint8 * icu_key; 487f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) CA_char * posix_data; 488f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) CA_char * posix_key; 489f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) CA_win_wchar * win_data; 490f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) CA_char * win_key; 491f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 492f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) DataIndex * rnd_index; // random by icu key 493f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) DataIndex * ord_win_data; 494f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) DataIndex * ord_win_key; 495f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) DataIndex * ord_posix_data; 496f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) DataIndex * ord_posix_key; 497f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) DataIndex * ord_icu_data; 498f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) DataIndex * ord_icu_key; 499f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) DataIndex * ord_win_wcscmp; 500f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) DataIndex * ord_icu_strcmp; 501f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) DataIndex * ord_icu_cmpcpo; 502f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 503f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) virtual ~CollPerfTest(){ 504f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucol_close(col); 505f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) delete [] icu_data_all; 506f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) delete icu_data; 507f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) delete icu_key; 508f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) delete posix_data; 509f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) delete posix_key; 510f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) delete win_data; 511f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) delete win_key; 512f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) delete[] rnd_index; 513f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) delete[] ord_win_data; 514f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) delete[] ord_win_key; 515f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) delete[] ord_posix_data; 516f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) delete[] ord_posix_key; 517f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) delete[] ord_icu_data; 518f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) delete[] ord_icu_key; 519f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) delete[] ord_win_wcscmp; 520f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) delete[] ord_icu_strcmp; 521f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) delete[] ord_icu_cmpcpo; 522f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 523f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 524f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) CollPerfTest(int32_t argc, const char* argv[], UErrorCode& status):UPerfTest(argc, argv, status){ 525f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) col = NULL; 526f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) icu_data_all = NULL; 527f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) icu_data = NULL; 528f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) icu_key = NULL; 529f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) posix_data = NULL; 530f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) posix_key = NULL; 531f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) win_data =NULL; 532f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) win_key = NULL; 533f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 534f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) rnd_index = NULL; 535f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ord_win_data= NULL; 536f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ord_win_key= NULL; 537f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ord_posix_data= NULL; 538f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ord_posix_key= NULL; 539f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ord_icu_data= NULL; 540f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ord_icu_key= NULL; 541f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ord_win_wcscmp = NULL; 542f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ord_icu_strcmp = NULL; 543f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ord_icu_cmpcpo = NULL; 544f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 545f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_FAILURE(status)){ 546f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; 547f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 548f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 549f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Parse additional arguments 550f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 551f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UOption options[] = { 552f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UOPTION_DEF("langid", 'i', UOPT_REQUIRES_ARG), // Windows Language ID number. 553f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UOPTION_DEF("rulefile", 'r', UOPT_REQUIRES_ARG), // --rulefile <filename> 554f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Collation related arguments. All are optional. 555f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // To simplify parsing, two choice arguments are disigned as NO_ARG. 556f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // The default value is UPPER word in the comment 557f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UOPTION_DEF("c_french", 'f', UOPT_NO_ARG), // --french <on | OFF> 558f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UOPTION_DEF("c_alternate", 'a', UOPT_NO_ARG), // --alternate <NON_IGNORE | shifted> 559f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UOPTION_DEF("c_casefirst", 'c', UOPT_REQUIRES_ARG), // --casefirst <lower | upper | OFF> 560f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UOPTION_DEF("c_caselevel", 'l', UOPT_NO_ARG), // --caselevel <on | OFF> 561f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UOPTION_DEF("c_normal", 'n', UOPT_NO_ARG), // --normal <on | OFF> 562f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UOPTION_DEF("c_strength", 's', UOPT_REQUIRES_ARG), // --strength <1-5> 563f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) }; 564f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t opt_len = (sizeof(options)/sizeof(options[0])); 565f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) enum {i, r,f,a,c,l,n,s}; // The buffer between the option items' order and their references 566f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 567f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) _remainingArgc = u_parseArgs(_remainingArgc, (char**)argv, opt_len, options); 568f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 569f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (_remainingArgc < 0){ 570f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) status = U_ILLEGAL_ARGUMENT_ERROR; 571f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; 572f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 573f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 574f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (locale == NULL){ 575f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) locale = "en_US"; // set default locale 576f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 577f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 578f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) //#ifdef U_WINDOWS 579f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (options[i].doesOccur) { 580f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) char *endp; 581f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int tmp = strtol(options[i].value, &endp, 0); 582f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (endp == options[i].value) { 583f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) status = U_ILLEGAL_ARGUMENT_ERROR; 584f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; 585f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 586f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) win_langid = MAKELCID(tmp, SORT_DEFAULT); 587f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else { 588f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) win_langid = uloc_getLCID(locale); 589f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 590f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) //#endif 591f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 592f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Set up an ICU collator 593f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (options[r].doesOccur) { 594f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // TODO: implement it 595f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else { 596f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) col = ucol_open(locale, &status); 597f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_FAILURE(status)) { 598f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; 599f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 600f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 601f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 602f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (options[f].doesOccur) { 603f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucol_setAttribute(col, UCOL_FRENCH_COLLATION, UCOL_ON, &status); 604f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else { 605f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucol_setAttribute(col, UCOL_FRENCH_COLLATION, UCOL_OFF, &status); 606f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 607f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 608f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (options[a].doesOccur) { 609f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucol_setAttribute(col, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, &status); 610f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 611f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 612f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (options[c].doesOccur) { // strcmp() has i18n encoding problem 613f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (strcmp("lower", options[c].value) == 0){ 614f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucol_setAttribute(col, UCOL_CASE_FIRST, UCOL_LOWER_FIRST, &status); 615f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else if (strcmp("upper", options[c].value) == 0) { 616f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucol_setAttribute(col, UCOL_CASE_FIRST, UCOL_UPPER_FIRST, &status); 617f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else { 618f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) status = U_ILLEGAL_ARGUMENT_ERROR; 619f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; 620f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 621f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 622f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 623f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (options[l].doesOccur){ 624f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucol_setAttribute(col, UCOL_CASE_LEVEL, UCOL_ON, &status); 625f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 626f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 627f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (options[n].doesOccur){ 628f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucol_setAttribute(col, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); 629f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 630f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 631f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (options[s].doesOccur) { 632f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) char *endp; 633f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int tmp = strtol(options[l].value, &endp, 0); 634f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (endp == options[l].value) { 635f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) status = U_ILLEGAL_ARGUMENT_ERROR; 636f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; 637f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 638f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) switch (tmp) { 639f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) case 1: ucol_setAttribute(col, UCOL_STRENGTH, UCOL_PRIMARY, &status); break; 640f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) case 2: ucol_setAttribute(col, UCOL_STRENGTH, UCOL_SECONDARY, &status); break; 641f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) case 3: ucol_setAttribute(col, UCOL_STRENGTH, UCOL_TERTIARY, &status); break; 642f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) case 4: ucol_setAttribute(col, UCOL_STRENGTH, UCOL_QUATERNARY, &status); break; 643f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) case 5: ucol_setAttribute(col, UCOL_STRENGTH, UCOL_IDENTICAL, &status); break; 644f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) default: status = U_ILLEGAL_ARGUMENT_ERROR; return; 645f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 646f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 647f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) prepareData(status); 648f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 649f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 650f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) //to avoid use the annoying 'id' in TESTCASE(id,test) macro or the like 651f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define TEST(testname, classname, arg1, arg2, arg3, arg4, arg5, arg6) \ 652f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(temp == index) {\ 653f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) name = #testname;\ 654f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (exec) {\ 655f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UErrorCode status = U_ZERO_ERROR;\ 656f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UPerfFunction * t = new classname(status,arg1, arg2, arg3, arg4, arg5, arg6);\ 657f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_FAILURE(status)) {\ 658f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) delete t;\ 659f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return NULL;\ 660f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else {\ 661f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return t;\ 662f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) }\ 663f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else {\ 664f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return NULL;\ 665f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) }\ 666f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) }\ 667f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) temp++\ 668f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 669f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 670f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) virtual UPerfFunction* runIndexedTest( /*[in]*/int32_t index, /*[in]*/UBool exec, /*[out]*/const char* &name, /*[in]*/ char* par = NULL ){ 671f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int temp = 0; 672f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 673f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define TEST_KEYGEN(testname, func)\ 674f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST(testname, CmdKeyGen, col, win_langid, count, rnd_index, &CmdKeyGen::func, 0) 675f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_KEYGEN(TestIcu_KeyGen_null, icu_key_null); 676f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_KEYGEN(TestIcu_KeyGen_len, icu_key_len); 677f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_KEYGEN(TestPosix_KeyGen_null, posix_key_null); 678f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_KEYGEN(TestWin_KeyGen_null, win_key_null); 679f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_KEYGEN(TestWin_KeyGen_len, win_key_len); 680f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 681f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define TEST_ITER(testname, func)\ 682f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST(testname, CmdIter, col, count, icu_data, &CmdIter::func,0,0) 683f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_ITER(TestIcu_ForwardIter_null, icu_forward_null); 684f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_ITER(TestIcu_ForwardIter_len, icu_forward_len); 685f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_ITER(TestIcu_BackwardIter_null, icu_backward_null); 686f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_ITER(TestIcu_BackwardIter_len, icu_backward_len); 687f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 688f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define TEST_ITER_ALL(testname, func)\ 689f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST(testname, CmdIterAll, col, icu_data_all_len, icu_data_all, CmdIterAll::func,0,0) 690f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_ITER_ALL(TestIcu_ForwardIter_all_null, forward_null); 691f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_ITER_ALL(TestIcu_ForwardIter_all_len, forward_len); 692f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_ITER_ALL(TestIcu_BackwardIter_all_null, backward_null); 693f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_ITER_ALL(TestIcu_BackwardIter_all_len, backward_len); 694f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 695f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define TEST_QSORT(testname, func)\ 696f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST(testname, CmdQsort, rnd_index, count, sizeof(DataIndex), CmdQsort::func,0,0) 697f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_QSORT(TestIcu_qsort_strcoll_null, icu_strcoll_null); 698f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_QSORT(TestIcu_qsort_strcoll_len, icu_strcoll_len); 699f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_QSORT(TestIcu_qsort_usekey, icu_cmpkey); 700f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_QSORT(TestPosix_qsort_strcoll_null, posix_strcoll_null); 701f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_QSORT(TestPosix_qsort_usekey, posix_cmpkey); 702f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_QSORT(TestWin_qsort_CompareStringW_null, win_cmp_null); 703f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_QSORT(TestWin_qsort_CompareStringW_len, win_cmp_len); 704f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_QSORT(TestWin_qsort_usekey, win_cmpkey); 705f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 706f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define TEST_BIN(testname, func)\ 707f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST(testname, CmdBinSearch, col, win_langid, count, rnd_index, ord_icu_key, &CmdBinSearch::func) 708f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_BIN(TestIcu_BinarySearch_strcoll_null, icu_strcoll_null); 709f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_BIN(TestIcu_BinarySearch_strcoll_len, icu_strcoll_len); 710f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_BIN(TestIcu_BinarySearch_usekey, icu_cmpkey); 711f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_BIN(TestIcu_BinarySearch_strcmp, icu_strcmp); 712f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_BIN(TestIcu_BinarySearch_cmpCPO, icu_cmpcpo); 713f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_BIN(TestPosix_BinarySearch_strcoll_null, posix_strcoll_null); 714f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_BIN(TestPosix_BinarySearch_usekey, posix_cmpkey); 715f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_BIN(TestWin_BinarySearch_CompareStringW_null, win_cmp_null); 716f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_BIN(TestWin_BinarySearch_CompareStringW_len, win_cmp_len); 717f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_BIN(TestWin_BinarySearch_usekey, win_cmpkey); 718f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) TEST_BIN(TestWin_BinarySearch_wcscmp, win_wcscmp); 719f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 720f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) name=""; 721f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return NULL; 722f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 723f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 724f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 725f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 726f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) void prepareData(UErrorCode& status){ 727f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(U_FAILURE(status)) return; 728f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (icu_data) return; // prepared 729f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 730f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) icu_data = new CA_uchar(); 731f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 732f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Following code is borrowed from UPerfTest::getLines(); 733f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) const UChar* line=NULL; 734f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t len =0; 735f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) for (;;) { 736f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) line = ucbuf_readline(ucharBuf,&len,&status); 737f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(line == NULL || U_FAILURE(status)){break;} 738f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 739f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Refer to the source code of ucbuf_readline() 740f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 1. 'len' includs the line terminal symbols 741f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 2. The length of the line terminal symbols is only one character 742f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 3. The Windows CR LF line terminal symbols will be converted to CR 743f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 744f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (len == 1) { 745f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) continue; //skip empty line 746f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else { 747f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) icu_data->append_one(len); 748f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) memcpy(icu_data->last(), line, len * sizeof(UChar)); 749f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) icu_data->last()[len -1] = NULL; 750f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 751f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 752f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(U_FAILURE(status)) return; 753f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 754f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // UTF-16 -> UTF-8 conversion. 755f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UConverter *conv = ucnv_open("utf-8", &status); // just UTF-8 for now. 756f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_FAILURE(status)) return; 757f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 758f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) count = icu_data->count; 759f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 760f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) icu_data_all_len = icu_data->index[count]; // includes all NULLs 761f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) icu_data_all_len -= count; // excludes all NULLs 762f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) icu_data_all_len += 1; // the terminal NULL 763f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) icu_data_all = new UChar[icu_data_all_len]; 764f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) icu_data_all[icu_data_all_len - 1] = 0; //the terminal NULL 765f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 766f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) icu_key = new CA_uint8; 767f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) win_data = new CA_win_wchar; 768f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) win_key = new CA_char; 769f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) posix_data = new CA_char; 770f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) posix_key = new CA_char; 771f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) rnd_index = new DataIndex[count]; 772f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) DataIndex::win_langid = win_langid; 773f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) DataIndex::col = col; 774f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 775f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 776f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UChar * p = icu_data_all; 777f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t s; 778f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t t; 779f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) for (int i=0; i < count; i++) { 780f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // ICU all data 781f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) s = sizeof(UChar) * icu_data->lengthOf(i); 782f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) memcpy(p, icu_data->dataOf(i), s); 783f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) p += icu_data->lengthOf(i); 784f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 785f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // ICU data 786f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 787f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // ICU key 788f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) s = ucol_getSortKey(col, icu_data->dataOf(i), -1,NULL, 0); 789f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) icu_key->append_one(s); 790f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) t = ucol_getSortKey(col, icu_data->dataOf(i), -1,icu_key->last(), s); 791f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (t != s) {status = U_INVALID_FORMAT_ERROR;return;} 792f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 793f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // POSIX data 794f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) s = ucnv_fromUChars(conv,NULL, 0, icu_data->dataOf(i), icu_data->lengthOf(i), &status); 795f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (status == U_BUFFER_OVERFLOW_ERROR || status == U_ZERO_ERROR){ 796f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) status = U_ZERO_ERROR; 797f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else { 798f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; 799f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 800f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) posix_data->append_one(s + 1); // plus terminal NULL 801f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) t = ucnv_fromUChars(conv,posix_data->last(), s, icu_data->dataOf(i), icu_data->lengthOf(i), &status); 802f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_FAILURE(status)) return; 803f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if ( t != s){status = U_INVALID_FORMAT_ERROR;return;} 804f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) posix_data->last()[s] = 0; 805f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 806f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // POSIX key 807f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) s = strxfrm(NULL, posix_data->dataOf(i), 0); 808f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (s == INT_MAX){status = U_INVALID_FORMAT_ERROR;return;} 809f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) posix_key->append_one(s); 810f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) t = strxfrm(posix_key->last(), posix_data->dataOf(i), s); 811f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (t != s) {status = U_INVALID_FORMAT_ERROR;return;} 812f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 813f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Win data 814f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) s = icu_data->lengthOf(i) + 1; // plus terminal NULL 815f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) win_data->append_one(s); 816f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) memcpy(win_data->last(), icu_data->dataOf(i), sizeof(WCHAR) * s); 817f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 818f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Win key 819f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) s = LCMapStringW(win_langid, LCMAP_SORTKEY, win_data->dataOf(i), win_data->lengthOf(i), NULL,0); 820f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (s == 0) {status = U_INVALID_FORMAT_ERROR;return;} 821f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) win_key->append_one(s); 822f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) t = LCMapStringW(win_langid, LCMAP_SORTKEY, win_data->dataOf(i), win_data->lengthOf(i), (WCHAR *)(win_key->last()),s); 823f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (t != s) {status = U_INVALID_FORMAT_ERROR;return;} 824f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 825f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) }; 826f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 827f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // append_one() will make points shifting, should not merge following code into previous iteration 828f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) for (int i=0; i < count; i++) { 829f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) rnd_index[i].icu_key = icu_key->dataOf(i); 830f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) rnd_index[i].icu_data = icu_data->dataOf(i); 831f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) rnd_index[i].icu_data_len = icu_data->lengthOf(i); 832f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) rnd_index[i].posix_key = posix_key->last(); 833f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) rnd_index[i].posix_data = posix_data->dataOf(i); 834f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) rnd_index[i].posix_data_len = posix_data->lengthOf(i); 835f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) rnd_index[i].win_key = win_key->dataOf(i); 836f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) rnd_index[i].win_data = win_data->dataOf(i); 837f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) rnd_index[i].win_data_len = win_data->lengthOf(i); 838f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) }; 839f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 840f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucnv_close(conv); 841f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) qsort(rnd_index, count, sizeof(DataIndex), CmdQsort::q_random); 842f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 843f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define SORT(data, func) \ 844f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) data = new DataIndex[count];\ 845f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) memcpy(data, rnd_index, count * sizeof(DataIndex));\ 846f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) qsort(data, count, sizeof(DataIndex), CmdQsort::func) 847f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 848f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) SORT(ord_icu_data, icu_strcoll_len); 849f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) SORT(ord_icu_key, icu_cmpkey); 850f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) SORT(ord_posix_data, posix_strcoll_null); 851f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) SORT(ord_posix_key, posix_cmpkey); 852f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) SORT(ord_win_data, win_cmp_len); 853f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) SORT(ord_win_key, win_cmpkey); 854f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) SORT(ord_win_wcscmp, win_wcscmp); 855f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) SORT(ord_icu_strcmp, icu_strcmp); 856f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) SORT(ord_icu_cmpcpo, icu_cmpcpo); 857f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 858f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}; 859f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 860f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 861f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)int main(int argc, const char *argv[]) 862f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 863f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 864f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UErrorCode status = U_ZERO_ERROR; 865f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) CollPerfTest test(argc, argv, status); 866f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 867f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_FAILURE(status)){ 868f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) printf("The error is %s\n", u_errorName(status)); 869f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) //TODO: print usage here 870f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return status; 871f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 872f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 873f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (test.run() == FALSE){ 874f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fprintf(stderr, "FAILED: Tests could not be run please check the " 875f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) "arguments.\n"); 876f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return -1; 877f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 878f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return 0; 879f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 880f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 881