| /* | 
 | ********************************************************************** | 
 | * Copyright (C) 2016 and later: Unicode, Inc. and others. | 
 | * License & terms of use: http://www.unicode.org/copyright.html#License | 
 | ********************************************************************** | 
 | ********************************************************************** | 
 | * Copyright (c) 2002-2006, International Business Machines | 
 | * Corporation and others.  All Rights Reserved. | 
 | ********************************************************************** | 
 | ********************************************************************** | 
 | */ | 
 | #ifndef _CHARPERF_H | 
 | #define _CHARPERF_H | 
 |  | 
 | #include "unicode/uchar.h" | 
 |  | 
 | #include "unicode/uperf.h" | 
 | #include <stdlib.h> | 
 | #include <stdio.h> | 
 | #include <wchar.h> | 
 | #include <wctype.h> | 
 |  | 
 | typedef void (*CharPerfFn)(UChar32 ch); | 
 | typedef void (*StdLibCharPerfFn)(wchar_t ch); | 
 |  | 
 | class CharPerfFunction : public UPerfFunction | 
 | { | 
 | public: | 
 |     virtual void call(UErrorCode* status) | 
 |     { | 
 |         for (UChar32 i = MIN_; i < MAX_; i ++) { | 
 |             (*m_fn_)(i); | 
 |         } | 
 |     } | 
 |  | 
 |     virtual long getOperationsPerIteration() | 
 |     { | 
 |         return MAX_ - MIN_; | 
 |     } | 
 |     CharPerfFunction(CharPerfFn func, UChar32 min, UChar32 max) | 
 |     { | 
 |         m_fn_ = func; | 
 |         MIN_ = min; | 
 |         MAX_ = max; | 
 |     }    | 
 |  | 
 | private: | 
 |     CharPerfFn m_fn_; | 
 |     UChar32 MIN_; | 
 |     UChar32 MAX_; | 
 | };  | 
 |  | 
 | class StdLibCharPerfFunction : public UPerfFunction | 
 | { | 
 | public: | 
 |     virtual void call(UErrorCode* status) | 
 |     { | 
 |         // note wchar_t is unsigned, it will revert to 0 once it reaches  | 
 |         // 65535 | 
 |         for (wchar_t i = MIN_; i < MAX_; i ++) { | 
 |             (*m_fn_)(i); | 
 |         } | 
 |     } | 
 |  | 
 |     virtual long getOperationsPerIteration() | 
 |     { | 
 |         return MAX_ - MIN_; | 
 |     } | 
 |  | 
 |     StdLibCharPerfFunction(StdLibCharPerfFn func, wchar_t min, wchar_t max) | 
 |     { | 
 |         m_fn_ = func;			 | 
 |         MIN_ = min; | 
 |         MAX_ = max; | 
 |     }    | 
 |  | 
 |     ~StdLibCharPerfFunction() | 
 |     {			 | 
 |     } | 
 |  | 
 | private: | 
 |     StdLibCharPerfFn m_fn_; | 
 |     wchar_t MIN_; | 
 |     wchar_t MAX_; | 
 | }; | 
 |  | 
 | class CharPerformanceTest : public UPerfTest | 
 | { | 
 | public: | 
 |     CharPerformanceTest(int32_t argc, const char *argv[], UErrorCode &status); | 
 |     ~CharPerformanceTest(); | 
 |     virtual UPerfFunction* runIndexedTest(int32_t index, UBool exec, | 
 |         const char *&name,  | 
 |         char *par = NULL);      | 
 |     UPerfFunction* TestIsAlpha(); | 
 |     UPerfFunction* TestIsUpper(); | 
 |     UPerfFunction* TestIsLower(); | 
 |     UPerfFunction* TestIsDigit(); | 
 |     UPerfFunction* TestIsSpace(); | 
 |     UPerfFunction* TestIsAlphaNumeric(); | 
 |     UPerfFunction* TestIsPrint(); | 
 |     UPerfFunction* TestIsControl(); | 
 |     UPerfFunction* TestToLower(); | 
 |     UPerfFunction* TestToUpper(); | 
 |     UPerfFunction* TestIsWhiteSpace(); | 
 |     UPerfFunction* TestStdLibIsAlpha(); | 
 |     UPerfFunction* TestStdLibIsUpper(); | 
 |     UPerfFunction* TestStdLibIsLower(); | 
 |     UPerfFunction* TestStdLibIsDigit(); | 
 |     UPerfFunction* TestStdLibIsSpace(); | 
 |     UPerfFunction* TestStdLibIsAlphaNumeric(); | 
 |     UPerfFunction* TestStdLibIsPrint(); | 
 |     UPerfFunction* TestStdLibIsControl(); | 
 |     UPerfFunction* TestStdLibToLower(); | 
 |     UPerfFunction* TestStdLibToUpper(); | 
 |     UPerfFunction* TestStdLibIsWhiteSpace(); | 
 |  | 
 | private: | 
 |     UChar32 MIN_; | 
 |     UChar32 MAX_; | 
 | }; | 
 |  | 
 | inline void isAlpha(UChar32 ch)  | 
 | { | 
 |     u_isalpha(ch); | 
 | } | 
 |  | 
 | inline void isUpper(UChar32 ch) | 
 | { | 
 |     u_isupper(ch); | 
 | } | 
 |  | 
 | inline void isLower(UChar32 ch) | 
 | { | 
 |     u_islower(ch); | 
 | } | 
 |  | 
 | inline void isDigit(UChar32 ch) | 
 | { | 
 |     u_isdigit(ch); | 
 | } | 
 |  | 
 | inline void isSpace(UChar32 ch) | 
 | { | 
 |     u_isspace(ch); | 
 | } | 
 |  | 
 | inline void isAlphaNumeric(UChar32 ch) | 
 | { | 
 |     u_isalnum(ch); | 
 | } | 
 |  | 
 | /** | 
 | * This test may be different since c lib has a type PUNCT and it is printable. | 
 | * iswgraph is not used for testing since it is a subset of iswprint with the | 
 | * exception of returning true for white spaces. no match found in icu4c. | 
 | */ | 
 | inline void isPrint(UChar32 ch) | 
 | { | 
 |     u_isprint(ch); | 
 | } | 
 |  | 
 | inline void isControl(UChar32 ch) | 
 | { | 
 |     u_iscntrl(ch); | 
 | } | 
 |  | 
 | inline void toLower(UChar32 ch) | 
 | { | 
 |     u_tolower(ch); | 
 | } | 
 |  | 
 | inline void toUpper(UChar32 ch) | 
 | { | 
 |     u_toupper(ch); | 
 | } | 
 |  | 
 | inline void isWhiteSpace(UChar32 ch) | 
 | { | 
 |     u_isWhitespace(ch); | 
 | } | 
 |  | 
 | inline void StdLibIsAlpha(wchar_t ch) | 
 | { | 
 |     iswalpha(ch); | 
 | } | 
 |  | 
 | inline void StdLibIsUpper(wchar_t ch) | 
 | { | 
 |     iswupper(ch); | 
 | } | 
 |  | 
 | inline void StdLibIsLower(wchar_t ch) | 
 | { | 
 |     iswlower(ch); | 
 | } | 
 |  | 
 | inline void StdLibIsDigit(wchar_t ch) | 
 | { | 
 |     iswdigit(ch); | 
 | } | 
 |  | 
 | inline void StdLibIsSpace(wchar_t ch) | 
 | { | 
 |     iswspace(ch); | 
 | } | 
 |  | 
 | inline void StdLibIsAlphaNumeric(wchar_t ch) | 
 | { | 
 |     iswalnum(ch); | 
 | } | 
 |  | 
 | /** | 
 | * This test may be different since c lib has a type PUNCT and it is printable. | 
 | * iswgraph is not used for testing since it is a subset of iswprint with the | 
 | * exception of returning true for white spaces. no match found in icu4c. | 
 | */ | 
 | inline void StdLibIsPrint(wchar_t ch) | 
 | { | 
 |     iswprint(ch); | 
 | } | 
 |  | 
 | inline void StdLibIsControl(wchar_t ch) | 
 | { | 
 |     iswcntrl(ch); | 
 | } | 
 |  | 
 | inline void StdLibToLower(wchar_t ch) | 
 | { | 
 |     towlower(ch); | 
 | } | 
 |  | 
 | inline void StdLibToUpper(wchar_t ch) | 
 | { | 
 |     towupper(ch); | 
 | } | 
 |  | 
 | inline void StdLibIsWhiteSpace(wchar_t ch) | 
 | { | 
 |     iswspace(ch); | 
 | } | 
 |  | 
 | #endif // CHARPERF_H |