strsrchperf.h revision 85bf2e2fbc60a9f938064abc8127d61da7d19882
185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/********************************************************************
285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * COPYRIGHT:
385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * Copyright (C) 2008-2009 IBM, Inc.   All Rights Reserved.
485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *
585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ********************************************************************/
685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifndef _STRSRCHPERF_H
785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define _STRSRCHPERF_H
885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "unicode/ubrk.h"
1085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "unicode/usearch.h"
1185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "unicode/colldata.h"
1285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "unicode/bmsearch.h"
1385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "unicode/uperf.h"
1485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include <stdlib.h>
1585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include <stdio.h>
1685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define TEST_BOYER_MOORE_SEARCH
1885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef TEST_BOYER_MOORE_SEARCH
2085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hotypedef void (*StrSrchFn) (BoyerMooreSearch * bms, const UChar *src, int32_t srcLen, const UChar *pttrn, int32_t pttrnLen, UErrorCode *status);
2185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#else
2285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hotypedef void (*StrSrchFn)(UStringSearch* srch, const UChar* src,int32_t srcLen, const UChar* pttrn, int32_t pttrnLen, UErrorCode* status);
2385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif
2485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
2585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoclass StringSearchPerfFunction : public UPerfFunction {
2685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoprivate:
2785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    StrSrchFn fn;
2885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    const UChar* src;
2985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t srcLen;
3085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    const UChar* pttrn;
3185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t pttrnLen;
3285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef TEST_BOYER_MOORE_SEARCH
3385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    BoyerMooreSearch *bms;
3485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#else
3585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UStringSearch* srch;
3685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif
3785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
3885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hopublic:
3985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    virtual void call(UErrorCode* status) {
4085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef TEST_BOYER_MOORE_SEARCH
4185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        (*fn)(bms, src, srcLen, pttrn, pttrnLen, status);
4285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#else
4385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        (*fn)(srch, src, srcLen, pttrn, pttrnLen, status);
4485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif
4585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
4685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
4785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    virtual long getOperationsPerIteration() {
4885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#if 0
4985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return (long)(srcLen/pttrnLen);
5085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#else
5185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return (long) srcLen;
5285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif
5385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
5485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
5585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef TEST_BOYER_MOORE_SEARCH
5685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    StringSearchPerfFunction(StrSrchFn func, BoyerMooreSearch *search, const UChar *source, int32_t sourceLen, const UChar *pattern, int32_t patternLen) {
5785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        fn       = func;
5885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        src      = source;
5985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        srcLen   = sourceLen;
6085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        pttrn    = pattern;
6185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        pttrnLen = patternLen;
6285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        bms      = search;
6385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
6485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#else
6585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    StringSearchPerfFunction(StrSrchFn func, UStringSearch* search, const UChar* source,int32_t sourceLen, const UChar* pattern, int32_t patternLen) {
6685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        fn = func;
6785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        src = source;
6885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        srcLen = sourceLen;
6985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        pttrn = pattern;
7085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        pttrnLen = patternLen;
7185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        srch = search;
7285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
7385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif
7485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho};
7585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
7685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoclass StringSearchPerformanceTest : public UPerfTest {
7785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoprivate:
7885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    const UChar* src;
7985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t srcLen;
8085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar* pttrn;
8185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t pttrnLen;
8285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef TEST_BOYER_MOORE_SEARCH
8385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UnicodeString *targetString;
8485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    BoyerMooreSearch *bms;
8585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#else
8685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UStringSearch* srch;
8785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif
8885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
8985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hopublic:
9085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    StringSearchPerformanceTest(int32_t argc, const char *argv[], UErrorCode &status);
9185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ~StringSearchPerformanceTest();
9285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    virtual UPerfFunction* runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = NULL);
9385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
9485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UPerfFunction* Test_ICU_Forward_Search();
9585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
9685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UPerfFunction* Test_ICU_Backward_Search();
9785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho};
9885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
9985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
10085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef TEST_BOYER_MOORE_SEARCH
10185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hovoid ICUForwardSearch(BoyerMooreSearch *bms, const UChar *source, int32_t sourceLen, const UChar *pattern, int32_t patternLen, UErrorCode * /*status*/) {
10285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t offset = 0, start = -1, end = -1;
10385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
10485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    while (bms->search(offset, start, end)) {
10585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        offset = end;
10685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
10785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
10885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
10985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hovoid ICUBackwardSearch(BoyerMooreSearch *bms, const UChar *source, int32_t sourceLen, const UChar *pattern, int32_t patternLen, UErrorCode * /*status*/) {
11085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t offset = 0, start = -1, end = -1;
11185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
11285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* NOTE: No Boyer-Moore backward search yet... */
11385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    while (bms->search(offset, start, end)) {
11485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        offset = end;
11585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
11685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
11785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#else
11885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hovoid ICUForwardSearch(UStringSearch *srch, const UChar* source, int32_t sourceLen, const UChar* pattern, int32_t patternLen, UErrorCode* status) {
11985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t match;
12085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
12185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    match = usearch_first(srch, status);
12285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    while (match != USEARCH_DONE) {
12385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        match = usearch_next(srch, status);
12485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
12585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
12685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
12785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hovoid ICUBackwardSearch(UStringSearch *srch, const UChar* source, int32_t sourceLen, const UChar* pattern, int32_t patternLen, UErrorCode* status) {
12885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t match;
12985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
13085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    match = usearch_last(srch, status);
13185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    while (match != USEARCH_DONE) {
13285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        match = usearch_previous(srch, status);
13385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
13485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
13585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif
13685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
13785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif /* _STRSRCHPERF_H */
138