1 /*
2 ***********************************************************************
3 * © 2016 and later: Unicode, Inc. and others.
4 * License & terms of use: http://www.unicode.org/copyright.html
5 ***********************************************************************
6 ***********************************************************************
7 * Copyright (c) 2002-2011, International Business Machines
8 * Corporation and others. All Rights Reserved.
9 ***********************************************************************
10 ***********************************************************************
11 */
12 #ifndef _NORMPERF_H
13 #define _NORMPERF_H
14
15 #include "unicode/unorm.h"
16 #include "unicode/ustring.h"
17
18 #include "unicode/uperf.h"
19 #include <stdlib.h>
20
21 // Stubs for Windows API functions when building on UNIXes.
22 //
23 #if U_PLATFORM_USES_ONLY_WIN32_API
24 // do nothing
25 #else
26 #define _UNICODE
27 typedef int DWORD;
28 inline int FoldStringW(DWORD dwMapFlags, const UChar* lpSrcStr,int cchSrc, UChar* lpDestStr,int cchDest);
29 #endif
30
31 #define DEST_BUFFER_CAPACITY 6000
32 typedef int32_t (*NormFn)(const UChar* src,int32_t srcLen, UChar* dest,int32_t dstLen, int32_t options, UErrorCode* status);
33 typedef int32_t (*QuickCheckFn)(const UChar* src,int32_t srcLen, UNormalizationMode mode, int32_t options, UErrorCode* status);
34
35 class QuickCheckPerfFunction : public UPerfFunction{
36 private:
37 ULine* lines;
38 int32_t numLines;
39 QuickCheckFn fn;
40 UNormalizationMode mode;
41 int32_t retVal;
42 UBool uselen;
43 const UChar* src;
44 int32_t srcLen;
45 UBool line_mode;
46 int32_t options;
47
48 public:
call(UErrorCode * status)49 virtual void call(UErrorCode* status){
50 if(line_mode){
51 if(uselen){
52 for(int32_t i = 0; i< numLines; i++){
53 retVal = (*fn)(lines[i].name,lines[i].len,mode, options, status);
54 }
55 }else{
56 for(int32_t i = 0; i< numLines; i++){
57 retVal = (*fn)(lines[i].name,-1,mode, options, status);
58 }
59 }
60 }else{
61 if(uselen){
62
63 retVal = (*fn)(src,srcLen,mode, options, status);
64 }else{
65 retVal = (*fn)(src,-1,mode, options, status);
66 }
67 }
68
69 }
getOperationsPerIteration()70 virtual long getOperationsPerIteration(){
71 if(line_mode){
72 int32_t totalChars=0;
73 for(int32_t i =0; i< numLines; i++){
74 totalChars+= lines[i].len;
75 }
76 return totalChars;
77 }else{
78 return srcLen;
79 }
80 }
QuickCheckPerfFunction(QuickCheckFn func,ULine * srcLines,int32_t srcNumLines,UNormalizationMode _mode,int32_t opts,UBool _uselen)81 QuickCheckPerfFunction(QuickCheckFn func, ULine* srcLines,int32_t srcNumLines, UNormalizationMode _mode, int32_t opts, UBool _uselen) : options(opts) {
82 fn = func;
83 lines = srcLines;
84 numLines = srcNumLines;
85 uselen = _uselen;
86 mode = _mode;
87 src = NULL;
88 srcLen = 0;
89 line_mode = true;
90 }
QuickCheckPerfFunction(QuickCheckFn func,const UChar * source,int32_t sourceLen,UNormalizationMode _mode,int32_t opts,UBool _uselen)91 QuickCheckPerfFunction(QuickCheckFn func, const UChar* source,int32_t sourceLen, UNormalizationMode _mode, int32_t opts, UBool _uselen) : options(opts) {
92 fn = func;
93 lines = NULL;
94 numLines = 0;
95 uselen = _uselen;
96 mode = _mode;
97 src = source;
98 srcLen = sourceLen;
99 line_mode = false;
100 }
101 };
102
103
104 class NormPerfFunction : public UPerfFunction{
105 private:
106 ULine* lines;
107 int32_t numLines;
108 UChar dest[DEST_BUFFER_CAPACITY];
109 UChar* pDest;
110 int32_t destLen;
111 NormFn fn;
112 int32_t retVal;
113 UBool uselen;
114 const UChar* src;
115 int32_t srcLen;
116 UBool line_mode;
117 int32_t options;
118
119 public:
call(UErrorCode * status)120 virtual void call(UErrorCode* status){
121 if(line_mode){
122 if(uselen){
123 for(int32_t i = 0; i< numLines; i++){
124 retVal = (*fn)(lines[i].name,lines[i].len,pDest,destLen, options, status);
125 }
126 }else{
127 for(int32_t i = 0; i< numLines; i++){
128 retVal = (*fn)(lines[i].name,-1,pDest,destLen, options, status);
129 }
130 }
131 }else{
132 if(uselen){
133 retVal = (*fn)(src,srcLen,pDest,destLen, options, status);
134 }else{
135 retVal = (*fn)(src,-1,pDest,destLen, options, status);
136 }
137 }
138 }
getOperationsPerIteration()139 virtual long getOperationsPerIteration(){
140 if(line_mode){
141 int32_t totalChars=0;
142 for(int32_t i =0; i< numLines; i++){
143 totalChars+= lines[i].len;
144 }
145 return totalChars;
146 }else{
147 return srcLen;
148 }
149 }
NormPerfFunction(NormFn func,int32_t opts,ULine * srcLines,int32_t srcNumLines,UBool _uselen)150 NormPerfFunction(NormFn func, int32_t opts, ULine* srcLines,int32_t srcNumLines,UBool _uselen) : options(opts) {
151 fn = func;
152 lines = srcLines;
153 numLines = srcNumLines;
154 uselen = _uselen;
155 destLen = DEST_BUFFER_CAPACITY;
156 pDest = dest;
157 src = NULL;
158 srcLen = 0;
159 line_mode = true;
160 }
NormPerfFunction(NormFn func,int32_t opts,const UChar * source,int32_t sourceLen,UBool _uselen)161 NormPerfFunction(NormFn func, int32_t opts, const UChar* source,int32_t sourceLen,UBool _uselen) : options(opts) {
162 fn = func;
163 lines = NULL;
164 numLines = 0;
165 uselen = _uselen;
166 destLen = sourceLen*3;
167 pDest = (UChar*) malloc(destLen * U_SIZEOF_UCHAR);
168 src = source;
169 srcLen = sourceLen;
170 line_mode = false;
171 }
~NormPerfFunction()172 ~NormPerfFunction(){
173 if(dest != pDest){
174 free(pDest);
175 }
176 }
177 };
178
179
180
181 class NormalizerPerformanceTest : public UPerfTest{
182 private:
183 ULine* NFDFileLines;
184 ULine* NFCFileLines;
185 UChar* NFDBuffer;
186 UChar* NFCBuffer;
187 UChar* origBuffer;
188 int32_t origBufferLen;
189 int32_t NFDBufferLen;
190 int32_t NFCBufferLen;
191 int32_t options;
192
193 void normalizeInput(ULine* dest,const UChar* src ,int32_t srcLen,UNormalizationMode mode, int32_t options);
194 UChar* normalizeInput(int32_t& len, const UChar* src ,int32_t srcLen,UNormalizationMode mode, int32_t options);
195
196 public:
197
198 NormalizerPerformanceTest(int32_t argc, const char* argv[], UErrorCode& status);
199 ~NormalizerPerformanceTest();
200 virtual UPerfFunction* runIndexedTest(int32_t index, UBool exec,const char* &name, char* par = NULL);
201 /* NFC performance */
202 UPerfFunction* TestICU_NFC_NFD_Text();
203 UPerfFunction* TestICU_NFC_NFC_Text();
204 UPerfFunction* TestICU_NFC_Orig_Text();
205
206 /* NFD performance */
207 UPerfFunction* TestICU_NFD_NFD_Text();
208 UPerfFunction* TestICU_NFD_NFC_Text();
209 UPerfFunction* TestICU_NFD_Orig_Text();
210
211 /* FCD performance */
212 UPerfFunction* TestICU_FCD_NFD_Text();
213 UPerfFunction* TestICU_FCD_NFC_Text();
214 UPerfFunction* TestICU_FCD_Orig_Text();
215
216 /*Win NFC performance */
217 UPerfFunction* TestWin_NFC_NFD_Text();
218 UPerfFunction* TestWin_NFC_NFC_Text();
219 UPerfFunction* TestWin_NFC_Orig_Text();
220
221 /* Win NFD performance */
222 UPerfFunction* TestWin_NFD_NFD_Text();
223 UPerfFunction* TestWin_NFD_NFC_Text();
224 UPerfFunction* TestWin_NFD_Orig_Text();
225
226 /* Quick check performance */
227 UPerfFunction* TestQC_NFC_NFD_Text();
228 UPerfFunction* TestQC_NFC_NFC_Text();
229 UPerfFunction* TestQC_NFC_Orig_Text();
230
231 UPerfFunction* TestQC_NFD_NFD_Text();
232 UPerfFunction* TestQC_NFD_NFC_Text();
233 UPerfFunction* TestQC_NFD_Orig_Text();
234
235 UPerfFunction* TestQC_FCD_NFD_Text();
236 UPerfFunction* TestQC_FCD_NFC_Text();
237 UPerfFunction* TestQC_FCD_Orig_Text();
238
239 /* IsNormalized performance */
240 UPerfFunction* TestIsNormalized_NFC_NFD_Text();
241 UPerfFunction* TestIsNormalized_NFC_NFC_Text();
242 UPerfFunction* TestIsNormalized_NFC_Orig_Text();
243
244 UPerfFunction* TestIsNormalized_NFD_NFD_Text();
245 UPerfFunction* TestIsNormalized_NFD_NFC_Text();
246 UPerfFunction* TestIsNormalized_NFD_Orig_Text();
247
248 UPerfFunction* TestIsNormalized_FCD_NFD_Text();
249 UPerfFunction* TestIsNormalized_FCD_NFC_Text();
250 UPerfFunction* TestIsNormalized_FCD_Orig_Text();
251
252 };
253
254 //---------------------------------------------------------------------------------------
255 // Platform / ICU version specific proto-types
256 //---------------------------------------------------------------------------------------
257
258
259 #if (U_ICU_VERSION_MAJOR_NUM > 1 ) || ((U_ICU_VERSION_MAJOR_NUM == 1 )&&(U_ICU_VERSION_MINOR_NUM > 8) && (U_ICU_VERSION_PATCHLEVEL_NUM >=1))
260
ICUNormNFD(const UChar * src,int32_t srcLen,UChar * dest,int32_t dstLen,int32_t options,UErrorCode * status)261 int32_t ICUNormNFD(const UChar* src, int32_t srcLen,UChar* dest, int32_t dstLen, int32_t options, UErrorCode* status) {
262 return unorm_normalize(src,srcLen,UNORM_NFD, options,dest,dstLen,status);
263 }
264
ICUNormNFC(const UChar * src,int32_t srcLen,UChar * dest,int32_t dstLen,int32_t options,UErrorCode * status)265 int32_t ICUNormNFC(const UChar* src, int32_t srcLen,UChar* dest, int32_t dstLen, int32_t options, UErrorCode* status) {
266 return unorm_normalize(src,srcLen,UNORM_NFC, options,dest,dstLen,status);
267 }
268
ICUNormNFKD(const UChar * src,int32_t srcLen,UChar * dest,int32_t dstLen,int32_t options,UErrorCode * status)269 int32_t ICUNormNFKD(const UChar* src, int32_t srcLen,UChar* dest, int32_t dstLen, int32_t options, UErrorCode* status) {
270 return unorm_normalize(src,srcLen,UNORM_NFKD, options,dest,dstLen,status);
271 }
ICUNormNFKC(const UChar * src,int32_t srcLen,UChar * dest,int32_t dstLen,int32_t options,UErrorCode * status)272 int32_t ICUNormNFKC(const UChar* src, int32_t srcLen,UChar* dest, int32_t dstLen, int32_t options, UErrorCode* status) {
273 return unorm_normalize(src,srcLen,UNORM_NFKC, options,dest,dstLen,status);
274 }
275
ICUNormFCD(const UChar * src,int32_t srcLen,UChar * dest,int32_t dstLen,int32_t options,UErrorCode * status)276 int32_t ICUNormFCD(const UChar* src, int32_t srcLen,UChar* dest, int32_t dstLen, int32_t options, UErrorCode* status) {
277 return unorm_normalize(src,srcLen,UNORM_FCD, options,dest,dstLen,status);
278 }
279
ICUQuickCheck(const UChar * src,int32_t srcLen,UNormalizationMode mode,int32_t options,UErrorCode * status)280 int32_t ICUQuickCheck(const UChar* src,int32_t srcLen, UNormalizationMode mode, int32_t options, UErrorCode* status){
281 #if (U_ICU_VERSION_MAJOR_NUM > 2 ) || ((U_ICU_VERSION_MAJOR_NUM == 2 )&&(U_ICU_VERSION_MINOR_NUM >= 6))
282 return unorm_quickCheckWithOptions(src,srcLen,mode, options, status);
283 #else
284 return unorm_quickCheck(src,srcLen,mode,status);
285 #endif
286 }
ICUIsNormalized(const UChar * src,int32_t srcLen,UNormalizationMode mode,int32_t options,UErrorCode * status)287 int32_t ICUIsNormalized(const UChar* src,int32_t srcLen, UNormalizationMode mode, int32_t options, UErrorCode* status){
288 return unorm_isNormalized(src,srcLen,mode,status);
289 }
290
291
292 #else
293
ICUNormNFD(const UChar * src,int32_t srcLen,UChar * dest,int32_t dstLen,int32_t options,UErrorCode * status)294 int32_t ICUNormNFD(const UChar* src, int32_t srcLen,UChar* dest, int32_t dstLen, int32_t options, UErrorCode* status) {
295 return unorm_normalize(src,srcLen,UCOL_DECOMP_CAN, options,dest,dstLen,status);
296 }
297
ICUNormNFC(const UChar * src,int32_t srcLen,UChar * dest,int32_t dstLen,int32_t options,UErrorCode * status)298 int32_t ICUNormNFC(const UChar* src, int32_t srcLen,UChar* dest, int32_t dstLen, int32_t options, UErrorCode* status) {
299 return unorm_normalize(src,srcLen,UCOL_COMPOSE_CAN, options,dest,dstLen,status);
300 }
301
ICUNormNFKD(const UChar * src,int32_t srcLen,UChar * dest,int32_t dstLen,int32_t options,UErrorCode * status)302 int32_t ICUNormNFKD(const UChar* src, int32_t srcLen,UChar* dest, int32_t dstLen, int32_t options, UErrorCode* status) {
303 return unorm_normalize(src,srcLen,UCOL_DECOMP_COMPAT, options,dest,dstLen,status);
304 }
ICUNormNFKC(const UChar * src,int32_t srcLen,UChar * dest,int32_t dstLen,int32_t options,UErrorCode * status)305 int32_t ICUNormNFKC(const UChar* src, int32_t srcLen,UChar* dest, int32_t dstLen, int32_t options, UErrorCode* status) {
306 return unorm_normalize(src,srcLen,UCOL_COMPOSE_COMPAT, options,dest,dstLen,status);
307 }
308
ICUNormFCD(const UChar * src,int32_t srcLen,UChar * dest,int32_t dstLen,int32_t options,UErrorCode * status)309 int32_t ICUNormFCD(const UChar* src, int32_t srcLen,UChar* dest, int32_t dstLen, int32_t options, UErrorCode* status) {
310 return unorm_normalize(src,srcLen,UNORM_FCD, options,dest,dstLen,status);
311 }
312
ICUQuickCheck(const UChar * src,int32_t srcLen,UNormalizationMode mode,int32_t options,UErrorCode * status)313 int32_t ICUQuickCheck(const UChar* src,int32_t srcLen, UNormalizationMode mode, int32_t options, UErrorCode* status){
314 return unorm_quickCheck(src,srcLen,mode,status);
315 }
316
ICUIsNormalized(const UChar * src,int32_t srcLen,UNormalizationMode mode,int32_t options,UErrorCode * status)317 int32_t ICUIsNormalized(const UChar* src,int32_t srcLen, UNormalizationMode mode, int32_t options, UErrorCode* status){
318 return 0;
319 }
320 #endif
321
322 #if U_PLATFORM_HAS_WIN32_API
323
WinNormNFD(const UChar * src,int32_t srcLen,UChar * dest,int32_t dstLen,int32_t options,UErrorCode * status)324 int32_t WinNormNFD(const UChar* src, int32_t srcLen, UChar* dest, int32_t dstLen, int32_t options, UErrorCode* status) {
325 return FoldStringW(MAP_COMPOSITE, toOldUCharPtr(src),srcLen, toOldUCharPtr(dest),dstLen);
326 }
327
WinNormNFC(const UChar * src,int32_t srcLen,UChar * dest,int32_t dstLen,int32_t options,UErrorCode * status)328 int32_t WinNormNFC(const UChar* src, int32_t srcLen, UChar* dest, int32_t dstLen, int32_t options, UErrorCode* status) {
329 return FoldStringW(MAP_PRECOMPOSED, toOldUCharPtr(src),srcLen, toOldUCharPtr(dest),dstLen);
330 }
331
WinNormNFKD(const UChar * src,int32_t srcLen,UChar * dest,int32_t dstLen,int32_t options,UErrorCode * status)332 int32_t WinNormNFKD(const UChar* src, int32_t srcLen, UChar* dest, int32_t dstLen, int32_t options, UErrorCode* status) {
333 return FoldStringW(MAP_COMPOSITE+MAP_FOLDCZONE, toOldUCharPtr(src),srcLen, toOldUCharPtr(dest),dstLen);
334 }
WinNormNFKC(const UChar * src,int32_t srcLen,UChar * dest,int32_t dstLen,int32_t options,UErrorCode * status)335 int32_t WinNormNFKC(const UChar* src, int32_t srcLen, UChar* dest, int32_t dstLen, int32_t options, UErrorCode* status) {
336 return FoldStringW(MAP_FOLDCZONE, toOldUCharPtr(src),srcLen, toOldUCharPtr(dest),dstLen);
337 }
338 #else
WinNormNFD(const UChar * src,int32_t srcLen,UChar * dest,int32_t dstLen,int32_t options,UErrorCode * status)339 int32_t WinNormNFD(const UChar* src, int32_t srcLen, UChar* dest, int32_t dstLen, int32_t options, UErrorCode* status) {
340 return 0 ;
341 }
342
WinNormNFC(const UChar * src,int32_t srcLen,UChar * dest,int32_t dstLen,int32_t options,UErrorCode * status)343 int32_t WinNormNFC(const UChar* src, int32_t srcLen, UChar* dest, int32_t dstLen, int32_t options, UErrorCode* status) {
344 return 0;
345 }
346
WinNormNFKD(const UChar * src,int32_t srcLen,UChar * dest,int32_t dstLen,int32_t options,UErrorCode * status)347 int32_t WinNormNFKD(const UChar* src, int32_t srcLen, UChar* dest, int32_t dstLen, int32_t options, UErrorCode* status) {
348 return 0;
349 }
WinNormNFKC(const UChar * src,int32_t srcLen,UChar * dest,int32_t dstLen,int32_t options,UErrorCode * status)350 int32_t WinNormNFKC(const UChar* src, int32_t srcLen, UChar* dest, int32_t dstLen, int32_t options, UErrorCode* status) {
351 return 0;
352 }
353 #endif
354
355
356 #endif // NORMPERF_H
357
358