PixelBullet  0.0.1
A C++ game engine
Loading...
Searching...
No Matches
String.hpp
1#pragma once
2
3#include <algorithm>
4#include <codecvt>
5#include <locale>
6#include <optional>
7#include <sstream>
8#include <string>
9#include <type_traits>
10#include <vector>
11
12namespace PixelBullet
13{
14 template <typename T>
15 struct is_optional : std::false_type
16 {
17 };
18 template <typename T>
19 struct is_optional<std::optional<T>> : std::true_type
20 {
21 };
22 template <typename T>
23 inline constexpr bool is_optional_v = is_optional<T>::value;
24
25 class String
26 {
27 public:
28 static std::string ConvertUtf8(const std::wstring_view& wstr)
29 {
30 std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
31 return converter.to_bytes(wstr.data(), wstr.data() + wstr.size());
32 }
33
34 static std::wstring ConvertUtf16(const std::string_view& str)
35 {
36 std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
37 return converter.from_bytes(str.data(), str.data() + str.size());
38 }
39
40 static std::vector<std::string> Split(const std::string& str, char sep)
41 {
42 std::vector<std::string> tokens;
43 std::istringstream iss(str);
44 std::string token;
45 while (std::getline(iss, token, sep))
46 {
47 tokens.emplace_back(token);
48 }
49 return tokens;
50 }
51
52 static bool StartsWith(std::string_view str, std::string_view token)
53 {
54 return str.substr(0, token.size()) == token;
55 }
56
57 static bool Contains(std::string_view str, std::string_view token) noexcept
58 {
59 return str.find(token) != std::string::npos;
60 }
61
62 static std::string_view Trim(std::string_view str, std::string_view whitespace = " \t\n\r")
63 {
64 const size_t first = str.find_first_not_of(whitespace);
65 if (first == std::string::npos)
66 {
67 return "";
68 }
69 const size_t last = str.find_last_not_of(whitespace);
70 return str.substr(first, last - first + 1);
71 }
72
73 static std::string ReplaceFirst(std::string_view source, std::string_view search, std::string_view replace)
74 {
75 std::string result(source);
76 size_t pos = result.find(search);
77 if (pos != std::string::npos)
78 {
79 result.replace(pos, search.size(), replace);
80 }
81 return result;
82 }
83
84 template <typename T>
85 static std::string To(T val)
86 {
87 if constexpr (std::is_same_v<std::string, T> || std::is_same_v<const char*, T>)
88 {
89 return val;
90 }
91 else if constexpr (std::is_enum_v<T>)
92 {
93 using Underlying = typename std::underlying_type<T>::type;
94 return std::to_string(static_cast<Underlying>(val));
95 }
96 else if constexpr (std::is_same_v<bool, T>)
97 {
98 return val ? "true" : "false";
99 }
100 else if constexpr (std::is_same_v<std::nullptr_t, T>)
101 {
102 return "null";
103 }
104 else if constexpr (is_optional_v<T>)
105 {
106 return val.has_value() ? To(*val) : "null";
107 }
108 else if constexpr (std::is_same_v<char, T>)
109 {
110 return std::string(1, val);
111 }
112 else
113 {
114 return std::to_string(val);
115 }
116 }
117
118 template <typename T>
119 static T From(const std::string& str)
120 {
121 if constexpr (std::is_same_v<std::string, T>)
122 {
123 return str;
124 }
125 else if constexpr (std::is_enum_v<T>)
126 {
127 using Underlying = typename std::underlying_type<T>::type;
128 return static_cast<T>(From<Underlying>(str));
129 }
130 else if constexpr (std::is_same_v<bool, T>)
131 {
132 return str == "true" || str == "1";
133 }
134 else if constexpr (is_optional_v<T>)
135 {
136 using Base = typename T::value_type;
137 std::istringstream iss(str);
138 Base value;
139 if ((iss >> value).fail())
140 {
141 return std::nullopt;
142 }
143 return value;
144 }
145 else
146 {
147 std::istringstream iss(str);
148 long double temp;
149 iss >> temp;
150 return static_cast<T>(temp);
151 }
152 }
153 };
154} // namespace PixelBullet
Definition String.hpp:26
Definition String.hpp:16