Mercurial > minori
comparison src/core/strings.cc @ 187:9613d72b097e
*: multiple performance improvements
like marking `static const` when it makes sense...
date: change old stupid heap-based method to a structure which should
make copying the thing actually make a copy.
also many performance-based changes, like removing the std::tie
dependency and forward-declaring nlohmann json
*: replace every instance of QString::fromUtf8 to Strings::ToQString.
the main difference is that our function will always convert exactly
what is in the string, while some other times it would only convert
up to the nearest NUL byte
author | Paper <mrpapersonic@gmail.com> |
---|---|
date | Wed, 06 Dec 2023 13:43:54 -0500 |
parents | 275da698697d |
children | 7cf53145de11 |
comparison
equal
deleted
inserted
replaced
186:6ef31dbb90ca | 187:9613d72b097e |
---|---|
1 /** | 1 /** |
2 * strings.cpp: Useful functions for manipulating strings | 2 * strings.cpp: Useful functions for manipulating strings |
3 **/ | 3 **/ |
4 #include "core/strings.h" | 4 #include "core/strings.h" |
5 #include "core/session.h" // locale | |
6 | |
5 #include <QByteArray> | 7 #include <QByteArray> |
6 #include <QDebug> | 8 #include <QDebug> |
7 #include <QString> | 9 #include <QString> |
8 #include <QLocale> | 10 #include <QLocale> |
11 | |
9 #include <algorithm> | 12 #include <algorithm> |
10 #include <cctype> | 13 #include <cctype> |
11 #include <codecvt> | 14 #include <codecvt> |
12 #include <locale> | 15 #include <locale> |
13 #include <string> | 16 #include <string> |
18 | 21 |
19 /* ew */ | 22 /* ew */ |
20 std::string Implode(const std::vector<std::string>& vector, const std::string& delimiter) { | 23 std::string Implode(const std::vector<std::string>& vector, const std::string& delimiter) { |
21 if (vector.size() < 1) | 24 if (vector.size() < 1) |
22 return "-"; | 25 return "-"; |
26 | |
23 std::string out = ""; | 27 std::string out = ""; |
28 | |
24 for (unsigned long long i = 0; i < vector.size(); i++) { | 29 for (unsigned long long i = 0; i < vector.size(); i++) { |
25 out.append(vector.at(i)); | 30 out.append(vector.at(i)); |
26 if (i < vector.size() - 1) | 31 if (i < vector.size() - 1) |
27 out.append(delimiter); | 32 out.append(delimiter); |
28 } | 33 } |
34 | |
29 return out; | 35 return out; |
30 } | 36 } |
31 | 37 |
32 std::vector<std::string> Split(const std::string &text, const std::string& delimiter) { | 38 std::vector<std::string> Split(const std::string &text, const std::string& delimiter) { |
33 std::vector<std::string> tokens; | 39 std::vector<std::string> tokens; |
111 } | 117 } |
112 | 118 |
113 /* let Qt handle the heavy lifting of locale shit | 119 /* let Qt handle the heavy lifting of locale shit |
114 I don't want to deal with */ | 120 I don't want to deal with */ |
115 std::string ToUpper(const std::string& string) { | 121 std::string ToUpper(const std::string& string) { |
116 /* todo: this "locale" will have to be moved to session.h | 122 return ToUtf8String(session.config.locale.GetLocale().toUpper(ToQString(string))); |
117 it also defaults to en-US, which sucks very much for | |
118 anyone who doesn't speak american english... */ | |
119 QLocale locale; | |
120 return ToUtf8String(locale.toUpper(ToQString(string))); | |
121 } | 123 } |
122 | 124 |
123 std::string ToLower(const std::string& string) { | 125 std::string ToLower(const std::string& string) { |
124 QLocale locale; | 126 return ToUtf8String(session.config.locale.GetLocale().toLower(ToQString(string))); |
125 return ToUtf8String(locale.toLower(ToQString(string))); | |
126 } | 127 } |
127 | 128 |
128 std::wstring ToWstring(const std::string& string) { | 129 std::wstring ToWstring(const std::string& string) { |
129 std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> converter; | 130 static std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> converter; |
130 return converter.from_bytes(string); | 131 return converter.from_bytes(string); |
131 } | 132 } |
132 | 133 |
133 std::wstring ToWstring(const QString& string) { | 134 std::wstring ToWstring(const QString& string) { |
134 std::wstring arr(string.size(), L'\0'); | 135 std::wstring arr(string.size(), L'\0'); |
135 string.toWCharArray(&arr.front()); | 136 string.toWCharArray(&arr.front()); |
136 return arr; | 137 return arr; |
137 } | 138 } |
138 | 139 |
139 std::string ToUtf8String(const std::wstring& wstring) { | 140 std::string ToUtf8String(const std::wstring& wstring) { |
140 std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> converter; | 141 static std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> converter; |
141 return converter.to_bytes(wstring); | 142 return converter.to_bytes(wstring); |
142 } | 143 } |
143 | 144 |
144 std::string ToUtf8String(const QString& string) { | 145 std::string ToUtf8String(const QString& string) { |
145 QByteArray ba = string.toUtf8(); | 146 const QByteArray ba = string.toUtf8(); |
146 return std::string(ba.constData(), ba.size()); | 147 return std::string(ba.constData(), ba.size()); |
147 } | 148 } |
148 | 149 |
149 std::string ToUtf8String(const QByteArray& ba) { | 150 std::string ToUtf8String(const QByteArray& ba) { |
150 return std::string(ba.constData(), ba.size()); | 151 return std::string(ba.constData(), ba.size()); |
171 } | 172 } |
172 | 173 |
173 bool ToBool(const std::string& s, const bool def) { | 174 bool ToBool(const std::string& s, const bool def) { |
174 if (s.length() < 4) | 175 if (s.length() < 4) |
175 return def; | 176 return def; |
176 std::string l = Strings::ToLower(s); | 177 const std::string l = Strings::ToLower(s); |
177 if (Strings::BeginningMatchesSubstring(l, "true")) | 178 if (Strings::BeginningMatchesSubstring(l, "true")) |
178 return true; | 179 return true; |
179 else if (Strings::BeginningMatchesSubstring(l, "false")) | 180 else if (Strings::BeginningMatchesSubstring(l, "false")) |
180 return false; | 181 return false; |
181 return def; | 182 return def; |
184 std::string ToUtf8String(const bool b) { | 185 std::string ToUtf8String(const bool b) { |
185 return b ? "true" : "false"; | 186 return b ? "true" : "false"; |
186 } | 187 } |
187 | 188 |
188 uint64_t HumanReadableSizeToBytes(const std::string& str) { | 189 uint64_t HumanReadableSizeToBytes(const std::string& str) { |
189 const std::unordered_map<std::string, uint64_t> bytes_map = { | 190 static const std::unordered_map<std::string, uint64_t> bytes_map = { |
190 {"KB", 1ull << 10}, | 191 {"KB", 1ull << 10}, |
191 {"MB", 1ull << 20}, | 192 {"MB", 1ull << 20}, |
192 {"GB", 1ull << 30}, | 193 {"GB", 1ull << 30}, |
193 {"TB", 1ull << 40}, | 194 {"TB", 1ull << 40}, |
194 {"PB", 1ull << 50} /* surely we won't need more than this */ | 195 {"PB", 1ull << 50} /* surely we won't need more than this */ |
220 | 221 |
221 bool BeginningMatchesSubstring(const std::string& str, const std::string& sub) { | 222 bool BeginningMatchesSubstring(const std::string& str, const std::string& sub) { |
222 for (unsigned long long i = 0; i < str.length() && i < sub.length(); i++) | 223 for (unsigned long long i = 0; i < str.length() && i < sub.length(); i++) |
223 if (str[i] != sub[i]) | 224 if (str[i] != sub[i]) |
224 return false; | 225 return false; |
226 | |
225 return true; | 227 return true; |
226 } | 228 } |
227 | 229 |
228 } // namespace Strings | 230 } // namespace Strings |