28 static std::string ConvertUtf8(
const std::wstring_view& wstr)
30 std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
31 return converter.to_bytes(wstr.data(), wstr.data() + wstr.size());
34 static std::wstring ConvertUtf16(
const std::string_view& str)
36 std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
37 return converter.from_bytes(str.data(), str.data() + str.size());
40 static std::vector<std::string> Split(
const std::string& str,
char sep)
42 std::vector<std::string> tokens;
43 std::istringstream iss(str);
45 while (std::getline(iss, token, sep))
47 tokens.emplace_back(token);
52 static bool StartsWith(std::string_view str, std::string_view token)
54 return str.substr(0, token.size()) == token;
57 static bool Contains(std::string_view str, std::string_view token)
noexcept
59 return str.find(token) != std::string::npos;
62 static std::string_view Trim(std::string_view str, std::string_view whitespace =
" \t\n\r")
64 const size_t first = str.find_first_not_of(whitespace);
65 if (first == std::string::npos)
69 const size_t last = str.find_last_not_of(whitespace);
70 return str.substr(first, last - first + 1);
73 static std::string ReplaceFirst(std::string_view source, std::string_view search, std::string_view replace)
75 std::string result(source);
76 size_t pos = result.find(search);
77 if (pos != std::string::npos)
79 result.replace(pos, search.size(), replace);
85 static std::string To(T val)
87 if constexpr (std::is_same_v<std::string, T> || std::is_same_v<const char*, T>)
91 else if constexpr (std::is_enum_v<T>)
93 using Underlying =
typename std::underlying_type<T>::type;
94 return std::to_string(
static_cast<Underlying
>(val));
96 else if constexpr (std::is_same_v<bool, T>)
98 return val ?
"true" :
"false";
100 else if constexpr (std::is_same_v<std::nullptr_t, T>)
104 else if constexpr (is_optional_v<T>)
106 return val.has_value() ? To(*val) :
"null";
108 else if constexpr (std::is_same_v<char, T>)
110 return std::string(1, val);
114 return std::to_string(val);
118 template <
typename T>
119 static T From(
const std::string& str)
121 if constexpr (std::is_same_v<std::string, T>)
125 else if constexpr (std::is_enum_v<T>)
127 using Underlying =
typename std::underlying_type<T>::type;
128 return static_cast<T
>(From<Underlying>(str));
130 else if constexpr (std::is_same_v<bool, T>)
132 return str ==
"true" || str ==
"1";
134 else if constexpr (is_optional_v<T>)
136 using Base =
typename T::value_type;
137 std::istringstream iss(str);
139 if ((iss >> value).fail())
147 std::istringstream iss(str);
150 return static_cast<T
>(temp);