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