aboutsummaryrefslogtreecommitdiff
path: root/Src/external_dependencies/openmpt-trunk/common/mptStringParse.h
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/external_dependencies/openmpt-trunk/common/mptStringParse.h
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/external_dependencies/openmpt-trunk/common/mptStringParse.h')
-rw-r--r--Src/external_dependencies/openmpt-trunk/common/mptStringParse.h250
1 files changed, 250 insertions, 0 deletions
diff --git a/Src/external_dependencies/openmpt-trunk/common/mptStringParse.h b/Src/external_dependencies/openmpt-trunk/common/mptStringParse.h
new file mode 100644
index 00000000..9e7fbd0a
--- /dev/null
+++ b/Src/external_dependencies/openmpt-trunk/common/mptStringParse.h
@@ -0,0 +1,250 @@
+/*
+ * 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<typename T> 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<typename T> 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<typename T>
+inline T ConvertStrTo(const CString &str)
+{
+ #if defined(UNICODE) && MPT_WSTRING_FORMAT
+ return ConvertStrTo<T>(mpt::ToWide(str));
+ #elif defined(UNICODE)
+ return ConvertStrTo<T>(mpt::ToCharset(mpt::Charset::UTF8, str));
+ #else // !UNICODE
+ return ConvertStrTo<T>(mpt::ToCharset(mpt::Charset::Locale, str));
+ #endif // UNICODE
+}
+#endif // MPT_WITH_MFC
+
+template<typename T>
+inline T ConvertStrTo(const char *str)
+{
+ if(!str)
+ {
+ return T();
+ }
+ return ConvertStrTo<T>(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<typename T>
+inline T ConvertStrTo(const wchar_t *str)
+{
+ if(!str)
+ {
+ return T();
+ }
+ return ConvertStrTo<T>(std::wstring(str));
+}
+#endif
+
+#if MPT_USTRING_MODE_UTF8
+template<typename T>
+inline T ConvertStrTo(const mpt::ustring &str)
+{
+ return ConvertStrTo<T>(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<typename T>
+inline T ConvertStrTo(const mpt::lstring &str)
+{
+ return ConvertStrTo<T>(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<typename T> 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<typename T>
+inline T Hex(const char *str)
+{
+ if(!str)
+ {
+ return T();
+ }
+ return Hex<T>(std::string(str));
+}
+
+#if MPT_WSTRING_FORMAT
+
+template<typename T>
+inline T Hex(const std::wstring &str)
+{
+ return Hex<T>(mpt::ToCharset(mpt::Charset::UTF8, str));
+}
+
+template<typename T>
+inline T Hex(const wchar_t *str)
+{
+ if(!str)
+ {
+ return T();
+ }
+ return Hex<T>(std::wstring(str));
+}
+
+#endif
+
+#if MPT_USTRING_MODE_UTF8
+template<typename T>
+inline T Hex(const mpt::ustring &str)
+{
+ return Hex<T>(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<typename T>
+std::vector<T> Split(const mpt::ustring &str, const mpt::ustring &sep=U_(","))
+{
+ std::vector<T> vals;
+ std::size_t pos = 0;
+ while(str.find(sep, pos) != std::string::npos)
+ {
+ vals.push_back(ConvertStrTo<T>(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<T>(str.substr(pos)));
+ }
+ return vals;
+}
+template<typename T>
+std::vector<T> Split(const std::string &str, const std::string &sep=std::string(","))
+{
+ std::vector<T> vals;
+ std::size_t pos = 0;
+ while(str.find(sep, pos) != std::string::npos)
+ {
+ vals.push_back(ConvertStrTo<T>(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<T>(str.substr(pos)));
+ }
+ return vals;
+}
+
+} } // namespace mpt::String
+
+
+
+OPENMPT_NAMESPACE_END