1#include "lxgui/utils_string.hpp"
10string_view trim(string_view s,
char c_pattern) {
11 std::size_t start = s.find_first_not_of(c_pattern);
17 std::size_t end = s.find_last_not_of(c_pattern);
19 s = s.substr(0, end + 1);
24string_view trim(string_view s, string_view patterns) {
25 std::size_t start = s.find_first_not_of(patterns);
31 std::size_t end = s.find_last_not_of(patterns);
33 s = s.substr(0, end + 1);
38void replace(
string& s, string_view pattern, string_view replacement) {
39 std::size_t pos = s.find(pattern);
41 while (pos != s.npos) {
42 s.replace(pos, pattern.length(), replacement);
43 pos = s.find(pattern, pos + replacement.length());
47std::size_t count_occurrences(string_view s, string_view pattern) {
48 std::size_t count = 0;
49 std::size_t pos = s.find(pattern);
50 while (pos != s.npos) {
52 pos = s.find(pattern, pos + 1);
59std::vector<std::basic_string_view<T>>
60cut_template(std::basic_string_view<T> s, std::basic_string_view<T> delim) {
61 std::vector<std::basic_string_view<T>> pieces;
62 std::size_t pos = s.find(delim);
63 std::size_t last_pos = 0u;
64 std::size_t cur_size = 0u;
66 while (pos != std::basic_string_view<T>::npos) {
67 cur_size = pos - last_pos;
69 pieces.push_back(s.substr(last_pos, cur_size));
70 last_pos = pos + delim.size();
71 pos = s.find(delim, last_pos);
74 pieces.push_back(s.substr(last_pos));
79std::vector<string_view> cut(string_view s, string_view delim) {
80 return cut_template(s, delim);
83std::vector<ustring_view> cut(ustring_view s, ustring_view delim) {
84 return cut_template(s, delim);
88std::vector<std::basic_string_view<T>>
89cut_each_template(std::basic_string_view<T> s, std::basic_string_view<T> delim) {
90 std::vector<std::basic_string_view<T>> pieces;
91 std::size_t pos = s.find(delim);
92 std::size_t last_pos = 0u;
93 std::size_t cur_size = 0u;
95 while (pos != std::basic_string_view<T>::npos) {
96 cur_size = pos - last_pos;
97 pieces.push_back(s.substr(last_pos, cur_size));
98 last_pos = pos + delim.size();
99 pos = s.find(delim, last_pos);
102 pieces.push_back(s.substr(last_pos));
107std::vector<string_view> cut_each(string_view s, string_view delim) {
108 return cut_each_template(s, delim);
111std::vector<ustring_view> cut_each(ustring_view s, ustring_view delim) {
112 return cut_each_template(s, delim);
116std::pair<std::basic_string_view<T>, std::basic_string_view<T>>
117cut_first_template(std::basic_string_view<T> s, std::basic_string_view<T> delim) {
118 std::size_t pos = s.find(delim);
119 if (pos == std::basic_string_view<T>::npos)
122 return {s.substr(0, pos), s.substr(pos + 1u)};
125std::pair<string_view, string_view> cut_first(string_view s, string_view delim) {
126 return cut_first_template(s, delim);
129std::pair<ustring_view, ustring_view> cut_first(ustring_view s, ustring_view delim) {
130 return cut_first_template(s, delim);
133bool has_no_content(string_view s) {
137 for (std::size_t i = 0; i < s.length(); ++i) {
138 if (s[i] !=
' ' && s[i] !=
'\t')
145bool starts_with(string_view s, string_view pattern) {
146 std::size_t n = std::min(s.size(), pattern.size());
147 for (std::size_t i = 0; i < n; ++i) {
148 if (s[i] != pattern[i])
155bool ends_with(string_view s, string_view pattern) {
156 std::size_t ss = s.size();
157 std::size_t ps = pattern.size();
158 std::size_t n = std::min(ss, ps);
159 for (std::size_t i = 1; i <= n; ++i) {
160 if (s[ss - i] != pattern[ps - i])
167ustring utf8_to_unicode(string_view s) {
168 return utf8::utf8to32(s);
171string unicode_to_utf8(ustring_view s) {
172 return utf8::utf32to8(s);
175std::size_t hex_to_uint(string_view s) {
177 std::istringstream ss{std::string(s)};
178 ss.imbue(std::locale::classic());
186std::optional<T> from_string_template(
const std::locale& loc, string_view s) {
187 std::istringstream ss{std::string(s)};
200 if (rem.find_first_not_of(
" \t") == rem.npos)
208std::optional<T> from_string_template(
const std::locale& loc, ustring_view s) {
209 return from_string_template<T>(loc, unicode_to_utf8(s));
215std::optional<int> from_string<int>(
const std::locale& loc, string_view s) {
216 return from_string_template<int>(loc, s);
220std::optional<long> from_string<long>(
const std::locale& loc, string_view s) {
221 return from_string_template<long>(loc, s);
225std::optional<long long> from_string<long long>(
const std::locale& loc, string_view s) {
226 return from_string_template<long long>(loc, s);
230std::optional<unsigned> from_string<unsigned>(
const std::locale& loc, string_view s) {
231 return from_string_template<unsigned>(loc, s);
235std::optional<unsigned long> from_string<unsigned long>(
const std::locale& loc, string_view s) {
236 return from_string_template<unsigned long>(loc, s);
240std::optional<unsigned long long>
241from_string<unsigned long long>(
const std::locale& loc, string_view s) {
242 return from_string_template<unsigned long long>(loc, s);
246std::optional<float> from_string<float>(
const std::locale& loc, string_view s) {
247 return from_string_template<float>(loc, s);
251std::optional<double> from_string<double>(
const std::locale& loc, string_view s) {
252 return from_string_template<double>(loc, s);
258std::optional<int> from_string<int>(
const std::locale& loc, ustring_view s) {
259 return from_string_template<int>(loc, s);
263std::optional<long> from_string<long>(
const std::locale& loc, ustring_view s) {
264 return from_string_template<long>(loc, s);
268std::optional<long long> from_string<long long>(
const std::locale& loc, ustring_view s) {
269 return from_string_template<long long>(loc, s);
273std::optional<unsigned> from_string<unsigned>(
const std::locale& loc, ustring_view s) {
274 return from_string_template<unsigned>(loc, s);
278std::optional<unsigned long> from_string<unsigned long>(
const std::locale& loc, ustring_view s) {
279 return from_string_template<unsigned long>(loc, s);
283std::optional<unsigned long long>
284from_string<unsigned long long>(
const std::locale& loc, ustring_view s) {
285 return from_string_template<unsigned long long>(loc, s);
289std::optional<float> from_string<float>(
const std::locale& loc, ustring_view s) {
290 return from_string_template<float>(loc, s);
294std::optional<double> from_string<double>(
const std::locale& loc, ustring_view s) {
295 return from_string_template<double>(loc, s);
301std::optional<int> from_string<int>(string_view s) {
302 return from_string_template<int>(std::locale::classic(), s);
306std::optional<long> from_string<long>(string_view s) {
307 return from_string_template<long>(std::locale::classic(), s);
311std::optional<long long> from_string<long long>(string_view s) {
312 return from_string_template<long long>(std::locale::classic(), s);
316std::optional<unsigned> from_string<unsigned>(string_view s) {
317 return from_string_template<unsigned>(std::locale::classic(), s);
321std::optional<unsigned long> from_string<unsigned long>(string_view s) {
322 return from_string_template<unsigned long>(std::locale::classic(), s);
326std::optional<unsigned long long> from_string<unsigned long long>(string_view s) {
327 return from_string_template<unsigned long long>(std::locale::classic(), s);
331std::optional<float> from_string<float>(string_view s) {
332 return from_string_template<float>(std::locale::classic(), s);
336std::optional<double> from_string<double>(string_view s) {
337 return from_string_template<double>(std::locale::classic(), s);
341std::optional<bool> from_string<bool>(string_view s) {
350std::optional<string> from_string<string>(string_view s) {
357std::optional<int> from_string<int>(ustring_view s) {
358 return from_string_template<int>(std::locale::classic(), s);
362std::optional<long> from_string<long>(ustring_view s) {
363 return from_string_template<long>(std::locale::classic(), s);
367std::optional<long long> from_string<long long>(ustring_view s) {
368 return from_string_template<long long>(std::locale::classic(), s);
372std::optional<unsigned> from_string<unsigned>(ustring_view s) {
373 return from_string_template<unsigned>(std::locale::classic(), s);
377std::optional<unsigned long> from_string<unsigned long>(ustring_view s) {
378 return from_string_template<unsigned long>(std::locale::classic(), s);
382std::optional<unsigned long long> from_string<unsigned long long>(ustring_view s) {
383 return from_string_template<unsigned long long>(std::locale::classic(), s);
387std::optional<float> from_string<float>(ustring_view s) {
388 return from_string_template<float>(std::locale::classic(), s);
392std::optional<double> from_string<double>(ustring_view s) {
393 return from_string_template<double>(std::locale::classic(), s);
397std::optional<bool> from_string<bool>(ustring_view s) {
406std::optional<ustring> from_string<ustring>(ustring_view s) {
412bool is_number(
const std::locale& loc, string_view s) {
413 return impl::from_string<double>(loc, s).has_value();
416bool is_number(
const std::locale& loc, ustring_view s) {
417 return impl::from_string<double>(loc, s).has_value();
420bool is_integer(
const std::locale& loc, string_view s) {
421 return impl::from_string<std::int64_t>(loc, s).has_value();
424bool is_integer(
const std::locale& loc, ustring_view s) {
425 return impl::from_string<std::int64_t>(loc, s).has_value();
428bool is_number(string_view s) {
429 return is_number(std::locale::classic(), s);
432bool is_number(ustring_view s) {
433 return is_number(std::locale::classic(), s);
436bool is_integer(string_view s) {
437 return is_integer(std::locale::classic(), s);
440bool is_integer(ustring_view s) {
441 return is_integer(std::locale::classic(), s);
444bool is_number(
char s) {
445 return '0' <= s && s <=
'9';
448bool is_number(
char32_t s) {
449 return U
'0' <= s && s <= U
'9';
452bool is_integer(
char s) {
456bool is_integer(
char32_t s) {
460bool is_boolean(string_view s) {
461 return (s ==
"false") || (s ==
"true");
464bool is_boolean(ustring_view s) {
465 return (s == U
"false") || (s == U
"true");
468bool is_whitespace(
char c) {
469 return c ==
'\n' || c ==
' ' || c ==
'\t' || c ==
'\r';
472bool is_whitespace(
char32_t c) {
473 return c == U
'\n' || c == U
' ' || c == U
'\t' || c ==
'\r';
477string to_string_template(T value) {
478 std::ostringstream ss;
479 ss.imbue(std::locale::classic());
484string to_string(
int v) {
485 return to_string_template(v);
488string to_string(
long v) {
489 return to_string_template(v);
492string to_string(
long long v) {
493 return to_string_template(v);
496string to_string(
unsigned v) {
497 return to_string_template(v);
500string to_string(
unsigned long v) {
501 return to_string_template(v);
504string to_string(
unsigned long long v) {
505 return to_string_template(v);
508string to_string(
float v) {
509 return to_string_template(v);
512string to_string(
double v) {
513 return to_string_template(v);
516string to_string(
bool b) {
517 return b ?
"true" :
"false";
520string to_string(
const void* p) {
521 std::ostringstream stream;
522 stream.imbue(std::locale::classic());
529 [&](
const auto& inner_value) -> std::string {
530 using inner_type = std::decay_t<
decltype(inner_value)>;
531 if constexpr (std::is_same_v<inner_type, utils::empty>)
534 return to_string(inner_value);
539string to_lower(
string str) {
541 c = static_cast<char>(
std::tolower(c));
range_impl::value_range< T > value(T &container)
Expose the value rather than the (key,value) pair.
std::variant< empty, bool, std::int64_t, std::int32_t, std::int16_t, std::int8_t, std::uint64_t, std::uint32_t, std::uint16_t, std::uint8_t, double, float, std::string > variant
Type-erased value for passing arguments to events.