/* * mptStringParse.h * ---------------- * Purpose: Convert strings to other types. * Notes : (currently none) * Authors: OpenMPT Devs * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. */ #pragma once #include "openmpt/all/BuildSettings.hpp" OPENMPT_NAMESPACE_BEGIN bool ConvertStrToBool(const std::string &str); signed char ConvertStrToSignedChar(const std::string &str); unsigned char ConvertStrToUnsignedChar(const std::string &str); signed short ConvertStrToSignedShort(const std::string &str); unsigned short ConvertStrToUnsignedShort(const std::string &str); signed int ConvertStrToSignedInt(const std::string &str); unsigned int ConvertStrToUnsignedInt(const std::string &str); signed long ConvertStrToSignedLong(const std::string &str); unsigned long ConvertStrToUnsignedLong(const std::string &str); signed long long ConvertStrToSignedLongLong(const std::string &str); unsigned long long ConvertStrToUnsignedLongLong(const std::string &str); float ConvertStrToFloat(const std::string &str); double ConvertStrToDouble(const std::string &str); long double ConvertStrToLongDouble(const std::string &str); template inline T ConvertStrTo(const std::string &str); // not defined, generates compiler error for non-specialized types template<> inline std::string ConvertStrTo(const std::string &str) { return str; } template<> inline bool ConvertStrTo(const std::string &str) { return ConvertStrToBool(str); } template<> inline signed char ConvertStrTo(const std::string &str) { return ConvertStrToSignedChar(str); } template<> inline unsigned char ConvertStrTo(const std::string &str) { return ConvertStrToUnsignedChar(str); } template<> inline signed short ConvertStrTo(const std::string &str) { return ConvertStrToSignedShort(str); } template<> inline unsigned short ConvertStrTo(const std::string &str) { return ConvertStrToUnsignedShort(str); } template<> inline signed int ConvertStrTo(const std::string &str) { return ConvertStrToSignedInt(str); } template<> inline unsigned int ConvertStrTo(const std::string &str) { return ConvertStrToUnsignedInt(str); } template<> inline signed long ConvertStrTo(const std::string &str) { return ConvertStrToSignedLong(str); } template<> inline unsigned long ConvertStrTo(const std::string &str) { return ConvertStrToUnsignedLong(str); } template<> inline signed long long ConvertStrTo(const std::string &str) { return ConvertStrToSignedLongLong(str); } template<> inline unsigned long long ConvertStrTo(const std::string &str) { return ConvertStrToUnsignedLongLong(str); } template<> inline float ConvertStrTo(const std::string &str) { return ConvertStrToFloat(str); } template<> inline double ConvertStrTo(const std::string &str) { return ConvertStrToDouble(str); } template<> inline long double ConvertStrTo(const std::string &str) { return ConvertStrToLongDouble(str); } #if MPT_WSTRING_FORMAT bool ConvertStrToBool(const std::wstring &str); signed char ConvertStrToSignedChar(const std::wstring &str); unsigned char ConvertStrToUnsignedChar(const std::wstring &str); signed short ConvertStrToSignedShort(const std::wstring &str); unsigned short ConvertStrToUnsignedShort(const std::wstring &str); signed int ConvertStrToSignedInt(const std::wstring &str); unsigned int ConvertStrToUnsignedInt(const std::wstring &str); signed long ConvertStrToSignedLong(const std::wstring &str); unsigned long ConvertStrToUnsignedLong(const std::wstring &str); signed long long ConvertStrToSignedLongLong(const std::wstring &str); unsigned long long ConvertStrToUnsignedLongLong(const std::wstring &str); float ConvertStrToFloat(const std::wstring &str); double ConvertStrToDouble(const std::wstring &str); long double ConvertStrToLongDouble(const std::wstring &str); template inline T ConvertStrTo(const std::wstring &str); // not defined, generates compiler error for non-specialized types template<> inline std::wstring ConvertStrTo(const std::wstring &str) { return str; } template<> inline bool ConvertStrTo(const std::wstring &str) { return ConvertStrToBool(str); } template<> inline signed char ConvertStrTo(const std::wstring &str) { return ConvertStrToSignedChar(str); } template<> inline unsigned char ConvertStrTo(const std::wstring &str) { return ConvertStrToUnsignedChar(str); } template<> inline signed short ConvertStrTo(const std::wstring &str) { return ConvertStrToSignedShort(str); } template<> inline unsigned short ConvertStrTo(const std::wstring &str) { return ConvertStrToUnsignedShort(str); } template<> inline signed int ConvertStrTo(const std::wstring &str) { return ConvertStrToSignedInt(str); } template<> inline unsigned int ConvertStrTo(const std::wstring &str) { return ConvertStrToUnsignedInt(str); } template<> inline signed long ConvertStrTo(const std::wstring &str) { return ConvertStrToSignedLong(str); } template<> inline unsigned long ConvertStrTo(const std::wstring &str) { return ConvertStrToUnsignedLong(str); } template<> inline signed long long ConvertStrTo(const std::wstring &str) { return ConvertStrToSignedLongLong(str); } template<> inline unsigned long long ConvertStrTo(const std::wstring &str) { return ConvertStrToUnsignedLongLong(str); } template<> inline float ConvertStrTo(const std::wstring &str) { return ConvertStrToFloat(str); } template<> inline double ConvertStrTo(const std::wstring &str) { return ConvertStrToDouble(str); } template<> inline long double ConvertStrTo(const std::wstring &str) { return ConvertStrToLongDouble(str); } #endif #if defined(MPT_WITH_MFC) template inline T ConvertStrTo(const CString &str) { #if defined(UNICODE) && MPT_WSTRING_FORMAT return ConvertStrTo(mpt::ToWide(str)); #elif defined(UNICODE) return ConvertStrTo(mpt::ToCharset(mpt::Charset::UTF8, str)); #else // !UNICODE return ConvertStrTo(mpt::ToCharset(mpt::Charset::Locale, str)); #endif // UNICODE } #endif // MPT_WITH_MFC template inline T ConvertStrTo(const char *str) { if(!str) { return T(); } return ConvertStrTo(std::string(str)); } #if MPT_WSTRING_FORMAT #if MPT_USTRING_MODE_UTF8 template<> inline mpt::ustring ConvertStrTo(const std::wstring &str) { return mpt::ToUnicode(str); } #endif template inline T ConvertStrTo(const wchar_t *str) { if(!str) { return T(); } return ConvertStrTo(std::wstring(str)); } #endif #if MPT_USTRING_MODE_UTF8 template inline T ConvertStrTo(const mpt::ustring &str) { return ConvertStrTo(mpt::ToCharset(mpt::Charset::UTF8, str)); } template<> inline mpt::ustring ConvertStrTo(const mpt::ustring &str) { return str; } #if MPT_WSTRING_CONVERT template<> inline std::wstring ConvertStrTo(const mpt::ustring &str) { return mpt::ToWide(str); } #endif #endif #if defined(MPT_ENABLE_CHARSET_LOCALE) template inline T ConvertStrTo(const mpt::lstring &str) { return ConvertStrTo(mpt::ToCharset(mpt::Charset::Locale, str)); } template<> inline mpt::lstring ConvertStrTo(const mpt::lstring &str) { return str; } #endif namespace mpt { namespace String { namespace Parse { unsigned char HexToUnsignedChar(const std::string &str); unsigned short HexToUnsignedShort(const std::string &str); unsigned int HexToUnsignedInt(const std::string &str); unsigned long HexToUnsignedLong(const std::string &str); unsigned long long HexToUnsignedLongLong(const std::string &str); template inline T Hex(const std::string &str); // not defined, generates compiler error for non-specialized types template<> inline unsigned char Hex(const std::string &str) { return HexToUnsignedChar(str); } template<> inline unsigned short Hex(const std::string &str) { return HexToUnsignedShort(str); } template<> inline unsigned int Hex(const std::string &str) { return HexToUnsignedInt(str); } template<> inline unsigned long Hex(const std::string &str) { return HexToUnsignedLong(str); } template<> inline unsigned long long Hex(const std::string &str) { return HexToUnsignedLongLong(str); } template inline T Hex(const char *str) { if(!str) { return T(); } return Hex(std::string(str)); } #if MPT_WSTRING_FORMAT template inline T Hex(const std::wstring &str) { return Hex(mpt::ToCharset(mpt::Charset::UTF8, str)); } template inline T Hex(const wchar_t *str) { if(!str) { return T(); } return Hex(std::wstring(str)); } #endif #if MPT_USTRING_MODE_UTF8 template inline T Hex(const mpt::ustring &str) { return Hex(mpt::ToCharset(mpt::Charset::UTF8, str)); } #endif } // namespace Parse } // namespace String } // namespace mpt namespace mpt { namespace String { // Split the given string at separator positions into individual values returned as a vector. // An empty string results in an empty vector. // Leading or trailing separators result in a default-constructed element being inserted before or after the other elements. template std::vector Split(const mpt::ustring &str, const mpt::ustring &sep=U_(",")) { std::vector vals; std::size_t pos = 0; while(str.find(sep, pos) != std::string::npos) { vals.push_back(ConvertStrTo(str.substr(pos, str.find(sep, pos) - pos))); pos = str.find(sep, pos) + sep.length(); } if(!vals.empty() || (str.substr(pos).length() > 0)) { vals.push_back(ConvertStrTo(str.substr(pos))); } return vals; } template std::vector Split(const std::string &str, const std::string &sep=std::string(",")) { std::vector vals; std::size_t pos = 0; while(str.find(sep, pos) != std::string::npos) { vals.push_back(ConvertStrTo(str.substr(pos, str.find(sep, pos) - pos))); pos = str.find(sep, pos) + sep.length(); } if(!vals.empty() || (str.substr(pos).length() > 0)) { vals.push_back(ConvertStrTo(str.substr(pos))); } return vals; } } } // namespace mpt::String OPENMPT_NAMESPACE_END