1/* 2********************************************************************** 3* Copyright (c) 2002-2005, International Business Machines 4* Corporation and others. All Rights Reserved. 5********************************************************************** 6********************************************************************** 7*/ 8#ifndef _UBRKPERF_H 9#define _UBRKPERF_H 10 11#include "unicode/uperf.h" 12 13#include <unicode/brkiter.h> 14 15class ICUBreakFunction : public UPerfFunction { 16protected: 17 BreakIterator *m_brkIt_; 18 const UChar *m_file_; 19 int32_t m_fileLen_; 20 int32_t m_noBreaks_; 21 UErrorCode m_status_; 22public: 23 ICUBreakFunction(const char *locale, const char *mode, const UChar *file, int32_t file_len) : 24 m_brkIt_(NULL), 25 m_file_(file), 26 m_fileLen_(file_len), 27 m_noBreaks_(-1), 28 m_status_(U_ZERO_ERROR) 29 { 30 switch(mode[0]) { 31 case 'c' : 32 m_brkIt_ = BreakIterator::createCharacterInstance(locale, m_status_); 33 break; 34 case 'w' : 35 m_brkIt_ = BreakIterator::createWordInstance(locale, m_status_); 36 break; 37 case 'l' : 38 m_brkIt_ = BreakIterator::createLineInstance(locale, m_status_); 39 break; 40 case 's' : 41 m_brkIt_ = BreakIterator::createSentenceInstance(locale, m_status_); 42 break; 43 default: 44 // should not happen as we already check for this in the caller 45 m_status_ = U_ILLEGAL_ARGUMENT_ERROR; 46 break; 47 } 48 } 49 50 ~ICUBreakFunction() { delete m_brkIt_; } 51 virtual void call(UErrorCode *status) = 0; 52 virtual long getOperationsPerIteration() { return m_fileLen_; } 53 virtual long getEventsPerIteration() { return m_noBreaks_; } 54 virtual UErrorCode getStatus() { return m_status_; } 55}; 56 57class ICUIsBound : public ICUBreakFunction { 58public: 59 ICUIsBound(const char *locale, const char *mode, const UChar *file, int32_t file_len) : 60 ICUBreakFunction(locale, mode, file, file_len) 61 { 62 m_noBreaks_ = 0; 63 m_brkIt_->setText(UnicodeString(m_file_, m_fileLen_)); 64 m_brkIt_->first(); 65 int32_t j = 0; 66 for(j = 0; j < m_fileLen_; j++) { 67 if(m_brkIt_->isBoundary(j)) { 68 m_noBreaks_++; 69 } 70 } 71 } 72 virtual void call(UErrorCode *status) 73 { 74 m_noBreaks_ = 0; 75 int32_t j = 0; 76 for(j = 0; j < m_fileLen_; j++) { 77 if(m_brkIt_->isBoundary(j)) { 78 m_noBreaks_++; 79 } 80 } 81 } 82}; 83 84class ICUForward : public ICUBreakFunction { 85public: 86 ICUForward(const char *locale, const char *mode, const UChar *file, int32_t file_len) : 87 ICUBreakFunction(locale, mode, file, file_len) 88 { 89 m_noBreaks_ = 0; 90 m_brkIt_->setText(UnicodeString(m_file_, m_fileLen_)); 91 m_brkIt_->first(); 92 while(m_brkIt_->next() != BreakIterator::DONE) { 93 m_noBreaks_++; 94 } 95 } 96 virtual void call(UErrorCode *status) 97 { 98 m_noBreaks_ = 0; 99 m_brkIt_->first(); 100 while(m_brkIt_->next() != BreakIterator::DONE) { 101 m_noBreaks_++; 102 } 103 } 104}; 105 106class DarwinBreakFunction : public UPerfFunction { 107#ifdef U_DARWIN 108public: 109 virtual void call(UErrorCode *status) {}; 110#else 111public: 112 virtual void call(UErrorCode *status) {}; 113#endif 114}; 115 116class BreakIteratorPerformanceTest : public UPerfTest { 117private: 118 const char* m_mode_; 119 const UChar* m_file_; 120 int32_t m_fileLen_; 121 122public: 123 BreakIteratorPerformanceTest(int32_t argc, const char* argv[], UErrorCode& status); 124 ~BreakIteratorPerformanceTest(); 125 126 virtual UPerfFunction* runIndexedTest(int32_t index, UBool exec, 127 const char* &name, char* par = NULL); 128 129 UPerfFunction* TestICUForward(); 130 UPerfFunction* TestICUIsBound(); 131 132 UPerfFunction* TestDarwinForward(); 133 UPerfFunction* TestDarwinIsBound(); 134 135}; 136 137#endif // UBRKPERF_H 138