Mercurial > minori
comparison src/core/strings.cc @ 273:f31305b9f60a
*: various code safety changes
this also makes the code build on Qt 5.7. I can't test it though
because I don't have it working... FAIL!
author | Paper <paper@paper.us.eu.org> |
---|---|
date | Thu, 18 Apr 2024 16:53:17 -0400 |
parents | 9a04802848c0 |
children | f6a756c19bfb |
comparison
equal
deleted
inserted
replaced
272:5437009cb10e | 273:f31305b9f60a |
---|---|
11 | 11 |
12 #include <algorithm> | 12 #include <algorithm> |
13 #include <cctype> | 13 #include <cctype> |
14 #include <codecvt> | 14 #include <codecvt> |
15 #include <iostream> | 15 #include <iostream> |
16 #include <iomanip> | |
16 #include <locale> | 17 #include <locale> |
17 #include <string> | 18 #include <string> |
18 #include <unordered_map> | 19 #include <unordered_map> |
19 #include <vector> | 20 #include <vector> |
20 | 21 |
241 } | 242 } |
242 | 243 |
243 /* util funcs */ | 244 /* util funcs */ |
244 uint64_t HumanReadableSizeToBytes(const std::string& str) { | 245 uint64_t HumanReadableSizeToBytes(const std::string& str) { |
245 static const std::unordered_map<std::string, uint64_t> bytes_map = { | 246 static const std::unordered_map<std::string, uint64_t> bytes_map = { |
246 {"KB", 1ull << 10}, | 247 {"KB", 1000ull}, |
247 {"MB", 1ull << 20}, | 248 {"MB", 1000000ull}, |
248 {"GB", 1ull << 30}, | 249 {"GB", 1000000000ull}, |
249 {"TB", 1ull << 40}, | 250 {"TB", 1000000000000ull}, |
250 {"PB", 1ull << 50} /* surely we won't need more than this */ | 251 {"PB", 1000000000000000ull}, |
252 {"KiB", 1ull << 10}, | |
253 {"MiB", 1ull << 20}, | |
254 {"GiB", 1ull << 30}, | |
255 {"TiB", 1ull << 40}, | |
256 {"PiB", 1ull << 50} /* surely we won't need more than this */ | |
251 }; | 257 }; |
252 | 258 |
253 for (const auto& suffix : bytes_map) { | 259 for (const auto& suffix : bytes_map) { |
254 if (str.find(suffix.first) != std::string::npos) { | 260 if (str.find(suffix.first) != std::string::npos) { |
255 try { | 261 try { |
262 } | 268 } |
263 | 269 |
264 return ToInt(str, 0); | 270 return ToInt(str, 0); |
265 } | 271 } |
266 | 272 |
273 std::string BytesToHumanReadableSize(uint64_t bytes, int precision) { | |
274 #if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) | |
275 /* QLocale in Qt >= 5.10.0 has a function for this */ | |
276 return Strings::ToUtf8String(session.config.locale.GetLocale().formattedDataSize(bytes), precision); | |
277 #else | |
278 static const std::unordered_map<uint64_t, std::string> map = { | |
279 {1ull << 10, "KiB"}, | |
280 {1ull << 20, "MiB"}, | |
281 {1ull << 30, "GiB"}, | |
282 {1ull << 40, "TiB"}, | |
283 {1ull << 50, "PiB"} | |
284 }; | |
285 | |
286 for (const auto& suffix : map) { | |
287 if (bytes / suffix.first < 1) | |
288 continue; | |
289 | |
290 std::stringstream ss; | |
291 ss << std::setprecision(precision) | |
292 << (static_cast<double>(bytes) / suffix.first) << " " | |
293 << suffix.second; | |
294 return ss.str(); | |
295 } | |
296 | |
297 /* better luck next time */ | |
298 return "0 bytes"; | |
299 #endif | |
300 } | |
301 | |
267 void RemoveLeadingChars(std::string& s, const char c) { | 302 void RemoveLeadingChars(std::string& s, const char c) { |
268 s.erase(0, std::min(s.find_first_not_of(c), s.size() - 1)); | 303 s.erase(0, std::min(s.find_first_not_of(c), s.size() - 1)); |
269 } | 304 } |
270 | 305 |
271 void RemoveTrailingChars(std::string& s, const char c) { | 306 void RemoveTrailingChars(std::string& s, const char c) { |