#include #include #include #include "NFStringGenericConversion.h" namespace Nave { unsigned int Hash(const WCHAR* str) { //wchar_t* p=const_cast(str); <-- //replaced this, we shouldnt be doing const_cast's for no reason @juhnu const WCHAR* p=str; unsigned int hashcode=0; wchar_t c=0; while(*p) { c=*p; hashcode=(31*hashcode+(c%31))%64000000; ++p; } return hashcode; } unsigned int Hash(const CHAR* str) { //wchar_t* p=const_cast(str); <-- //replaced this, we shouldnt be doing const_cast's for no reason @juhnu const CHAR* p=str; unsigned int hashcode=0; wchar_t c=0; while(*p) { c=*p; hashcode=(31*hashcode+(c%31))%64000000; ++p; } return hashcode; } template<> std::string To(const wchar_t* wstr) { //int iWstrSize = (int)wcslen(wstr); int iSize = WideCharToMultiByte(CP_ACP,0,wstr,-1,NULL,0,NULL,NULL); std::string str(iSize -1, 0); ::WideCharToMultiByte(CP_ACP, 0, wstr, -1, &str[0], iSize, NULL, NULL); return str; } template<> std::wstring To(const wchar_t* wstr) { //int iWstrSize = (int)wcslen(wstr); std::wstring tstr(wstr); return tstr; } template <> std::string To(const wstringIteratorPair& StrPair) { //int iWstrSize = (int)(StrPair.second - StrPair.first); int iSize = WideCharToMultiByte(CP_ACP,0,&(*StrPair.first), -1 ,NULL,0,NULL,NULL); //int iSize = (int)(StrPair.second - StrPair.first); std::string str(iSize -1, 0); ::WideCharToMultiByte(CP_ACP, 0, &(*StrPair.first), -1, &str[0], iSize, NULL, NULL); return str; } template<> std::string To(const char* str) { std::string tstr(str); return tstr; } template<> std::wstring To(const char* str) { //int iStrSize = (int)strlen(str); int iSize = MultiByteToWideChar(CP_ACP,0,str,-1,NULL,0); //int iSize = (int)strlen(str); std::wstring wstr(iSize-1, 0); ::MultiByteToWideChar(CP_ACP, 0, str, -1, &wstr[0], iSize); return wstr; } template <> std::wstring To(const stringIteratorPair& StrPair) { //int iStrSize =(int)(StrPair.second - StrPair.first); int iSize = MultiByteToWideChar(CP_ACP,0,&(*StrPair.first),-1,NULL,0); //int iSize = (int)(StrPair.second - StrPair.first); std::wstring wstr(iSize-1, 0); ::MultiByteToWideChar(CP_ACP, 0, &(*StrPair.first), -1, &wstr[0], iSize); return wstr; } template <> std::string To(int value) { char szBuffer[12]; //mamximum 10 + 1 sign + 1 null. _itoa(value, szBuffer, 10); return std::string(szBuffer); } template <> std::wstring To(int value) { wchar_t wszBuffer[12]; _itow(value, wszBuffer, 10); return std::wstring(wszBuffer); } template <> std::string To(short value) { char szBuffer[12]; _itoa((int)value, szBuffer, 10); return std::string(szBuffer); } template <> std::wstring To(short value) { wchar_t wszBuffer[12]; _itow((int)value, wszBuffer, 10); return std::wstring(wszBuffer); } template <> std::string To(unsigned short value) { char szBuffer[12]; _itoa((int)value, szBuffer, 10); return std::string(szBuffer); } template <> std::wstring To(unsigned short value) { wchar_t wszBuffer[12]; _itow((int)value, wszBuffer, 10); return std::wstring(wszBuffer); } template <> std::string To(unsigned int value) { char szBuffer[24]; _ui64toa((unsigned long)value, szBuffer, 10); return std::string(szBuffer); } template <> std::wstring To(unsigned int value) { wchar_t wszBuffer[24]; _ui64tow((unsigned long)value, wszBuffer, 10); return std::wstring(wszBuffer); } template <> std::string To(__int64 value) { char szBuffer[24]; _i64toa((unsigned long)value, szBuffer, 10); return std::string(szBuffer); } template <> std::wstring To(__int64 value) { wchar_t wszBuffer[24]; _ui64tow((unsigned long)value, wszBuffer, 10); return std::wstring(wszBuffer); } template <> std::string To(unsigned __int64 value) { char szBuffer[24]; _ui64toa((unsigned long)value, szBuffer, 10); return std::string(szBuffer); } template <> std::wstring To(unsigned __int64 value) { wchar_t wszBuffer[24]; _ui64tow((unsigned long)value, wszBuffer, 10); return std::wstring(wszBuffer); } template <> std::string To(long value) { char szBuffer[48]; _i64toa(value, szBuffer, 10); return std::string(szBuffer); } template <> std::wstring To(long value) { wchar_t wszBuffer[48]; _i64tow(value, wszBuffer, 10); return std::wstring(wszBuffer); } template <> std::string To(unsigned long value) { char szBuffer[100]; _ui64toa(value, szBuffer, 10); return std::string(szBuffer); } template <> std::wstring To(unsigned long value) { wchar_t wszBuffer[100]; _ui64tow(value, wszBuffer, 10); return std::wstring(wszBuffer); } template <> std::string To(float value) { char szBuffer[100]; sprintf(szBuffer, "%f", value); return std::string(szBuffer); } template <> std::wstring To(float value) { wchar_t wszBuffer[100]; swprintf(wszBuffer, L"%f", value); return std::wstring(wszBuffer); } template <> std::string To(double value) { char szBuffer[100]; sprintf(szBuffer, "%f", value); return std::string(szBuffer); } template <> std::wstring To(double value) { wchar_t wszBuffer[100]; swprintf(wszBuffer, L"%f", value); return std::wstring(wszBuffer); } template <> std::string To(float2 value) { char szBuffer[100*3]; sprintf(szBuffer, "(%f, %f)", value.x, value.y); return std::string(szBuffer); } template <> std::wstring To(float2 value) { wchar_t wszBuffer[100*3]; swprintf(wszBuffer, L"(%f, %f)", value.x, value.y); return std::wstring(wszBuffer); } template <> std::string To(float3 value) { char szBuffer[100*4]; sprintf(szBuffer, "(%f, %f, %f)", value.x, value.y, value.z); return std::string(szBuffer); } template <> std::wstring To(float3 value) { wchar_t wszBuffer[100*4]; swprintf(wszBuffer, L"(%f, %f, %f)", value.x, value.y, value.z); return std::wstring(wszBuffer); } template <> std::string To(float4 value) { char szBuffer[100*4]; sprintf(szBuffer, "(%f, %f, %f, %f)", value.x, value.y, value.z, value.w); return std::string(szBuffer); } template <> std::wstring To(float4 value) { wchar_t wszBuffer[100*4]; swprintf(wszBuffer, L"(%f, %f, %f, %f)", value.x, value.y, value.z, value.w); return std::wstring(wszBuffer); } template <> double To(const char* str) { return atof(str); } template <> double To(const stringIteratorPair& StrPair) { return To(std::string(StrPair.first, StrPair.second)); } template <> float To(const char* str) { return (float)To(str); } template <> float To(const stringIteratorPair& StrPair) { return (float)To(StrPair); } template <> int To(const char* str) { return atoi(str); } template <> int To(const stringIteratorPair& StrPair) { return To(std::string(StrPair.first, StrPair.second)); } template <> double To(const wchar_t* wstr) { return _wtof(wstr); } template <> double To(const wstringIteratorPair& StrPair) { return To(std::wstring(StrPair.first, StrPair.second)); } template <> float To(const wchar_t* wstr) { return (float)To(wstr); } template <> float To(const wstringIteratorPair& StrPair) { return (float)To(StrPair); } template <> int To(const wchar_t* str) { return _wtoi(str); } template <> int To(const wstringIteratorPair& StrPair) { return To(std::wstring(StrPair.first, StrPair.second)); } /* template <> short To(const wchar_t* str) { return (short)_wtoi(str); } template <> short To(const wstringIteratorPair& StrPair) { return To(std::wstring(StrPair.first, StrPair.second)); } template <> long To(const wchar_t* str) { return _wtol(str); } template <> long To(const wstringIteratorPair& StrPair) { return To(std::wstring(StrPair.first, StrPair.second)); } template <> unsigned int To(const wchar_t* str) { return (unsigned int)_wtoi(str); } template <> unsigned int To(const wstringIteratorPair& StrPair) { return To(std::wstring(StrPair.first, StrPair.second)); } template <> unsigned short To(const wchar_t* str) { return (unsigned short)_wtoi(str); } template <> unsigned short To(const wstringIteratorPair& StrPair) { return To(std::wstring(StrPair.first, StrPair.second)); } template <> unsigned long To(const wchar_t* str) { return (unsigned long)_wtol(str); } template <> unsigned long To(const wstringIteratorPair& StrPair) { return To(std::wstring(StrPair.first, StrPair.second)); } */ namespace Private { template class Tokens {}; template<> class Tokens { public: static const char Minus = '-'; static const char LeftParenthesis = '('; static const char RightParenthesis = ')'; static const char Comma = ','; static const char Point = '.'; static const char Null = '\0'; static const char Zero = '0'; static const char Nine = '9'; static const char Space = ' '; static const char Tab = '\t'; static const char LineFeed = '\n'; static const char CarriageReturn = '\r'; }; template<> class Tokens { public: static const wchar_t Minus = L'-'; static const wchar_t LeftParenthesis = L'('; static const wchar_t RightParenthesis = L')'; static const wchar_t Comma = L','; static const wchar_t Point = L'.'; static const wchar_t Null = L'\0'; static const wchar_t Zero = L'0'; static const wchar_t Nine = L'9'; static const wchar_t Space = L' '; static const wchar_t Tab = L'\t'; static const wchar_t LineFeed = L'\n'; static const wchar_t CarriageReturn = L'\r'; }; template BOOL GetToken(T** pStr, T tToken) { if( **pStr == tToken ) { (*pStr)++; return TRUE; } return FALSE; } template BOOL IsNumber(T tChar) { return (Tokens::Zero <= tChar && tChar <= Tokens::Nine) ? TRUE : FALSE; } template BOOL IsWhiteSpace(T tChar) { return (tChar == Tokens::Space || tChar == Tokens::Tab || tChar == Tokens::LineFeed || tChar == Tokens::CarriageReturn) ? TRUE : FALSE; } template void SkipWhitespace(T** pStr) { while( IsWhiteSpace(**pStr) ) (*pStr)++; } template void SkipNumbers(T** pStr) { while( IsNumber(**pStr) ) (*pStr)++; } template void SkipFloat(T** pStr) { //sign GetToken(pStr, Tokens::Minus); //number before point SkipNumbers(pStr); //point GetToken(pStr, Tokens::Point); //number after point SkipNumbers(pStr); } } template <> float2 To(const char* str) { using namespace Private; float2 ret; char* pRead = const_cast(str); //( SkipWhitespace(&pRead); if( !GetToken(&pRead, '(') ) return ret; //x SkipWhitespace(&pRead); ret.x = To(pRead); SkipFloat(&pRead); //, SkipWhitespace(&pRead); if( !GetToken(&pRead, ',') ) return ret; //y SkipWhitespace(&pRead); ret.y = To(pRead); SkipFloat(&pRead); //need not check ) return ret; } template<> float2 To(const stringIteratorPair &StrPair) { return To(std::string(StrPair.first, StrPair.second).c_str()); } template <> float3 To(const char* str) { using namespace Private; float3 ret; char* pRead = const_cast(str); //( SkipWhitespace(&pRead); if( !GetToken(&pRead, '(') ) return ret; //x SkipWhitespace(&pRead); ret.x = To(pRead); SkipFloat(&pRead); //, SkipWhitespace(&pRead); if( !GetToken(&pRead, ',') ) return ret; //y SkipWhitespace(&pRead); ret.y = To(pRead); SkipFloat(&pRead); //, SkipWhitespace(&pRead); if( !GetToken(&pRead, ',') ) return ret; //z SkipWhitespace(&pRead); ret.z = To(pRead); SkipFloat(&pRead); //need not check ) return ret; } template<> float3 To(const stringIteratorPair &StrPair) { return To(std::string(StrPair.first, StrPair.second).c_str()); } template <> float4 To(const char* str) { using namespace Private; float4 ret; char* pRead = const_cast(str); //( SkipWhitespace(&pRead); if( !GetToken(&pRead, '(') ) return ret; //x SkipWhitespace(&pRead); ret.x = To(pRead); SkipFloat(&pRead); //, SkipWhitespace(&pRead); if( !GetToken(&pRead, ',') ) return ret; //y SkipWhitespace(&pRead); ret.y = To(pRead); SkipFloat(&pRead); //, SkipWhitespace(&pRead); if( !GetToken(&pRead, ',') ) return ret; //z SkipWhitespace(&pRead); ret.z = To(pRead); SkipFloat(&pRead); //, SkipWhitespace(&pRead); if( !GetToken(&pRead, ',') ) return ret; //w SkipWhitespace(&pRead); ret.w = To(pRead); SkipFloat(&pRead); //need not check ) return ret; } template<> float4 To(const stringIteratorPair &StrPair) { return To(std::string(StrPair.first, StrPair.second).c_str()); } template <> float2 To(const wchar_t* str) { using namespace Private; float2 ret; wchar_t* pRead = const_cast(str); //( SkipWhitespace(&pRead); if( !GetToken(&pRead, L'(') ) return ret; //x SkipWhitespace(&pRead); ret.x = To(pRead); SkipFloat(&pRead); //, SkipWhitespace(&pRead); if( !GetToken(&pRead, L',') ) return ret; //y SkipWhitespace(&pRead); ret.y = To(pRead); SkipFloat(&pRead); //need not check ) return ret; } template<> float2 To(const wstringIteratorPair &StrPair) { return To(std::wstring(StrPair.first, StrPair.second).c_str()); } template <> float3 To(const wchar_t* str) { using namespace Private; float3 ret; wchar_t* pRead = const_cast(str); //( SkipWhitespace(&pRead); if( !GetToken(&pRead, L'(') ) return ret; //x SkipWhitespace(&pRead); ret.x = To(pRead); SkipFloat(&pRead); //, SkipWhitespace(&pRead); if( !GetToken(&pRead, L',') ) return ret; //y SkipWhitespace(&pRead); ret.y = To(pRead); SkipFloat(&pRead); //, SkipWhitespace(&pRead); if( !GetToken(&pRead, L',') ) return ret; //z SkipWhitespace(&pRead); ret.z = To(pRead); SkipFloat(&pRead); //need not check ) return ret; } template<> float3 To(const wstringIteratorPair &StrPair) { return To(std::wstring(StrPair.first, StrPair.second).c_str()); } template <> float4 To(const wchar_t* str) { using namespace Private; float4 ret; wchar_t* pRead = const_cast(str); //( SkipWhitespace(&pRead); if( !GetToken(&pRead, L'(') ) return ret; //x SkipWhitespace(&pRead); ret.x = To(pRead); SkipFloat(&pRead); //, SkipWhitespace(&pRead); if( !GetToken(&pRead, L',') ) return ret; //y SkipWhitespace(&pRead); ret.y = To(pRead); SkipFloat(&pRead); //, SkipWhitespace(&pRead); if( !GetToken(&pRead, L',') ) return ret; //z SkipWhitespace(&pRead); ret.z = To(pRead); SkipFloat(&pRead); //, SkipWhitespace(&pRead); if( !GetToken(&pRead, L',') ) return ret; //w SkipWhitespace(&pRead); ret.w = To(pRead); SkipFloat(&pRead); //need not check ) return ret; } template<> float4 To(const wstringIteratorPair &StrPair) { return To(std::wstring(StrPair.first, StrPair.second).c_str()); } }