185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/*
285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho **********************************************************************
385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *   Copyright (C) 2002-2008, International Business Machines
485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *   Corporation and others.  All Rights Reserved.
585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho **********************************************************************
685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *  file name:  utrie2perf.cpp
785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *  encoding:   US-ASCII
885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *  tab size:   8 (not used)
985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *  indentation:4
1085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *
1185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *  created on: 2008sep07
1285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *  created by: Markus W. Scherer
1385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *
1485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *  Performance test program for UTrie2.
1585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */
1685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include <stdio.h>
1885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include <stdlib.h>
1985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "unicode/uchar.h"
2085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "unicode/unorm.h"
2185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "unicode/uperf.h"
2285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "uoptions.h"
2385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
2485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
2585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
2685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#if 0
2785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho// Left over from when icu/branches/markus/utf8 could use both old UTrie
2885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho// and new UTrie2, switched with #if in unorm.cpp and ubidi_props.c.
2985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho// Comparative benchmarks were done in that branch on revision r24630
3085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho// and earlier.
3185bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoU_CAPI void U_EXPORT2
3285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hounorm_initUTrie2(UErrorCode *pErrorCode);
3385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
3485bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoU_CAPI void U_EXPORT2
3585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Houbidi_initUTrie2(UErrorCode *pErrorCode);
3685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif
3785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
3885bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoU_NAMESPACE_BEGIN
3985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
4085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoclass UnicodeSet;
4185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
4285bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoU_NAMESPACE_END
4385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
4485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho// Test object.
4585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoclass UTrie2PerfTest : public UPerfTest {
4685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hopublic:
4785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UTrie2PerfTest(int32_t argc, const char *argv[], UErrorCode &status)
4885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            : UPerfTest(argc, argv, NULL, 0, "", status),
4985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho              utf8(NULL), utf8Length(0), countInputCodePoints(0) {
5085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if (U_SUCCESS(status)) {
5185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#if 0       // See comment at unorm_initUTrie2() forward declaration.
5285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            unorm_initUTrie2(&status);
5385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            ubidi_initUTrie2(&status);
5485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif
5585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            int32_t inputLength;
5685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            UPerfTest::getBuffer(inputLength, status);
5785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            if(U_SUCCESS(status) && inputLength>0) {
5885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                countInputCodePoints = u_countChar32(buffer, bufferLen);
5985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
6085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                // Preflight the UTF-8 length and allocate utf8.
6185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                u_strToUTF8(NULL, 0, &utf8Length, buffer, bufferLen, &status);
6285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                if(status==U_BUFFER_OVERFLOW_ERROR) {
6385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    utf8=(char *)malloc(utf8Length);
6485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    if(utf8!=NULL) {
6585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                        status=U_ZERO_ERROR;
6685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                        u_strToUTF8(utf8, utf8Length, NULL, buffer, bufferLen, &status);
6785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    } else {
6885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                        status=U_MEMORY_ALLOCATION_ERROR;
6985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    }
7085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                }
7185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
7285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                if(verbose) {
7385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    printf("code points:%ld  len16:%ld  len8:%ld  "
7485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                           "B/cp:%.3g\n",
7585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                           (long)countInputCodePoints, (long)bufferLen, (long)utf8Length,
7685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                           (double)utf8Length/countInputCodePoints);
7785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                }
7885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            }
7985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
8085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
8185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
8285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    virtual UPerfFunction* runIndexedTest(int32_t index, UBool exec, const char* &name, char* par = NULL);
8385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
8485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    const UChar *getBuffer() const { return buffer; }
8585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t getBufferLen() const { return bufferLen; }
8685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
8785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    char *utf8;
8885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t utf8Length;
8985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
9085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    // Number of code points in the input text.
9185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t countInputCodePoints;
9285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho};
9385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
9485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho// Performance test function object.
9585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoclass Command : public UPerfFunction {
9685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoprotected:
9785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    Command(const UTrie2PerfTest &testcase) : testcase(testcase) {}
9885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
9985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hopublic:
10085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    virtual ~Command() {}
10185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
10285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    // virtual void call(UErrorCode* pErrorCode) { ... }
10385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
10485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    virtual long getOperationsPerIteration() {
10585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        // Number of code points tested.
10685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return testcase.countInputCodePoints;
10785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
10885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
10985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    // virtual long getEventsPerIteration();
11085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
11185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    const UTrie2PerfTest &testcase;
11285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UNormalizationCheckResult qcResult;
11385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho};
11485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
11585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoclass CheckFCD : public Command {
11685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoprotected:
11785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    CheckFCD(const UTrie2PerfTest &testcase) : Command(testcase) {}
11885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hopublic:
11985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    static UPerfFunction* get(const UTrie2PerfTest &testcase) {
12085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return new CheckFCD(testcase);
12185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
12285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    virtual void call(UErrorCode* pErrorCode) {
12385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        UErrorCode errorCode=U_ZERO_ERROR;
12485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        qcResult=unorm_quickCheck(testcase.getBuffer(), testcase.getBufferLen(),
12585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                                  UNORM_FCD, &errorCode);
12685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if(U_FAILURE(errorCode)) {
12785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            fprintf(stderr, "error: unorm_quickCheck(UNORM_FCD) failed: %s\n",
12885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    u_errorName(errorCode));
12985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
13085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
13185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho};
13285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
13385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#if 0  // See comment at unorm_initUTrie2() forward declaration.
13485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
13585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoclass CheckFCDAlwaysGet : public Command {
13685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoprotected:
13785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    CheckFCDAlwaysGet(const UTrie2PerfTest &testcase) : Command(testcase) {}
13885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hopublic:
13985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    static UPerfFunction* get(const UTrie2PerfTest &testcase) {
14085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return new CheckFCDAlwaysGet(testcase);
14185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
14285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    virtual void call(UErrorCode* pErrorCode) {
14385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        UErrorCode errorCode=U_ZERO_ERROR;
14485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        qcResult=unorm_quickCheck(testcase.getBuffer(), testcase.getBufferLen(),
14585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                                  UNORM_FCD_ALWAYS_GET, &errorCode);
14685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if(U_FAILURE(errorCode)) {
14785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            fprintf(stderr, "error: unorm_quickCheck(UNORM_FCD) failed: %s\n",
14885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    u_errorName(errorCode));
14985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
15085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
15185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho};
15285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
15385bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoU_CAPI UBool U_EXPORT2
15485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hounorm_checkFCDUTF8(const uint8_t *src, int32_t srcLength, const UnicodeSet *nx);
15585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
15685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoclass CheckFCDUTF8 : public Command {
15785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoprotected:
15885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    CheckFCDUTF8(const UTrie2PerfTest &testcase) : Command(testcase) {}
15985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hopublic:
16085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    static UPerfFunction* get(const UTrie2PerfTest &testcase) {
16185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return new CheckFCDUTF8(testcase);
16285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
16385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    virtual void call(UErrorCode* pErrorCode) {
16485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        UBool isFCD=unorm_checkFCDUTF8((const uint8_t *)testcase.utf8, testcase.utf8Length, NULL);
16585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if(isFCD>1) {
16685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            fprintf(stderr, "error: bogus result from unorm_checkFCDUTF8()\n");
16785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
16885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
16985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho};
17085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
17185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif
17285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
17385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoclass ToNFC : public Command {
17485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoprotected:
17585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ToNFC(const UTrie2PerfTest &testcase) : Command(testcase) {
17685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        UErrorCode errorCode=U_ZERO_ERROR;
17785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        destCapacity=unorm_normalize(testcase.getBuffer(), testcase.getBufferLen(),
17885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                                     UNORM_NFC, 0,
17985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                                     NULL, 0,
18085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                                     &errorCode);
18185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        dest=new UChar[destCapacity];
18285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
18385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ~ToNFC() {
18485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        delete [] dest;
18585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
18685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hopublic:
18785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    static UPerfFunction* get(const UTrie2PerfTest &testcase) {
18885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return new ToNFC(testcase);
18985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
19085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    virtual void call(UErrorCode* pErrorCode) {
19185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        UErrorCode errorCode=U_ZERO_ERROR;
19285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        int32_t destLength=unorm_normalize(testcase.getBuffer(), testcase.getBufferLen(),
19385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                                           UNORM_NFC, 0,
19485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                                           dest, destCapacity,
19585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                                           &errorCode);
19685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if(U_FAILURE(errorCode) || destLength!=destCapacity) {
19785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            fprintf(stderr, "error: unorm_normalize(UNORM_NFC) failed: %s\n",
19885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    u_errorName(errorCode));
19985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
20085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
20185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
20285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoprivate:
20385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar *dest;
20485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t destCapacity;
20585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho};
20685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
20785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoclass GetBiDiClass : public Command {
20885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoprotected:
20985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    GetBiDiClass(const UTrie2PerfTest &testcase) : Command(testcase) {}
21085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hopublic:
21185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    static UPerfFunction* get(const UTrie2PerfTest &testcase) {
21285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return new GetBiDiClass(testcase);
21385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
21485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    virtual void call(UErrorCode* pErrorCode) {
21585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        const UChar *buffer=testcase.getBuffer();
21685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        int32_t length=testcase.getBufferLen();
21785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        UChar32 c;
21885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        int32_t i;
21985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        uint32_t bitSet=0;
22085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        for(i=0; i<length;) {
22185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            U16_NEXT(buffer, i, length, c);
22285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            bitSet|=(uint32_t)1<<u_charDirection(c);
22385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
22485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if(length>0 && bitSet==0) {
22585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            fprintf(stderr, "error: GetBiDiClass() did not collect bits\n");
22685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
22785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
22885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho};
22985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
23085bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoUPerfFunction* UTrie2PerfTest::runIndexedTest(int32_t index, UBool exec, const char* &name, char* par) {
23185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    switch (index) {
23285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        case 0: name = "CheckFCD";              if (exec) return CheckFCD::get(*this); break;
23385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        case 1: name = "ToNFC";                 if (exec) return ToNFC::get(*this); break;
23485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        case 2: name = "GetBiDiClass";          if (exec) return GetBiDiClass::get(*this); break;
23585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#if 0  // See comment at unorm_initUTrie2() forward declaration.
23685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        case 3: name = "CheckFCDAlwaysGet";     if (exec) return CheckFCDAlwaysGet::get(*this); break;
23785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        case 4: name = "CheckFCDUTF8";          if (exec) return CheckFCDUTF8::get(*this); break;
23885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif
23985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        default: name = ""; break;
24085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
24185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    return NULL;
24285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
24385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
24485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoint main(int argc, const char *argv[]) {
24585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UErrorCode status = U_ZERO_ERROR;
24685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UTrie2PerfTest test(argc, argv, status);
24785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
24885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho	if (U_FAILURE(status)){
24985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        printf("The error is %s\n", u_errorName(status));
25085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        test.usage();
25185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return status;
25285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
25385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
25485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (test.run() == FALSE){
25585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        fprintf(stderr, "FAILED: Tests could not be run please check the "
25685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho			            "arguments.\n");
25785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return -1;
25885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
25985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
26085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    return 0;
26185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
262