Home | History | Annotate | Download | only in charperf
      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:
     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 
     43 private:
     44     CharPerfFn m_fn_;
     45     UChar32 MIN_;
     46     UChar32 MAX_;
     47 };
     48 
     49 class StdLibCharPerfFunction : public UPerfFunction
     50 {
     51 public:
     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 
     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 
    119 inline void isAlpha(UChar32 ch)
    120 {
    121     u_isalpha(ch);
    122 }
    123 
    124 inline void isUpper(UChar32 ch)
    125 {
    126     u_isupper(ch);
    127 }
    128 
    129 inline void isLower(UChar32 ch)
    130 {
    131     u_islower(ch);
    132 }
    133 
    134 inline void isDigit(UChar32 ch)
    135 {
    136     u_isdigit(ch);
    137 }
    138 
    139 inline void isSpace(UChar32 ch)
    140 {
    141     u_isspace(ch);
    142 }
    143 
    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 */
    154 inline void isPrint(UChar32 ch)
    155 {
    156     u_isprint(ch);
    157 }
    158 
    159 inline void isControl(UChar32 ch)
    160 {
    161     u_iscntrl(ch);
    162 }
    163 
    164 inline void toLower(UChar32 ch)
    165 {
    166     u_tolower(ch);
    167 }
    168 
    169 inline void toUpper(UChar32 ch)
    170 {
    171     u_toupper(ch);
    172 }
    173 
    174 inline void isWhiteSpace(UChar32 ch)
    175 {
    176     u_isWhitespace(ch);
    177 }
    178 
    179 inline void StdLibIsAlpha(wchar_t ch)
    180 {
    181     iswalpha(ch);
    182 }
    183 
    184 inline void StdLibIsUpper(wchar_t ch)
    185 {
    186     iswupper(ch);
    187 }
    188 
    189 inline void StdLibIsLower(wchar_t ch)
    190 {
    191     iswlower(ch);
    192 }
    193 
    194 inline void StdLibIsDigit(wchar_t ch)
    195 {
    196     iswdigit(ch);
    197 }
    198 
    199 inline void StdLibIsSpace(wchar_t ch)
    200 {
    201     iswspace(ch);
    202 }
    203 
    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 */
    214 inline void StdLibIsPrint(wchar_t ch)
    215 {
    216     iswprint(ch);
    217 }
    218 
    219 inline void StdLibIsControl(wchar_t ch)
    220 {
    221     iswcntrl(ch);
    222 }
    223 
    224 inline void StdLibToLower(wchar_t ch)
    225 {
    226     towlower(ch);
    227 }
    228 
    229 inline void StdLibToUpper(wchar_t ch)
    230 {
    231     towupper(ch);
    232 }
    233 
    234 inline void StdLibIsWhiteSpace(wchar_t ch)
    235 {
    236     iswspace(ch);
    237 }
    238 
    239 #endif // CHARPERF_H
    240