1 /********************************************************************
2 * COPYRIGHT:
3 * Copyright (C) 2008-2009 IBM, Inc. All Rights Reserved.
4 *
5 ********************************************************************/
6 #ifndef _STRSRCHPERF_H
7 #define _STRSRCHPERF_H
8
9 #include "unicode/ubrk.h"
10 #include "unicode/usearch.h"
11 #include "unicode/colldata.h"
12 #include "unicode/bmsearch.h"
13 #include "unicode/uperf.h"
14 #include <stdlib.h>
15 #include <stdio.h>
16
17 #define TEST_BOYER_MOORE_SEARCH
18
19 #ifdef TEST_BOYER_MOORE_SEARCH
20 typedef void (*StrSrchFn) (BoyerMooreSearch * bms, const UChar *src, int32_t srcLen, const UChar *pttrn, int32_t pttrnLen, UErrorCode *status);
21 #else
22 typedef void (*StrSrchFn)(UStringSearch* srch, const UChar* src,int32_t srcLen, const UChar* pttrn, int32_t pttrnLen, UErrorCode* status);
23 #endif
24
25 class StringSearchPerfFunction : public UPerfFunction {
26 private:
27 StrSrchFn fn;
28 const UChar* src;
29 int32_t srcLen;
30 const UChar* pttrn;
31 int32_t pttrnLen;
32 #ifdef TEST_BOYER_MOORE_SEARCH
33 BoyerMooreSearch *bms;
34 #else
35 UStringSearch* srch;
36 #endif
37
38 public:
call(UErrorCode * status)39 virtual void call(UErrorCode* status) {
40 #ifdef TEST_BOYER_MOORE_SEARCH
41 (*fn)(bms, src, srcLen, pttrn, pttrnLen, status);
42 #else
43 (*fn)(srch, src, srcLen, pttrn, pttrnLen, status);
44 #endif
45 }
46
getOperationsPerIteration()47 virtual long getOperationsPerIteration() {
48 #if 0
49 return (long)(srcLen/pttrnLen);
50 #else
51 return (long) srcLen;
52 #endif
53 }
54
55 #ifdef TEST_BOYER_MOORE_SEARCH
StringSearchPerfFunction(StrSrchFn func,BoyerMooreSearch * search,const UChar * source,int32_t sourceLen,const UChar * pattern,int32_t patternLen)56 StringSearchPerfFunction(StrSrchFn func, BoyerMooreSearch *search, const UChar *source, int32_t sourceLen, const UChar *pattern, int32_t patternLen) {
57 fn = func;
58 src = source;
59 srcLen = sourceLen;
60 pttrn = pattern;
61 pttrnLen = patternLen;
62 bms = search;
63 }
64 #else
StringSearchPerfFunction(StrSrchFn func,UStringSearch * search,const UChar * source,int32_t sourceLen,const UChar * pattern,int32_t patternLen)65 StringSearchPerfFunction(StrSrchFn func, UStringSearch* search, const UChar* source,int32_t sourceLen, const UChar* pattern, int32_t patternLen) {
66 fn = func;
67 src = source;
68 srcLen = sourceLen;
69 pttrn = pattern;
70 pttrnLen = patternLen;
71 srch = search;
72 }
73 #endif
74 };
75
76 class StringSearchPerformanceTest : public UPerfTest {
77 private:
78 const UChar* src;
79 int32_t srcLen;
80 UChar* pttrn;
81 int32_t pttrnLen;
82 #ifdef TEST_BOYER_MOORE_SEARCH
83 UnicodeString *targetString;
84 BoyerMooreSearch *bms;
85 #else
86 UStringSearch* srch;
87 #endif
88
89 public:
90 StringSearchPerformanceTest(int32_t argc, const char *argv[], UErrorCode &status);
91 ~StringSearchPerformanceTest();
92 virtual UPerfFunction* runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = NULL);
93
94 UPerfFunction* Test_ICU_Forward_Search();
95
96 UPerfFunction* Test_ICU_Backward_Search();
97 };
98
99
100 #ifdef TEST_BOYER_MOORE_SEARCH
ICUForwardSearch(BoyerMooreSearch * bms,const UChar * source,int32_t sourceLen,const UChar * pattern,int32_t patternLen,UErrorCode *)101 void ICUForwardSearch(BoyerMooreSearch *bms, const UChar *source, int32_t sourceLen, const UChar *pattern, int32_t patternLen, UErrorCode * /*status*/) {
102 int32_t offset = 0, start = -1, end = -1;
103
104 while (bms->search(offset, start, end)) {
105 offset = end;
106 }
107 }
108
ICUBackwardSearch(BoyerMooreSearch * bms,const UChar * source,int32_t sourceLen,const UChar * pattern,int32_t patternLen,UErrorCode *)109 void ICUBackwardSearch(BoyerMooreSearch *bms, const UChar *source, int32_t sourceLen, const UChar *pattern, int32_t patternLen, UErrorCode * /*status*/) {
110 int32_t offset = 0, start = -1, end = -1;
111
112 /* NOTE: No Boyer-Moore backward search yet... */
113 while (bms->search(offset, start, end)) {
114 offset = end;
115 }
116 }
117 #else
ICUForwardSearch(UStringSearch * srch,const UChar * source,int32_t sourceLen,const UChar * pattern,int32_t patternLen,UErrorCode * status)118 void ICUForwardSearch(UStringSearch *srch, const UChar* source, int32_t sourceLen, const UChar* pattern, int32_t patternLen, UErrorCode* status) {
119 int32_t match;
120
121 match = usearch_first(srch, status);
122 while (match != USEARCH_DONE) {
123 match = usearch_next(srch, status);
124 }
125 }
126
ICUBackwardSearch(UStringSearch * srch,const UChar * source,int32_t sourceLen,const UChar * pattern,int32_t patternLen,UErrorCode * status)127 void ICUBackwardSearch(UStringSearch *srch, const UChar* source, int32_t sourceLen, const UChar* pattern, int32_t patternLen, UErrorCode* status) {
128 int32_t match;
129
130 match = usearch_last(srch, status);
131 while (match != USEARCH_DONE) {
132 match = usearch_previous(srch, status);
133 }
134 }
135 #endif
136
137 #endif /* _STRSRCHPERF_H */
138