MythTV master
stringutil.h
Go to the documentation of this file.
1#ifndef STRINGUTIL_H_
2#define STRINGUTIL_H_
3
4// The following distributions have a C++20 compiler but don't
5// support std::format:
6//
7// Centos/RHEL 9, Debian 11&12, NetBSD10, Ubuntu 22.04
8#if __has_include(<format>) // C++20
9#include <format>
10#endif
11
12#include <string_view>
13#include <vector>
14
15#include <QChar> // Fix Qt6 GCC SFINAE warning
16#include <QByteArray>
17#include <QString>
18
19#include "mythbaseexp.h"
20
21namespace StringUtil
22{
23MBASE_PUBLIC bool isValidUTF8(const QByteArray &data);
24
32inline QString intToPaddedString(int n, int width = 2)
33{
34#ifdef __cpp_lib_format // C++20 with <format>
35 return QString::fromStdString(std::format("{:0{}d}", n, width));
36#else
37 return QString("%1").arg(n, width, 10, QChar('0'));
38#endif // __cpp_lib_format
39}
40
41inline QString indentSpaces(unsigned int level, unsigned int size = 4)
42{
43 return {static_cast<int>(level * size), QChar(' ')};
44}
45
49inline QString bool_to_string(bool val)
50{
51 return val ? QStringLiteral("true") : QStringLiteral("false");
52}
53
55std::strong_ordering naturalCompare(const QString &_a, const QString &_b,
56 Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive);
57
62inline bool naturalSortCompare(const QString &a, const QString &b,
63 Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive)
64{
65 // NOLINTNEXTLINE(modernize-use-nullptr)
66 return naturalCompare(a, b, caseSensitivity) < 0;
67}
68
69MBASE_PUBLIC QString formatKBytes(int64_t sizeKB, int prec=1);
70MBASE_PUBLIC QString formatBytes(int64_t sizeB, int prec=1);
71
80inline std::vector<std::string_view> split_sv(const std::string_view s, const std::string_view delimiter)
81{
82 // There are infinitely many empty strings at each position, avoid infinite loop
83 if (delimiter.empty())
84 return {s};
85 std::vector<std::string_view> tokens;
86 size_t last_pos = 0;
87 size_t pos = s.find(delimiter);
88 while (pos != std::string_view::npos)
89 {
90 tokens.emplace_back(s.substr(last_pos, pos - last_pos));
91 last_pos = pos + delimiter.size();
92 pos = s.find(delimiter, last_pos);
93 }
94 tokens.emplace_back(s.substr(last_pos));
95 return tokens;
96}
97
98} // namespace StringUtil
99
100#endif // STRINGUTIL_H_
#define MBASE_PUBLIC
Definition: mythbaseexp.h:8
MBASE_PUBLIC bool isValidUTF8(const QByteArray &data)
Definition: stringutil.cpp:9
std::vector< std::string_view > split_sv(const std::string_view s, const std::string_view delimiter)
Split a std::string_view into a std::vector of std::string_views.
Definition: stringutil.h:80
QString bool_to_string(bool val)
This is equivalent to QVariant(bool).toString()
Definition: stringutil.h:49
MBASE_PUBLIC std::strong_ordering naturalCompare(const QString &_a, const QString &_b, Qt::CaseSensitivity caseSensitivity=Qt::CaseSensitive)
This method chops the input a and b into pieces of digits and non-digits (a1.05 becomes a | 1 | .
Definition: stringutil.cpp:122
bool naturalSortCompare(const QString &a, const QString &b, Qt::CaseSensitivity caseSensitivity=Qt::CaseSensitive)
naturalCompare as a std::sort compatible function (ignoring the third parameter, which is never used)...
Definition: stringutil.h:62
MBASE_PUBLIC QString formatBytes(int64_t sizeB, int prec=1)
Definition: stringutil.cpp:302
QString intToPaddedString(int n, int width=2)
Creates a zero padded string representation of an integer.
Definition: stringutil.h:32
QString indentSpaces(unsigned int level, unsigned int size=4)
Definition: stringutil.h:41
MBASE_PUBLIC QString formatKBytes(int64_t sizeKB, int prec=1)
Definition: stringutil.cpp:281