10std::mt19937& getRandomGenerator() {
11 static std::random_device random_device{};
12 static std::mt19937 generator{random_device()};
21 return std::find(s.begin(), s.end(), c) != s.end();
25 int inPos = 0, searchPos = 0;
26 for ( ; inPos < in.length() && searchPos < search.length(); inPos++, searchPos++) {
27 if (search[searchPos] ==
'%') {
28 if (++searchPos == search.length()) {
31 switch (search[searchPos]) {
36 if (!std::isspace(in[inPos]))
return false;
39 if (!(in[inPos] >=
'a' && in[inPos] <=
'z' || in[inPos] >=
'A' && in[inPos] <=
'Z'))
return false;
42 if (!(in[inPos] >=
'A' && in[inPos] <=
'Z'))
return false;
45 if (!(in[inPos] >=
'a' && in[inPos] <=
'z'))
return false;
48 if (!std::isdigit(in[inPos]))
return false;
51 if (in[inPos] !=
'%')
return false;
54 }
else if (in[inPos] != search[searchPos]) {
58 return inPos == in.length() && searchPos == search.length();
62 return std::ranges::equal(s1, s2, [](
char a,
char b) {
return std::tolower(a) == std::tolower(b); });
68 s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](
char c) { return !std::isspace(c); }));
72 while (!s.empty() && std::isspace(s[0])) {
79 s.erase(std::find_if(s.rbegin(), s.rend(), [](
char c) { return !std::isspace(c); }).base(), s.end());
83 while (!s.empty() && std::isspace(s[s.size() - 1])) {
99 s.erase(s.begin(), std::find_if(s.begin(), s.end(), [chars](
char c) {
100 return !contains(chars, c);
105 while (!s.empty() &&
contains(chars, s[0])) {
112 s.erase(std::find_if(s.rbegin(), s.rend(), [chars](
char c) {
113 return !contains(chars, c);
118 while (!s.empty() &&
contains(chars, s[s.size() - 1])) {
129std::string_view
string::trim(std::string_view s, std::string_view chars) {
136 std::vector<std::string> result;
137 std::stringstream ss(std::string{s});
139 while (std::getline(ss, item, delim)) {
140 result.push_back(item);
146 std::transform(input.begin(), input.end(), input.begin(), [](
unsigned char c){ return std::tolower(c); });
150 std::string out{input};
156 std::transform(input.begin(), input.end(), input.begin(), [](
unsigned char c){ return std::toupper(c); });
160 std::string out{input};
166 auto& generator = ::getRandomGenerator();
167 std::uniform_int_distribution distribution{0,
static_cast<int>(chars.length() - 1)};
170 for (uint16_t i = 0; i < length; i++) {
171 out += chars[distribution(generator)];
178 static constexpr std::string_view chars =
"0123456789abcdef";
180 auto& generator = ::getRandomGenerator();
181 std::uniform_int_distribution distribution{0,
static_cast<int>(chars.length() - 1)};
184 for (uint16_t i = 0; i < 8; i++) {
185 out += chars[distribution(generator)];
188 for (uint16_t i = 0; i < 3; i++) {
189 for (uint16_t j = 0; j < 4; j++) {
190 out += chars[distribution(generator)];
194 for (uint16_t i = 0; i < 12; i++) {
195 out += chars[distribution(generator)];
202 const auto numStr = std::to_string(number);
203 return std::string(width - std::min<std::string::size_type>(width, numStr.length()), pad) + numStr;
207 std::replace(path.begin(), path.end(),
'\\',
'/');
208 if (stripSlashPrefix && path.starts_with(
'/')) {
209 path = path.substr(1);
211 if (stripSlashSuffix && path.ends_with(
'/')) {
217 std::replace(path.begin(), path.end(),
'/',
'\\');
218 if (stripSlashPrefix && path.starts_with(
'\\')) {
219 path = path.substr(1);
221 if (stripSlashSuffix && path.ends_with(
'\\')) {
226std::from_chars_result
string::toBool(std::string_view number,
bool& out,
int base) {
228 const auto result = std::from_chars(number.data(), number.data() + number.size(), tmp, base);
std::string createRandom(uint16_t length=32, std::string_view chars="0123456789_abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ")
bool contains(std::string_view s, char c)
void normalizeSlashes(std::string &path, bool stripSlashPrefix=false, bool stripSlashSuffix=true)
std::from_chars_result toBool(std::string_view number, bool &out, int base=10)
void ltrim(std::string &s)
std::vector< std::string > split(std::string_view s, char delim)
void denormalizeSlashes(std::string &path, bool stripSlashPrefix=false, bool stripSlashSuffix=true)
bool matches(std::string_view in, std::string_view search)
A very basic regex-like pattern checker for ASCII strings.
std::string padNumber(int64_t number, int width, char pad='0')
void rtrim(std::string &s)
void toUpper(std::string &input)
void trim(std::string &s)
bool iequals(std::string_view s1, std::string_view s2)
void toLower(std::string &input)
std::string generateUUIDv4()