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