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
19 typedef void (*CharPerfFn)(UChar32 ch);
20 typedef void (*StdLibCharPerfFn)(wchar_t ch);
21
22 class CharPerfFunction : public UPerfFunction
23 {
24 public:
call(UErrorCode * status)25 virtual void call(UErrorCode* status)
26 {
27 for (UChar32 i = MIN_; i < MAX_; i ++) {
28 (*m_fn_)(i);
29 }
30 }
31
getOperationsPerIteration()32 virtual long getOperationsPerIteration()
33 {
34 return MAX_ - MIN_;
35 }
CharPerfFunction(CharPerfFn func,UChar32 min,UChar32 max)36 CharPerfFunction(CharPerfFn func, UChar32 min, UChar32 max)
37 {
38 m_fn_ = func;
39 MIN_ = min;
40 MAX_ = max;
41 }
42
43 private:
44 CharPerfFn m_fn_;
45 UChar32 MIN_;
46 UChar32 MAX_;
47 };
48
49 class StdLibCharPerfFunction : public UPerfFunction
50 {
51 public:
call(UErrorCode * status)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
getOperationsPerIteration()61 virtual long getOperationsPerIteration()
62 {
63 return MAX_ - MIN_;
64 }
65
StdLibCharPerfFunction(StdLibCharPerfFn func,wchar_t min,wchar_t max)66 StdLibCharPerfFunction(StdLibCharPerfFn func, wchar_t min, wchar_t max)
67 {
68 m_fn_ = func;
69 MIN_ = min;
70 MAX_ = max;
71 }
72
~StdLibCharPerfFunction()73 ~StdLibCharPerfFunction()
74 {
75 }
76
77 private:
78 StdLibCharPerfFn m_fn_;
79 wchar_t MIN_;
80 wchar_t MAX_;
81 };
82
83 class CharPerformanceTest : public UPerfTest
84 {
85 public:
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
114 private:
115 UChar32 MIN_;
116 UChar32 MAX_;
117 };
118
isAlpha(UChar32 ch)119 inline void isAlpha(UChar32 ch)
120 {
121 u_isalpha(ch);
122 }
123
isUpper(UChar32 ch)124 inline void isUpper(UChar32 ch)
125 {
126 u_isupper(ch);
127 }
128
isLower(UChar32 ch)129 inline void isLower(UChar32 ch)
130 {
131 u_islower(ch);
132 }
133
isDigit(UChar32 ch)134 inline void isDigit(UChar32 ch)
135 {
136 u_isdigit(ch);
137 }
138
isSpace(UChar32 ch)139 inline void isSpace(UChar32 ch)
140 {
141 u_isspace(ch);
142 }
143
isAlphaNumeric(UChar32 ch)144 inline 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 */
isPrint(UChar32 ch)154 inline void isPrint(UChar32 ch)
155 {
156 u_isprint(ch);
157 }
158
isControl(UChar32 ch)159 inline void isControl(UChar32 ch)
160 {
161 u_iscntrl(ch);
162 }
163
toLower(UChar32 ch)164 inline void toLower(UChar32 ch)
165 {
166 u_tolower(ch);
167 }
168
toUpper(UChar32 ch)169 inline void toUpper(UChar32 ch)
170 {
171 u_toupper(ch);
172 }
173
isWhiteSpace(UChar32 ch)174 inline void isWhiteSpace(UChar32 ch)
175 {
176 u_isWhitespace(ch);
177 }
178
StdLibIsAlpha(wchar_t ch)179 inline void StdLibIsAlpha(wchar_t ch)
180 {
181 iswalpha(ch);
182 }
183
StdLibIsUpper(wchar_t ch)184 inline void StdLibIsUpper(wchar_t ch)
185 {
186 iswupper(ch);
187 }
188
StdLibIsLower(wchar_t ch)189 inline void StdLibIsLower(wchar_t ch)
190 {
191 iswlower(ch);
192 }
193
StdLibIsDigit(wchar_t ch)194 inline void StdLibIsDigit(wchar_t ch)
195 {
196 iswdigit(ch);
197 }
198
StdLibIsSpace(wchar_t ch)199 inline void StdLibIsSpace(wchar_t ch)
200 {
201 iswspace(ch);
202 }
203
StdLibIsAlphaNumeric(wchar_t ch)204 inline 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 */
StdLibIsPrint(wchar_t ch)214 inline void StdLibIsPrint(wchar_t ch)
215 {
216 iswprint(ch);
217 }
218
StdLibIsControl(wchar_t ch)219 inline void StdLibIsControl(wchar_t ch)
220 {
221 iswcntrl(ch);
222 }
223
StdLibToLower(wchar_t ch)224 inline void StdLibToLower(wchar_t ch)
225 {
226 towlower(ch);
227 }
228
StdLibToUpper(wchar_t ch)229 inline void StdLibToUpper(wchar_t ch)
230 {
231 towupper(ch);
232 }
233
StdLibIsWhiteSpace(wchar_t ch)234 inline void StdLibIsWhiteSpace(wchar_t ch)
235 {
236 iswspace(ch);
237 }
238
239 #endif // CHARPERF_H
240