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