2022-12-26 21:57:28 +00:00
|
|
|
#include "StringService.hpp"
|
2022-07-23 15:36:05 +01:00
|
|
|
|
|
|
|
|
#include <algorithm>
|
|
|
|
|
#include <cctype>
|
2023-01-21 13:37:56 +00:00
|
|
|
#include <sstream>
|
|
|
|
|
#include <iomanip>
|
2024-02-12 19:17:19 +00:00
|
|
|
#include <ranges>
|
2024-07-23 21:14:22 +01:00
|
|
|
#include <functional>
|
2024-07-25 19:03:26 +01:00
|
|
|
#include <unordered_map>
|
|
|
|
|
#include <mutex>
|
2022-07-23 15:36:05 +01:00
|
|
|
|
2023-08-13 15:47:51 +01:00
|
|
|
namespace Services
|
2022-07-23 15:36:05 +01:00
|
|
|
{
|
2022-12-26 21:57:28 +00:00
|
|
|
std::string StringService::asciiToLower(std::string str) {
|
2022-07-23 15:36:05 +01:00
|
|
|
std::transform(str.begin(), str.end(), str.begin(), [] (unsigned char character) {
|
|
|
|
|
return std::tolower(character);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return str;
|
|
|
|
|
}
|
|
|
|
|
|
2022-12-26 21:57:28 +00:00
|
|
|
std::string StringService::asciiToUpper(std::string str) {
|
2022-07-23 15:36:05 +01:00
|
|
|
std::transform(str.begin(), str.end(), str.begin(), [] (unsigned char character) {
|
|
|
|
|
return std::toupper(character);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return str;
|
|
|
|
|
}
|
|
|
|
|
|
2022-12-26 21:57:28 +00:00
|
|
|
bool StringService::isAscii(const std::string& str) {
|
2022-07-23 15:36:05 +01:00
|
|
|
return !std::any_of(str.begin(), str.end(), [] (unsigned char character) {
|
|
|
|
|
return character > 127;
|
|
|
|
|
});
|
|
|
|
|
}
|
2023-01-21 13:37:56 +00:00
|
|
|
|
2023-05-07 16:45:04 +01:00
|
|
|
std::string StringService::replaceUnprintable(std::string str) {
|
|
|
|
|
std::transform(str.begin(), str.end(), str.begin(), [] (unsigned char character) {
|
|
|
|
|
return character < 32 || character > 126 ? '?' : character;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return str;
|
|
|
|
|
}
|
|
|
|
|
|
2023-09-10 22:27:10 +01:00
|
|
|
std::string StringService::toHex(std::uint32_t value) {
|
2024-07-23 21:14:22 +01:00
|
|
|
auto stream = std::stringstream{};
|
2023-09-10 22:27:10 +01:00
|
|
|
stream << std::hex << std::setfill('0') << std::setw(8) << static_cast<unsigned int>(value);
|
|
|
|
|
return stream.str();
|
|
|
|
|
}
|
|
|
|
|
|
2023-01-21 14:27:45 +00:00
|
|
|
std::string StringService::toHex(unsigned char value) {
|
2024-07-23 21:14:22 +01:00
|
|
|
auto stream = std::stringstream{};
|
2023-01-21 13:37:56 +00:00
|
|
|
stream << std::hex << std::setfill('0') << std::setw(2) << static_cast<unsigned int>(value);
|
|
|
|
|
return stream.str();
|
|
|
|
|
}
|
|
|
|
|
|
2023-01-21 14:27:45 +00:00
|
|
|
std::string StringService::toHex(const std::vector<unsigned char>& data) {
|
2024-07-23 21:14:22 +01:00
|
|
|
auto stream = std::stringstream{};
|
2023-01-21 13:37:56 +00:00
|
|
|
stream << std::hex << std::setfill('0');
|
|
|
|
|
|
|
|
|
|
for (const auto& byte : data) {
|
|
|
|
|
stream << std::setw(2) << static_cast<unsigned int>(byte);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return stream.str();
|
|
|
|
|
}
|
|
|
|
|
|
2023-01-21 14:27:45 +00:00
|
|
|
std::string StringService::toHex(const std::string& data) {
|
2024-07-23 21:14:22 +01:00
|
|
|
auto stream = std::stringstream{};
|
2023-01-21 13:37:56 +00:00
|
|
|
stream << std::hex << std::setfill('0');
|
|
|
|
|
|
|
|
|
|
for (const auto& byte : data) {
|
|
|
|
|
stream << std::setw(2) << static_cast<unsigned int>(byte);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return stream.str();
|
|
|
|
|
}
|
2024-02-12 19:17:19 +00:00
|
|
|
|
2024-07-23 21:14:22 +01:00
|
|
|
std::vector<unsigned char> StringService::dataFromHex(const std::string& hexData) {
|
|
|
|
|
auto output = std::vector<unsigned char>{};
|
|
|
|
|
|
|
|
|
|
for (auto i = 0; i < hexData.size(); i += 2) {
|
|
|
|
|
const auto hexByte = std::string{(hexData.begin() + i), (hexData.begin() + i + 2)};
|
|
|
|
|
output.push_back(static_cast<unsigned char>(std::stoi(hexByte, nullptr, 16)));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return output;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::uint64_t StringService::toUint64(const std::string& str, int base) {
|
|
|
|
|
return static_cast<std::uint64_t>(std::stoul(str, nullptr, base));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::uint32_t StringService::toUint32(const std::string& str, int base) {
|
|
|
|
|
return static_cast<std::uint32_t>(StringService::toUint64(str, base));
|
2024-02-12 19:17:19 +00:00
|
|
|
}
|
|
|
|
|
|
2024-07-23 21:14:22 +01:00
|
|
|
std::uint16_t StringService::toUint16(const std::string& str, int base) {
|
|
|
|
|
return static_cast<std::uint16_t>(StringService::toUint64(str, base));
|
2024-02-12 19:17:19 +00:00
|
|
|
}
|
|
|
|
|
|
2024-07-23 21:14:22 +01:00
|
|
|
std::uint8_t StringService::toUint8(const std::string& str, int base) {
|
|
|
|
|
return static_cast<std::uint8_t>(StringService::toUint64(str, base));
|
2024-02-12 19:17:19 +00:00
|
|
|
}
|
|
|
|
|
|
2024-07-25 19:03:26 +01:00
|
|
|
std::size_t StringService::generateUniqueInteger(const std::string& str) {
|
|
|
|
|
static auto mutex = std::mutex{};
|
|
|
|
|
|
|
|
|
|
static auto lastValue = std::size_t{0};
|
|
|
|
|
static auto map = std::unordered_map<std::string, std::size_t>{};
|
|
|
|
|
|
|
|
|
|
const auto lock = std::unique_lock{mutex};
|
|
|
|
|
|
|
|
|
|
const auto valueIt = map.find(str);
|
|
|
|
|
return valueIt != map.end() ? valueIt->second : map.emplace(str, ++lastValue).first->second;
|
2024-02-12 19:17:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::vector<std::string_view> StringService::split(std::string_view str, char delimiter) {
|
|
|
|
|
auto range = str |
|
|
|
|
|
std::ranges::views::split(delimiter) |
|
2024-02-26 19:29:53 +00:00
|
|
|
std::ranges::views::transform([] (auto&& subRange) -> std::string_view {
|
2024-02-12 19:17:19 +00:00
|
|
|
return std::string_view(
|
|
|
|
|
subRange.begin(),
|
|
|
|
|
static_cast<std::size_t>(std::ranges::distance(subRange))
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return {std::ranges::begin(range), std::ranges::end(range)};
|
|
|
|
|
}
|
2022-07-23 15:36:05 +01:00
|
|
|
}
|