1/* 2********************************************************************** 3* Copyright (c) 2002-2006, International Business Machines 4* Corporation and others. All Rights Reserved. 5********************************************************************** 6********************************************************************** 7*/ 8#ifndef _CHARPERF_H 9#define _CHARPERF_H 10 11#include "unicode/uchar.h" 12 13#include "unicode/uperf.h" 14#include <stdlib.h> 15#include <stdio.h> 16#include <wchar.h> 17#include <wctype.h> 18 19typedef void (*CharPerfFn)(UChar32 ch); 20typedef void (*StdLibCharPerfFn)(wchar_t ch); 21 22class CharPerfFunction : public UPerfFunction 23{ 24public: 25 virtual void call(UErrorCode* status) 26 { 27 for (UChar32 i = MIN_; i < MAX_; i ++) { 28 (*m_fn_)(i); 29 } 30 } 31 32 virtual long getOperationsPerIteration() 33 { 34 return MAX_ - MIN_; 35 } 36 CharPerfFunction(CharPerfFn func, UChar32 min, UChar32 max) 37 { 38 m_fn_ = func; 39 MIN_ = min; 40 MAX_ = max; 41 } 42 43private: 44 CharPerfFn m_fn_; 45 UChar32 MIN_; 46 UChar32 MAX_; 47}; 48 49class StdLibCharPerfFunction : public UPerfFunction 50{ 51public: 52 virtual void call(UErrorCode* status) 53 { 54 // note wchar_t is unsigned, it will revert to 0 once it reaches 55 // 65535 56 for (wchar_t i = MIN_; i < MAX_; i ++) { 57 (*m_fn_)(i); 58 } 59 } 60 61 virtual long getOperationsPerIteration() 62 { 63 return MAX_ - MIN_; 64 } 65 66 StdLibCharPerfFunction(StdLibCharPerfFn func, wchar_t min, wchar_t max) 67 { 68 m_fn_ = func; 69 MIN_ = min; 70 MAX_ = max; 71 } 72 73 ~StdLibCharPerfFunction() 74 { 75 } 76 77private: 78 StdLibCharPerfFn m_fn_; 79 wchar_t MIN_; 80 wchar_t MAX_; 81}; 82 83class CharPerformanceTest : public UPerfTest 84{ 85public: 86 CharPerformanceTest(int32_t argc, const char *argv[], UErrorCode &status); 87 ~CharPerformanceTest(); 88 virtual UPerfFunction* runIndexedTest(int32_t index, UBool exec, 89 const char *&name, 90 char *par = NULL); 91 UPerfFunction* TestIsAlpha(); 92 UPerfFunction* TestIsUpper(); 93 UPerfFunction* TestIsLower(); 94 UPerfFunction* TestIsDigit(); 95 UPerfFunction* TestIsSpace(); 96 UPerfFunction* TestIsAlphaNumeric(); 97 UPerfFunction* TestIsPrint(); 98 UPerfFunction* TestIsControl(); 99 UPerfFunction* TestToLower(); 100 UPerfFunction* TestToUpper(); 101 UPerfFunction* TestIsWhiteSpace(); 102 UPerfFunction* TestStdLibIsAlpha(); 103 UPerfFunction* TestStdLibIsUpper(); 104 UPerfFunction* TestStdLibIsLower(); 105 UPerfFunction* TestStdLibIsDigit(); 106 UPerfFunction* TestStdLibIsSpace(); 107 UPerfFunction* TestStdLibIsAlphaNumeric(); 108 UPerfFunction* TestStdLibIsPrint(); 109 UPerfFunction* TestStdLibIsControl(); 110 UPerfFunction* TestStdLibToLower(); 111 UPerfFunction* TestStdLibToUpper(); 112 UPerfFunction* TestStdLibIsWhiteSpace(); 113 114private: 115 UChar32 MIN_; 116 UChar32 MAX_; 117}; 118 119inline void isAlpha(UChar32 ch) 120{ 121 u_isalpha(ch); 122} 123 124inline void isUpper(UChar32 ch) 125{ 126 u_isupper(ch); 127} 128 129inline void isLower(UChar32 ch) 130{ 131 u_islower(ch); 132} 133 134inline void isDigit(UChar32 ch) 135{ 136 u_isdigit(ch); 137} 138 139inline void isSpace(UChar32 ch) 140{ 141 u_isspace(ch); 142} 143 144inline void isAlphaNumeric(UChar32 ch) 145{ 146 u_isalnum(ch); 147} 148 149/** 150* This test may be different since c lib has a type PUNCT and it is printable. 151* iswgraph is not used for testing since it is a subset of iswprint with the 152* exception of returning true for white spaces. no match found in icu4c. 153*/ 154inline void isPrint(UChar32 ch) 155{ 156 u_isprint(ch); 157} 158 159inline void isControl(UChar32 ch) 160{ 161 u_iscntrl(ch); 162} 163 164inline void toLower(UChar32 ch) 165{ 166 u_tolower(ch); 167} 168 169inline void toUpper(UChar32 ch) 170{ 171 u_toupper(ch); 172} 173 174inline void isWhiteSpace(UChar32 ch) 175{ 176 u_isWhitespace(ch); 177} 178 179inline void StdLibIsAlpha(wchar_t ch) 180{ 181 iswalpha(ch); 182} 183 184inline void StdLibIsUpper(wchar_t ch) 185{ 186 iswupper(ch); 187} 188 189inline void StdLibIsLower(wchar_t ch) 190{ 191 iswlower(ch); 192} 193 194inline void StdLibIsDigit(wchar_t ch) 195{ 196 iswdigit(ch); 197} 198 199inline void StdLibIsSpace(wchar_t ch) 200{ 201 iswspace(ch); 202} 203 204inline void StdLibIsAlphaNumeric(wchar_t ch) 205{ 206 iswalnum(ch); 207} 208 209/** 210* This test may be different since c lib has a type PUNCT and it is printable. 211* iswgraph is not used for testing since it is a subset of iswprint with the 212* exception of returning true for white spaces. no match found in icu4c. 213*/ 214inline void StdLibIsPrint(wchar_t ch) 215{ 216 iswprint(ch); 217} 218 219inline void StdLibIsControl(wchar_t ch) 220{ 221 iswcntrl(ch); 222} 223 224inline void StdLibToLower(wchar_t ch) 225{ 226 towlower(ch); 227} 228 229inline void StdLibToUpper(wchar_t ch) 230{ 231 towupper(ch); 232} 233 234inline void StdLibIsWhiteSpace(wchar_t ch) 235{ 236 iswspace(ch); 237} 238 239#endif // CHARPERF_H 240