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