Home | History | Annotate | Download | only in normperf
      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-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:
     49     virtual void call(UErrorCode* status){
     50         if(line_mode==TRUE){
     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     }
     70     virtual long getOperationsPerIteration(){
     71         if(line_mode==TRUE){
     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     }
     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     }
     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:
    120     virtual void call(UErrorCode* status){
    121         if(line_mode==TRUE){
    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     }
    139     virtual long getOperationsPerIteration(){
    140         if(line_mode ==TRUE){
    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     }
    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     }
    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     }
    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 performnace */
    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 
    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 
    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 
    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 }
    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 
    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 
    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 }
    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 
    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 
    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 
    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 }
    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 
    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 
    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 
    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 
    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,src,srcLen,dest,dstLen);
    326 }
    327 
    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,src,srcLen,dest,dstLen);
    330 }
    331 
    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,src,srcLen,dest,dstLen);
    334 }
    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,src,srcLen,dest,dstLen);
    337 }
    338 #else
    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 
    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 
    347 int32_t WinNormNFKD(const UChar* src, int32_t srcLen, UChar* dest, int32_t dstLen, int32_t options, UErrorCode* status) {
    348     return 0;
    349 }
    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