Mercurial > minori
comparison include/core/strings.h @ 114:ab191e28e69d
*: add initial torrent stuff
WOAH!
these checkboxes are a pain in my fucking ass
author | Paper <mrpapersonic@gmail.com> |
---|---|
date | Tue, 07 Nov 2023 08:03:42 -0500 |
parents | 6d8da6e64d61 |
children | 254b1d2b7096 |
comparison
equal
deleted
inserted
replaced
113:32afe0e940bf | 114:ab191e28e69d |
---|---|
2 #define __core__strings_h | 2 #define __core__strings_h |
3 | 3 |
4 #include <string> | 4 #include <string> |
5 #include <vector> | 5 #include <vector> |
6 #include <array> | 6 #include <array> |
7 #include <cstdint> | |
7 | 8 |
8 class QString; | 9 class QString; |
9 | 10 |
10 namespace Strings { | 11 namespace Strings { |
11 | |
12 template<unsigned...>struct seq{using type=seq;}; | |
13 template<unsigned N, unsigned... Is> | |
14 struct gen_seq_x : gen_seq_x<N-1, N-1, Is...>{}; | |
15 template<unsigned... Is> | |
16 struct gen_seq_x<0, Is...> : seq<Is...>{}; | |
17 template<unsigned N> | |
18 using gen_seq=typename gen_seq_x<N>::type; | |
19 | |
20 template<size_t S> | |
21 using size=std::integral_constant<size_t, S>; | |
22 | |
23 template<class T, size_t N> | |
24 constexpr size<N> length( T const(&)[N] ) { return {}; } | |
25 template<class T, size_t N> | |
26 constexpr size<N> length( std::array<T, N> const& ) { return {}; } | |
27 | |
28 template<class T> | |
29 using length_t = decltype(length(std::declval<T>())); | |
30 | |
31 constexpr size_t string_size() { return 0; } | |
32 template<class...Ts> | |
33 constexpr size_t string_size( size_t i, Ts... ts ) { | |
34 return (i?i-1:0) + string_size(ts...); | |
35 } | |
36 template<class...Ts> | |
37 using string_length=size< string_size( length_t<Ts>{}... )>; | |
38 | |
39 template<class...Ts> | |
40 using combined_string = std::array<char, string_length<Ts...>{}+1>; | |
41 | |
42 template<class Lhs, class Rhs, unsigned...I1, unsigned...I2> | |
43 constexpr const combined_string<Lhs,Rhs> | |
44 concat_impl( Lhs const& lhs, Rhs const& rhs, seq<I1...>, seq<I2...>) | |
45 { | |
46 return {{ lhs[I1]..., rhs[I2]..., '\0' }}; | |
47 } | |
48 | |
49 template<class Lhs, class Rhs> | |
50 constexpr const combined_string<Lhs,Rhs> | |
51 concat(Lhs const& lhs, Rhs const& rhs) | |
52 { | |
53 return concat_impl(lhs, rhs, gen_seq<string_length<Lhs>{}>{}, gen_seq<string_length<Rhs>{}>{}); | |
54 } | |
55 | |
56 template<class T0, class T1, class... Ts> | |
57 constexpr const combined_string<T0, T1, Ts...> | |
58 concat(T0 const&t0, T1 const&t1, Ts const&...ts) | |
59 { | |
60 return concat(t0, concat(t1, ts...)); | |
61 } | |
62 | |
63 template<class T> | |
64 constexpr const combined_string<T> | |
65 concat(T const&t) { | |
66 return concat(t, ""); | |
67 } | |
68 constexpr const combined_string<> | |
69 concat() { | |
70 return concat(""); | |
71 } | |
72 | 12 |
73 /* Implode function: takes a vector of strings and turns it | 13 /* Implode function: takes a vector of strings and turns it |
74 into a string, separated by delimiters. */ | 14 into a string, separated by delimiters. */ |
75 std::string Implode(const std::vector<std::string>& vector, const std::string& delimiter); | 15 std::string Implode(const std::vector<std::string>& vector, const std::string& delimiter); |
76 | 16 |
96 QString ToQString(const std::wstring& wstring); | 36 QString ToQString(const std::wstring& wstring); |
97 | 37 |
98 /* arithmetic :) */ | 38 /* arithmetic :) */ |
99 int ToInt(const std::string& str, int def = 0); | 39 int ToInt(const std::string& str, int def = 0); |
100 | 40 |
41 uint64_t HumanReadableSizeToBytes(const std::string& str); | |
42 | |
43 std::string RemoveLeadingChars(std::string s, const char c); | |
44 std::string RemoveTrailingChars(std::string s, const char c); | |
45 | |
101 bool BeginningMatchesSubstring(const std::string& str, const std::string& sub); | 46 bool BeginningMatchesSubstring(const std::string& str, const std::string& sub); |
102 | 47 |
103 }; // namespace Strings | 48 }; // namespace Strings |
104 | 49 |
105 #endif // __core__strings_h | 50 #endif // __core__strings_h |