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