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: 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 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 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 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 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 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 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 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