1#ifndef IV_SRC_UTILS_STRINGUTILS_HPP_
2#define IV_SRC_UTILS_STRINGUTILS_HPP_
26std::string
stringJoin(
const std::vector<std::string> &strings,
char delim);
55template<
typename CharT1,
typename CharT2>
56inline int32_t
compareSubstring(
const CharT1 *str1,
const CharT2 *str2, std::size_t length)
57 requires std::convertible_to<CharT1, char> && std::convertible_to<CharT2, char>
59 if (str1 ==
nullptr || str2 ==
nullptr)
61 throw std::invalid_argument(
"Null pointer argument");
64 std::basic_string<CharT1> string1(str1);
65 std::basic_string<CharT2> string2(str2);
67 if (length > string1.size() || length > string2.size())
69 throw std::invalid_argument(
"Length exceeds string size");
72 return string1.compare(0, length, string2, 0, length);
80template<
typename StringType>
82 requires std::convertible_to<StringType, const char *>
84 if (strResult ==
nullptr)
86 throw std::invalid_argument(
"strResult pointer is nullptr");
91 throw std::invalid_argument(
"str pointer is nullptr");
94 strResult->append(str);
103template<
typename StringType,
typename DelimiterType>
104std::vector<StringType>
splitOn(
const StringType &str,
const DelimiterType &delim)
105 requires std::is_convertible_v<StringType, std::string> ||
106 (std::is_convertible_v<StringType, std::string_view> &&
107 (std::is_convertible_v<DelimiterType, std::string> ||
108 std::is_same_v<DelimiterType, typename StringType::value_type>) )
110 if constexpr (std::is_same_v<DelimiterType, typename StringType::value_type>)
119 if constexpr (std::is_class_v<DelimiterType>)
123 throw std::invalid_argument(
"Delimiter cannot be empty");
135 std::vector<StringType> elems {};
139 while ((found = str.find(delim, pos)) != StringType::npos)
141 elems.push_back(str.substr(pos, found - pos));
143 if constexpr (std::is_class_v<DelimiterType>)
145 pos = found + delim.size();
153 elems.push_back(str.substr(pos));
157template<
typename StringType>
158std::string
truncate(
const StringType &str,
size_t length,
bool show_ellipsis =
true)
159 requires std::is_convertible_v<StringType, std::
string> or std::is_convertible_v<StringType, std::string_view>
161 if (str.size() <= length)
168 return str.substr(0, length - 3) +
"...";
171 return str.substr(0, length);
174template<iv::concepts::StringRepresentable T1, iv::concepts::StringRepresentable T2>
177 std::string_view sv1;
178 std::string_view sv2;
180 if constexpr (std::same_as<T1, char>)
182 sv1 = std::string_view(&str1, 1);
184 else if constexpr (std::same_as<T1, std::vector<char>>)
186 sv1 = std::string_view(str1.data(), str1.size());
193 if constexpr (std::same_as<T2, char>)
195 sv2 = std::string_view(&str2, 1);
197 else if constexpr (std::same_as<T2, std::vector<char>>)
199 sv2 = std::string_view(str2.data(), str2.size());
206 if (sv1.size() != sv2.size())
211 return std::equal(sv1.begin(), sv1.end(), sv2.begin(),
212 [](
char a,
char b) { return std::tolower(a) == std::tolower(b); });
215template<iv::concepts::StringRepresentable T1, iv::concepts::StringRepresentable T2>
218 std::string_view sv1;
219 std::string_view sv2;
221 if constexpr (std::same_as<T1, char>)
223 sv1 = std::string_view(&str1, 1);
225 else if constexpr (std::same_as<T1, std::vector<char>>)
227 sv1 = std::string_view(str1.data(), str1.size());
234 if constexpr (std::same_as<T2, char>)
236 sv2 = std::string_view(&str2, 1);
238 else if constexpr (std::same_as<T2, std::vector<char>>)
240 sv2 = std::string_view(str2.data(), str2.size());
247 return sv1.compare(sv2) == 0;
256inline void replaceSubString(std::string &source,
const std::string &strToSearch,
const std::string &strToReplace)
259 while ((pos = source.find(strToSearch, pos)) != std::string::npos)
261 source.replace(pos, strToSearch.length(), strToReplace);
262 pos += strToReplace.length();
272inline void replaceChar(std::string *str,
char charSearching,
char charToChange)
274 std::replace(str->begin(), str->end(), charSearching, charToChange);
279 return std::string(numChars, car);
287 return std::isalnum(car, loc);
293 return std::isalpha(car, loc);
298 static constexpr std::string_view validChars {
".-"};
299 return validChars.contains(car);
304 static constexpr std::string_view validChars {
"-"};
305 return validChars.contains(car);
310 return std::isdigit(car);
325 const char *validChars =
"0123456789abcdefABCDEF";
326 return std::strchr(validChars, car) !=
nullptr;
343std::string
formatNumber(T number, std::optional<uint8_t> precision = std::nullopt)
348 std::ostringstream out;
353 if (not precision.has_value() and decimalDigits == 0)
357 out << std::fixed << std::setprecision(decimalDigits) << number;
361 if constexpr (std::is_same_v<T, int8_t> or std::is_same_v<T, uint8_t>)
363 out << static_cast<int32_t>(number);
371 const auto strValue = out.str();
372 return strValue ==
"-0" ?
"0" : strValue;
374 catch (
const std::exception &e)
380std::string
demangle(
const std::type_info &ti);
Definition concepts.hpp:192
Definition concepts.hpp:187
std::string iso88591_to_utf8(const std::string_view input)
Definition stringUtils.cpp:295
std::string demangle(const std::type_info &ti)
Definition stringUtils.cpp:283
void appendToString(std::string *strResult, StringType str)
Concatenate two string.
Definition stringUtils.hpp:81
bool isEqualStringsCaseInsensitive(const T1 &str1, const T2 &str2)
Definition stringUtils.hpp:175
bool isSpecialIntegerCharacter(char car)
Definition stringUtils.hpp:302
std::string createWithInitialization(char car, uint64_t numChars)
Definition stringUtils.hpp:277
std::string truncate(const StringType &str, size_t length, bool show_ellipsis=true)
Definition stringUtils.hpp:158
int32_t compareSubstring(const CharT1 *str1, const CharT2 *str2, std::size_t length)
Simple comparator of x chars where x is the length provided.
Definition stringUtils.hpp:56
bool isAlphaNumericCharacter(char car)
Definition stringUtils.hpp:284
std::vector< StringType > splitOn(const StringType &str, const DelimiterType &delim)
Definition stringUtils.hpp:104
std::optional< size_t > findCharacterInString(std::string_view str, char car)
Definition stringUtils.cpp:241
std::string stringJoin(const std::vector< std::string > &strings, char delim)
Definition stringUtils.cpp:17
bool isValidIntegerCharacter(char car)
Definition stringUtils.hpp:318
bool isValidRealNumberCharacter(char car)
Definition stringUtils.hpp:313
void replaceChar(std::string *str, char charSearching, char charToChange)
Look for a character into a string and when it is found, replace it for another character.
Definition stringUtils.hpp:272
bool isSpecialRealNumberCharacter(char car)
Definition stringUtils.hpp:296
uint32_t stringToIpv4(std::string_view str)
Definition stringUtils.cpp:37
bool isHexadecimalString(const std::string &str)
Definition stringUtils.cpp:313
std::string ipv4ToString(uint32_t ip)
Definition stringUtils.cpp:65
bool isDigitCharacter(char car)
Definition stringUtils.hpp:308
std::string formatNumber(T number, std::optional< uint8_t > precision=std::nullopt)
Check if a string is a number, only applies precision to floating point numbers.
Definition stringUtils.hpp:343
bool isEqual(const T1 &str1, const T2 &str2)
Definition stringUtils.hpp:216
uint8_t calculateDecimalDigits(std::string_view str)
Definition stringUtils.cpp:253
bool isHexadecimalCharacter(char car)
Definition stringUtils.hpp:323
bool hostWildcardMatch(std::string_view issued_, std::string_view host_)
Definition stringUtils.cpp:105
void replaceSubString(std::string &source, const std::string &strToSearch, const std::string &strToReplace)
Look for a substring into a string and when it is found, replace it for another substring.
Definition stringUtils.hpp:256
bool isAlphabeticCharacter(char car)
Definition stringUtils.hpp:290