41ca4f63ee
X-SVN-Rev: 17296
138 lines
3.6 KiB
C++
138 lines
3.6 KiB
C++
/*
|
|
**********************************************************************
|
|
* Copyright (c) 2002-2005, International Business Machines
|
|
* Corporation and others. All Rights Reserved.
|
|
**********************************************************************
|
|
**********************************************************************
|
|
*/
|
|
#ifndef _UBRKPERF_H
|
|
#define _UBRKPERF_H
|
|
|
|
#include "unicode/uperf.h"
|
|
|
|
#include <unicode/brkiter.h>
|
|
|
|
class ICUBreakFunction : public UPerfFunction {
|
|
protected:
|
|
BreakIterator *m_brkIt_;
|
|
const UChar *m_file_;
|
|
int32_t m_fileLen_;
|
|
int32_t m_noBreaks_;
|
|
UErrorCode m_status_;
|
|
public:
|
|
ICUBreakFunction(const char *locale, const char *mode, const UChar *file, int32_t file_len) :
|
|
m_brkIt_(NULL),
|
|
m_file_(file),
|
|
m_fileLen_(file_len),
|
|
m_noBreaks_(-1),
|
|
m_status_(U_ZERO_ERROR)
|
|
{
|
|
switch(mode[0]) {
|
|
case 'c' :
|
|
m_brkIt_ = BreakIterator::createCharacterInstance(locale, m_status_);
|
|
break;
|
|
case 'w' :
|
|
m_brkIt_ = BreakIterator::createWordInstance(locale, m_status_);
|
|
break;
|
|
case 'l' :
|
|
m_brkIt_ = BreakIterator::createLineInstance(locale, m_status_);
|
|
break;
|
|
case 's' :
|
|
m_brkIt_ = BreakIterator::createSentenceInstance(locale, m_status_);
|
|
break;
|
|
default:
|
|
// should not happen as we already check for this in the caller
|
|
m_status_ = U_ILLEGAL_ARGUMENT_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
|
|
~ICUBreakFunction() { delete m_brkIt_; }
|
|
virtual void call(UErrorCode *status) = 0;
|
|
virtual long getOperationsPerIteration() { return m_fileLen_; }
|
|
virtual long getEventsPerIteration() { return m_noBreaks_; }
|
|
virtual UErrorCode getStatus() { return m_status_; }
|
|
};
|
|
|
|
class ICUIsBound : public ICUBreakFunction {
|
|
public:
|
|
ICUIsBound(const char *locale, const char *mode, const UChar *file, int32_t file_len) :
|
|
ICUBreakFunction(locale, mode, file, file_len)
|
|
{
|
|
m_noBreaks_ = 0;
|
|
m_brkIt_->setText(UnicodeString(m_file_, m_fileLen_));
|
|
m_brkIt_->first();
|
|
int32_t j = 0;
|
|
for(j = 0; j < m_fileLen_; j++) {
|
|
if(m_brkIt_->isBoundary(j)) {
|
|
m_noBreaks_++;
|
|
}
|
|
}
|
|
}
|
|
virtual void call(UErrorCode *status)
|
|
{
|
|
m_noBreaks_ = 0;
|
|
int32_t j = 0;
|
|
for(j = 0; j < m_fileLen_; j++) {
|
|
if(m_brkIt_->isBoundary(j)) {
|
|
m_noBreaks_++;
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
class ICUForward : public ICUBreakFunction {
|
|
public:
|
|
ICUForward(const char *locale, const char *mode, const UChar *file, int32_t file_len) :
|
|
ICUBreakFunction(locale, mode, file, file_len)
|
|
{
|
|
m_noBreaks_ = 0;
|
|
m_brkIt_->setText(UnicodeString(m_file_, m_fileLen_));
|
|
m_brkIt_->first();
|
|
while(m_brkIt_->next() != BreakIterator::DONE) {
|
|
m_noBreaks_++;
|
|
}
|
|
}
|
|
virtual void call(UErrorCode *status)
|
|
{
|
|
m_noBreaks_ = 0;
|
|
m_brkIt_->first();
|
|
while(m_brkIt_->next() != BreakIterator::DONE) {
|
|
m_noBreaks_++;
|
|
}
|
|
}
|
|
};
|
|
|
|
class DarwinBreakFunction : public UPerfFunction {
|
|
#ifdef U_DARWIN
|
|
public:
|
|
virtual void call(UErrorCode *status) {};
|
|
#else
|
|
public:
|
|
virtual void call(UErrorCode *status) {};
|
|
#endif
|
|
};
|
|
|
|
class BreakIteratorPerformanceTest : public UPerfTest {
|
|
private:
|
|
const char* m_mode_;
|
|
const UChar* m_file_;
|
|
int32_t m_fileLen_;
|
|
|
|
public:
|
|
BreakIteratorPerformanceTest(int32_t argc, const char* argv[], UErrorCode& status);
|
|
~BreakIteratorPerformanceTest();
|
|
|
|
virtual UPerfFunction* runIndexedTest(int32_t index, UBool exec,
|
|
const char* &name, char* par = NULL);
|
|
|
|
UPerfFunction* TestICUForward();
|
|
UPerfFunction* TestICUIsBound();
|
|
|
|
UPerfFunction* TestDarwinForward();
|
|
UPerfFunction* TestDarwinIsBound();
|
|
|
|
};
|
|
|
|
#endif // UBRKPERF_H
|