[sword-cvs] icu-sword/source/test/perf/charperf CharPerf.pl,NONE,1.1 Makefile.in,NONE,1.1 charperf.cpp,NONE,1.1 charperf.dsp,NONE,1.1 charperf.h,NONE,1.1

sword@www.crosswire.org sword@www.crosswire.org
Tue, 9 Sep 2003 19:42:52 -0700


Update of /usr/local/cvsroot/icu-sword/source/test/perf/charperf
In directory www:/tmp/cvs-serv19862/source/test/perf/charperf

Added Files:
	CharPerf.pl Makefile.in charperf.cpp charperf.dsp charperf.h 
Log Message:
ICU 2.6 commit

--- NEW FILE: CharPerf.pl ---
#!/usr/bin/perl -w
#  ********************************************************************
#  * COPYRIGHT:
#  * Copyright (c) 2002, International Business Machines Corporation and
#  * others. All Rights Reserved.
#  ********************************************************************


use strict;

use lib '../perldriver';

use PerfFramework;

my $options = {
	       "title"=>"Character property performance: ICU vs. STDLib",
	       "headers"=>"StdLib ICU",
	       "operationIs"=>"code point",
	       "timePerOperationIs"=>"Time per code point",
	       "passes"=>"10",
	       "time"=>"5",
	       #"outputType"=>"HTML",
	       "dataDir"=>"c:/src/perf/data",
	       "outputDir"=>"../results"
	      };


# programs
# tests will be done for all the programs. Results will be stored and connected
my $p = "charperf.exe";

my $tests = { 
"isAlpha",        ["$p TestStdLibIsAlpha"        , "$p TestIsAlpha"        ],
"isUpper",        ["$p TestStdLibIsUpper"        , "$p TestIsUpper"        ],
"isLower",        ["$p TestStdLibIsLower"        , "$p TestIsLower"        ],	
"isDigit",        ["$p TestStdLibIsDigit"        , "$p TestIsDigit"        ],	
"isSpace",        ["$p TestStdLibIsSpace"        , "$p TestIsSpace"        ],	
"isAlphaNumeric", ["$p TestStdLibIsAlphaNumeric" , "$p TestIsAlphaNumeric" ],
"isPrint",        ["$p TestStdLibIsPrint"        , "$p TestIsPrint"        ],     
"isControl",      ["$p TestStdLibIsControl"      , "$p TestIsControl"      ],
"toLower",        ["$p TestStdLibToLower"        , "$p TestToLower"        ],     
"toUpper",        ["$p TestStdLibToUpper"        , "$p TestToUpper"        ],     
"isWhiteSpace",   ["$p TestStdLibIsWhiteSpace"   , "$p TestIsWhiteSpace"   ],
};

my $dataFiles;

runTests($options, $tests, $dataFiles);

--- NEW FILE: Makefile.in ---
## Makefile.in for ICU - test/ucharperf
## Copyright (c) 2001, International Business Machines Corporation and
## others. All Rights Reserved.

## Source directory information
srcdir = @srcdir@
top_srcdir = @top_srcdir@

top_builddir = ../..

include $(top_builddir)/icudefs.mk

## Platform-specific setup
include @platform_make_fragment@

## Build directory information
subdir = test/ucharperf

## Extra files to remove for 'make clean'
CLEANFILES = *~ $(DEPS)

## Target information
TARGET = ucharperf

DEFS = @DEFS@
CPPFLAGS = @CPPFLAGS@ -I$(top_builddir)/common -I$(top_srcdir)/common 
CFLAGS = @CFLAGS@
CXXFLAGS = @CXXFLAGS@
ENABLE_RPATH = @ENABLE_RPATH@
ifeq ($(ENABLE_RPATH),YES)
RPATHLDFLAGS = $(LD_RPATH)$(LD_RPATH_PRE)$(libdir)
endif
LDFLAGS = @LDFLAGS@ $(RPATHLDFLAGS)
LIBS = $(LIBICUUC) @LIBS@ @LIB_M@

OBJECTS = ucharperf.o

DEPS = $(OBJECTS:.o=.d)

## List of phony targets
.PHONY : all all-local install install-local clean clean-local	\
distclean distclean-local dist dist-local check check-local

## Clear suffix list
.SUFFIXES :

## List of standard targets
all: all-local
install: install-local
clean: clean-local
distclean : distclean-local
dist: dist-local
check: all check-local

all-local: $(TARGET)

install-local:

dist-local:

clean-local:
	test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES)
	$(RMV) $(OBJECTS) $(TARGET)

distclean-local: clean-local
	$(RMV) Makefile

check-local: all-local

Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
	cd $(top_builddir) \
	 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status

$(TARGET) : $(OBJECTS)
	$(LINK.cc) -o $@ $^ $(LIBS)

invoke:
	ICU_DATA=$${ICU_DATA:-$(top_builddir)/data/} TZ=PST8PDT $(INVOKE) $(INVOCATION)

ifeq (,$(MAKECMDGOALS))
-include $(DEPS)
else
ifneq ($(patsubst %clean,,$(MAKECMDGOALS)),)
ifneq ($(patsubst %install,,$(MAKECMDGOALS)),)
-include $(DEPS)
endif
endif
endif


--- NEW FILE: charperf.cpp ---
/********************************************************************
 * COPYRIGHT:
 * Copyright (C) 2002 IBM, Inc.   All Rights Reserved.
 *
 ********************************************************************/
/*****************************************************************************
* File charperf.cpp
*
* Modification History:
* Name                     Description
* Syn Wee Quek             First Version
******************************************************************************
*/

/** 
 * This program tests character properties performance.
 * APIs tested: 
 * ICU4C 
 * Windows
 */

#include "charperf.h"
#include "uoptions.h"

UOption options[] = {
						UOPTION_DEF("min", 'n', UOPT_REQUIRES_ARG),
						UOPTION_DEF("min", 'x', UOPT_REQUIRES_ARG),
					};
int MIN_OPTION_ = 0;
int MAX_OPTION_ = 1;

int main(int argc, const char *argv[])
{
    UErrorCode status = U_ZERO_ERROR;
    CharPerformanceTest test(argc, argv, status);
	if (U_FAILURE(status)){
        return status;
    }
    if (test.run() == FALSE){
        fprintf(stderr, "FAILED: Tests could not be run please check the "
			            "arguments.\n");
        return -1;
    }
    return 0;
}

CharPerformanceTest::CharPerformanceTest(int32_t argc, const char *argv[],
										 UErrorCode &status)
										: UPerfTest(argc, argv, status)
{
	if (status== U_ILLEGAL_ARGUMENT_ERROR){
       fprintf(stderr,gUsageString, "charperf");
       return;
    }
    if (U_FAILURE(status)){
        fprintf(stderr, "FAILED to create UPerfTest object. Error: %s\n", 
			    u_errorName(status));
        return;
    }

	if (_remainingArgc < 0) {
		// that means there are some -names not matched in the super class
		// first tag is always skipped in u_parseArgs
		int size = - _remainingArgc;
		argv += argc - size;
		argc = size;
		_remainingArgc = u_parseArgs(argc, (char**)argv, 
			        (int32_t)(sizeof(options)/sizeof(options[0])), options);
	}
	MIN_ = 0;
    MAX_ = 0xffff;

	if (options[MIN_OPTION_].doesOccur) {
		MIN_ = atoi(options[MIN_OPTION_].value);
	}
	if (options[MAX_OPTION_].doesOccur) {
		MAX_ = atoi(options[MAX_OPTION_].value);
	}
}

CharPerformanceTest::~CharPerformanceTest()
{
}

UPerfFunction* CharPerformanceTest::runIndexedTest(int32_t index, UBool exec,
												   const char *&name, 
												   char* par) 
{
    switch (index) {
        TESTCASE(0, TestIsAlpha);
		TESTCASE(1, TestIsUpper);
		TESTCASE(2, TestIsLower);
		TESTCASE(3, TestIsDigit);
		TESTCASE(4, TestIsSpace);
		TESTCASE(5, TestIsAlphaNumeric);
		TESTCASE(6, TestIsPrint);
		TESTCASE(7, TestIsControl);
		TESTCASE(8, TestToLower);
		TESTCASE(9, TestToUpper);
		TESTCASE(10, TestIsWhiteSpace);
		TESTCASE(11, TestStdLibIsAlpha);
		TESTCASE(12, TestStdLibIsUpper);
		TESTCASE(13, TestStdLibIsLower);
		TESTCASE(14, TestStdLibIsDigit);
		TESTCASE(15, TestStdLibIsSpace);
		TESTCASE(16, TestStdLibIsAlphaNumeric);
		TESTCASE(17, TestStdLibIsPrint);
		TESTCASE(18, TestStdLibIsControl);
		TESTCASE(19, TestStdLibToLower);
		TESTCASE(20, TestStdLibToUpper);
		TESTCASE(21, TestStdLibIsWhiteSpace);
        default: 
            name = ""; 
            return NULL;
    }
    return NULL;
}

UPerfFunction* CharPerformanceTest::TestIsAlpha()
{
	return new CharPerfFunction(isAlpha, MIN_, MAX_);
}

UPerfFunction* CharPerformanceTest::TestIsUpper()
{
	return new CharPerfFunction(isUpper, MIN_, MAX_);
}

UPerfFunction* CharPerformanceTest::TestIsLower()
{
	return new CharPerfFunction(isLower, MIN_, MAX_);
}

UPerfFunction* CharPerformanceTest::TestIsDigit()
{
	return new CharPerfFunction(isDigit, MIN_, MAX_);
}

UPerfFunction* CharPerformanceTest::TestIsSpace()
{
	return new CharPerfFunction(isSpace, MIN_, MAX_);
}

UPerfFunction* CharPerformanceTest::TestIsAlphaNumeric()
{
	return new CharPerfFunction(isAlphaNumeric, MIN_, MAX_);
}

/**
 * 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.
 */
UPerfFunction* CharPerformanceTest::TestIsPrint()
{
	return new CharPerfFunction(isPrint, MIN_, MAX_);
}

UPerfFunction* CharPerformanceTest::TestIsControl()
{
	return new CharPerfFunction(isControl, MIN_, MAX_);
}

UPerfFunction* CharPerformanceTest::TestToLower()
{
	return new CharPerfFunction(toLower, MIN_, MAX_);
}

UPerfFunction* CharPerformanceTest::TestToUpper()
{
	return new CharPerfFunction(toUpper, MIN_, MAX_);
}

UPerfFunction* CharPerformanceTest::TestIsWhiteSpace()
{
	return new CharPerfFunction(isWhiteSpace, MIN_, MAX_);
}

UPerfFunction* CharPerformanceTest::TestStdLibIsAlpha()
{
	return new StdLibCharPerfFunction(StdLibIsAlpha, (wchar_t)MIN_, 
		                              (wchar_t)MAX_);
}

UPerfFunction* CharPerformanceTest::TestStdLibIsUpper()
{
	return new StdLibCharPerfFunction(StdLibIsUpper, (wchar_t)MIN_, 
		                              (wchar_t)MAX_);
}

UPerfFunction* CharPerformanceTest::TestStdLibIsLower()
{
	return new StdLibCharPerfFunction(StdLibIsLower, (wchar_t)MIN_, 
		                              (wchar_t)MAX_);
}

UPerfFunction* CharPerformanceTest::TestStdLibIsDigit()
{
	return new StdLibCharPerfFunction(StdLibIsDigit, (wchar_t)MIN_, 
		                              (wchar_t)MAX_);
}

UPerfFunction* CharPerformanceTest::TestStdLibIsSpace()
{
	return new StdLibCharPerfFunction(StdLibIsSpace, (wchar_t)MIN_, 
		                              (wchar_t)MAX_);
}

UPerfFunction* CharPerformanceTest::TestStdLibIsAlphaNumeric()
{
	return new StdLibCharPerfFunction(StdLibIsAlphaNumeric, (wchar_t)MIN_, 
		                              (wchar_t)MAX_);
}

/**
 * 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.
 */
UPerfFunction* CharPerformanceTest::TestStdLibIsPrint()
{
	return new StdLibCharPerfFunction(StdLibIsPrint, (wchar_t)MIN_, 
		                              (wchar_t)MAX_);
}

UPerfFunction* CharPerformanceTest::TestStdLibIsControl()
{
	return new StdLibCharPerfFunction(StdLibIsControl, (wchar_t)MIN_, 
		                              (wchar_t)MAX_);
}

UPerfFunction* CharPerformanceTest::TestStdLibToLower()
{
	return new StdLibCharPerfFunction(StdLibToLower, (wchar_t)MIN_, 
		                              (wchar_t)MAX_);
}

UPerfFunction* CharPerformanceTest::TestStdLibToUpper()
{
	return new StdLibCharPerfFunction(StdLibToUpper, (wchar_t)MIN_, 
		                              (wchar_t)MAX_);
}

UPerfFunction* CharPerformanceTest::TestStdLibIsWhiteSpace()
{
	return new StdLibCharPerfFunction(StdLibIsWhiteSpace, (wchar_t)MIN_, 
		                              (wchar_t)MAX_);
}

--- NEW FILE: charperf.dsp ---
# Microsoft Developer Studio Project File - Name="charperf" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **

# TARGTYPE "Win32 (x86) Console Application" 0x0103

CFG=charperf - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE 
!MESSAGE NMAKE /f "charperf.mak".
!MESSAGE 
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE 
!MESSAGE NMAKE /f "charperf.mak" CFG="charperf - Win32 Debug"
!MESSAGE 
!MESSAGE Possible choices for configuration are:
!MESSAGE 
!MESSAGE "charperf - Win32 Release" (based on "Win32 (x86) Console Application")
!MESSAGE "charperf - Win32 Debug" (based on "Win32 (x86) Console Application")
!MESSAGE 

# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
RSC=rc.exe

!IF  "$(CFG)" == "charperf - Win32 Release"

# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
MTL=midl.exe
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\..\..\include" /I "..\..\..\tools\toolutil" /I "..\..\..\common" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# SUBTRACT CPP /Fr
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
# ADD LINK32 icuuc.lib icutu.lib winmm.lib /nologo /subsystem:console /machine:I386 /libpath:"..\..\..\..\lib"

!ELSEIF  "$(CFG)" == "charperf - Win32 Debug"

# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
MTL=midl.exe
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\..\..\include" /I "..\..\..\tools\toolutil" /I "..\..\..\common" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /GZ /c
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
# ADD LINK32 icuucd.lib icutud.lib winmm.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\..\lib\\"

!ENDIF 

# Begin Target

# Name "charperf - Win32 Release"
# Name "charperf - Win32 Debug"
# Begin Group "Source Files"

# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File

SOURCE=.\charperf.cpp
# End Source File
# End Group
# Begin Group "Header Files"

# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File

SOURCE=.\charperf.h
# End Source File
# End Group
# Begin Group "Resource Files"

# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
# End Group
# End Target
# End Project

--- NEW FILE: charperf.h ---
/*
**********************************************************************
* Copyright (c) 2002, International Business Machines
* Corporation and others.  All Rights Reserved.
**********************************************************************
**********************************************************************
*/
#ifndef _CHARPERF_H
#define _CHARPERF_H

#include "uperf.h"
#include "unicode/uchar.h"
#include <stdlib.h>
#include <stdio.h>
#include <wchar.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