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