32 [[nodiscard]]
static constexpr std::string_view RemovePrefix(std::string_view Str,
char Prefix =
'L')
34 return (Str.starts_with(Prefix)) ? Str.substr(1) : Str;
46 template<
typename TChar =
char,
typename StringType>
47 [[nodiscard]]
static std::basic_string<TChar> ToLower(
const StringType& Input)
49 std::basic_string_view<TChar> StringView(Input);
50 std::basic_string<TChar> Result(StringView);
52 std::transform(Result.begin(), Result.end(), Result.begin(), [](TChar Character)
54 return static_cast<TChar>(std::tolower(Character, std::locale{}));
60 template<
typename TChar =
char,
typename StringType>
61 [[nodiscard]]
static std::basic_string<TChar> ToUpper(
const StringType& Input)
63 std::basic_string_view<TChar> StringView(Input);
64 std::basic_string<TChar> Result(StringView);
66 std::transform(Result.begin(), Result.end(), Result.begin(), [](TChar Character)
68 return static_cast<TChar>(std::toupper(Character, std::locale{}));
74 [[nodiscard]]
static std::string ToLower(
const char* String)
76 return ToLower<char>(std::string_view(String));
79 [[nodiscard]]
static std::string ToUpper(
const char* String)
81 return ToUpper<char>(std::string_view(String));
84 [[nodiscard]]
static std::wstring ToLower(
const wchar_t* String)
86 return ToLower<wchar_t>(std::wstring_view(String));
89 [[nodiscard]]
static std::wstring ToUpper(
const wchar_t* String)
91 return ToUpper<wchar_t>(std::wstring_view(String));
94 [[nodiscard]]
static std::wstring ToLower(
const std::wstring& String)
96 return ToLower<wchar_t>(String);
99 [[nodiscard]]
static std::wstring ToUpper(
const std::wstring& String)
101 return ToUpper<wchar_t>(String);
104 [[nodiscard]]
static std::string BytesToString(
const uint64_t Bytes)
106 static constexpr uint64_t GB = 1024 * 1024 * 1024;
107 static constexpr uint64_t MB = 1024 * 1024;
108 static constexpr uint64_t KB = 1024;
110 static constexpr uint16_t BufSize = 32;
111 char Buffer[BufSize + 1] {};
115 snprintf(Buffer, BufSize,
"%.2f GB", (
float)Bytes / (
float)GB);
119 snprintf(Buffer, BufSize,
"%.2f MB", (
float)Bytes / (
float)MB);
123 snprintf(Buffer, BufSize,
"%.2f KB", (
float)Bytes / (
float)KB);
127 snprintf(Buffer, BufSize,
"%.2f Bytes", (
float)Bytes);
130 return std::string(Buffer);
136 template<
typename TargetString,
typename SourceString>
137 [[nodiscard]]
static TargetString Convert(
const SourceString& Input)
140 if constexpr (std::is_same_v<SourceString, std::wstring>
141 && std::is_same_v<TargetString, std::string>)
143 return std::wstring_convert<std::codecvt_utf8<wchar_t>>{}.to_bytes(Input);
145 else if constexpr (std::is_same_v<SourceString, const wchar_t*>
146 && std::is_same_v<TargetString, std::string>)
148 return std::wstring_convert<std::codecvt_utf8<wchar_t>>{}.to_bytes(Input);
151 else if constexpr (std::is_same_v<SourceString, std::string>
152 && std::is_same_v<TargetString, std::wstring>)
154 return std::wstring_convert<std::codecvt_utf8<wchar_t>>{}.from_bytes(Input);
156 else if constexpr (std::is_same_v<SourceString, std::string>
157 && std::is_same_v<TargetString, const wchar_t*>)
159 return std::wstring_convert<std::codecvt_utf8<wchar_t>>{}.from_bytes(Input);
163 static_assert(
sizeof(SourceString) <= 0,
"Unsupported conversion");
167 static void ReplaceToken(std::string& String,
const char* Token,
const std::string& Value)
170 while ((Pos = String.find(Token, Pos)) != std::string::npos)
172 String.replace(Pos, strlen(Token), Value);
173 Pos += strlen(Token);
178 static std::string ConvertFlags(
const T Flags)
180 static_assert(std::is_integral_v<T> || std::is_enum_v<T>,
"Cannot convert non-integral types, only flags are allowed");
181 constexpr uint32_t Bits =
static_cast<uint32_t
>(
sizeof(
decltype(Flags)) * 8);
182 std::bitset<Bits> FlagBitset(Flags);
183 return FlagBitset.to_string();