7 #ifndef IG_OMW_STRING_H
8 #define IG_OMW_STRING_H
16 #include "../omw/defs.h"
17 #include "../omw/int.h"
18 #include "../omw/vector.h"
20 #if OMW_CPPSTD >= OMW_CPPSTD_20
21 #define OMW_STDSTRING_CONSTEXPR constexpr
23 #define OMW_STDSTRING_CONSTEXPR
30 #define OMW_UTF8CP_00C4 "\xC3\x84"
33 #define OMW_UTF8CP_00D6 "\xC3\x96"
34 #define OMW_UTF8CP_00DC "\xC3\x9C"
35 #define OMW_UTF8CP_00E4 "\xC3\xA4"
36 #define OMW_UTF8CP_00F6 "\xC3\xB6"
37 #define OMW_UTF8CP_00FC "\xC3\xBC"
38 #define OMW_UTF8CP_2580 "\xE2\x96\x80"
39 #define OMW_UTF8CP_2584 "\xE2\x96\x84"
40 #define OMW_UTF8CP_2588 "\xE2\x96\x88"
45 #define OMW_UTF8CP_Auml OMW_UTF8CP_00C4
46 #define OMW_UTF8CP_Ouml OMW_UTF8CP_00D6
47 #define OMW_UTF8CP_Uuml OMW_UTF8CP_00DC
48 #define OMW_UTF8CP_auml OMW_UTF8CP_00E4
49 #define OMW_UTF8CP_ouml OMW_UTF8CP_00F6
50 #define OMW_UTF8CP_uuml OMW_UTF8CP_00FC
61 const char*
const UTF8CP_00C4 = OMW_UTF8CP_00C4;
64 const char*
const UTF8CP_00D6 = OMW_UTF8CP_00D6;
65 const char*
const UTF8CP_00DC = OMW_UTF8CP_00DC;
66 const char*
const UTF8CP_00E4 = OMW_UTF8CP_00E4;
67 const char*
const UTF8CP_00F6 = OMW_UTF8CP_00F6;
68 const char*
const UTF8CP_00FC = OMW_UTF8CP_00FC;
69 const char*
const UTF8CP_2580 = OMW_UTF8CP_2580;
70 const char*
const UTF8CP_2584 = OMW_UTF8CP_2584;
71 const char*
const UTF8CP_2588 = OMW_UTF8CP_2588;
76 const char*
const UTF8CP_Auml = omw::UTF8CP_00C4;
77 const char*
const UTF8CP_Ouml = omw::UTF8CP_00D6;
78 const char*
const UTF8CP_Uuml = omw::UTF8CP_00DC;
79 const char*
const UTF8CP_auml = omw::UTF8CP_00E4;
80 const char*
const UTF8CP_ouml = omw::UTF8CP_00F6;
81 const char*
const UTF8CP_uuml = omw::UTF8CP_00FC;
84 constexpr
char pairtos_defaultDelimiter =
';';
85 const char*
const hexStrDigitsUpper =
"0123456789ABCDEF";
86 const char*
const hexStrDigitsLower =
"0123456789abcdef";
87 const char*
const hexStrDigits = hexStrDigitsUpper;
88 constexpr
char toHexStr_defaultDelimiter = 0x20;
92 using stdStringVector_t = std::vector<std::string>;
93 constexpr omw::stdStringVector_t::size_type stdStringVector_npos =
static_cast<omw::stdStringVector_t::size_type
>(-1);
96 using stringVector_t = std::vector<omw::string>;
97 constexpr omw::stringVector_t::size_type stringVector_npos =
static_cast<omw::stringVector_t::size_type
>(-1);
108 StringReplacePair(
const char searchElement,
const char replaceElement) : m_s(1, searchElement), m_r(1, replaceElement) {}
123 inline OMW_STDSTRING_CONSTEXPR
bool contains(
const std::string& str,
char ch) {
return (str.find(ch) != std::string::npos); }
124 inline OMW_STDSTRING_CONSTEXPR
bool contains(
const std::string& str,
const char* s) {
return (str.find(s) != std::string::npos); }
125 #if (OMW_CPPSTD < OMW_CPPSTD_17)
126 inline OMW_STDSTRING_CONSTEXPR
bool contains(
const std::string& str,
const std::string& s) {
return (str.find(s) != std::string::npos); }
128 inline OMW_STDSTRING_CONSTEXPR
bool contains(
const std::string& str,
const std::string_view& sv) {
return (str.find(sv) != std::string::npos); }
131 omw::stringVector_t split(
const std::string& str,
char delimiter, omw::stringVector_t::size_type maxTokenCount = omw::stringVector_npos);
132 inline omw::stringVector_t split(
const char* str,
char delimiter, omw::stringVector_t::size_type maxTokenCount = omw::stringVector_npos) {
return (str ? omw::split(
std::string(str), delimiter, maxTokenCount) : omw::stringVector_t()); }
133 omw::stringVector_t splitLen(
const std::string& str, std::string::size_type tokenLength, omw::stringVector_t::size_type maxTokenCount = omw::stringVector_npos);
134 inline omw::stringVector_t splitLen(
const char* str, std::string::size_type tokenLength, omw::stringVector_t::size_type maxTokenCount = omw::stringVector_npos) {
return (str ? omw::splitLen(
std::string(str), tokenLength, maxTokenCount) : omw::stringVector_t()); }
143 string(omw::string::size_type count,
char c);
145 string(
const char* str, omw::string::size_type count);
147 string(
const std::string& other, std::string::size_type pos, std::string::size_type count = std::string::npos);
148 string(
const char* first,
const char* last);
154 #ifndef OMWi_DOXYGEN_PREDEFINE
155 #if (OMW_CPPSTD < OMW_CPPSTD_23)
156 bool contains(
char ch)
const {
return (this->find(ch) != omw::string::npos); }
157 bool contains(
const char* str)
const {
return (this->find(str) != omw::string::npos); }
158 #if (OMW_CPPSTD < OMW_CPPSTD_17)
159 bool contains(
const std::string& str)
const {
return (this->find(str) != omw::string::npos); }
161 bool contains(std::string_view sv)
const {
return (this->find(sv) != omw::string::npos); }
164 #else // OMWi_DOXYGEN_PREDEFINE
169 #endif // OMWi_DOXYGEN_PREDEFINE
174 omw::string&
replaceAll(
char search,
char replace, size_type startPos = 0,
size_t* nReplacements =
nullptr);
179 omw::string&
replaceAll(
const std::vector<omw::StringReplacePair>& pairs, size_type startPos = 0,
size_t* nReplacementsTotal =
nullptr, std::vector<size_t>* nReplacements =
nullptr);
185 omw::stringVector_t split(
char delimiter, omw::stringVector_t::size_type maxTokenCount = omw::stringVector_npos)
const;
188 omw::stringVector_t splitLen(omw::string::size_type tokenLength, omw::stringVector_t::size_type maxTokenCount = omw::stringVector_npos)
const;
220 std::string&
replaceAll(
std::string& str,
const std::vector<omw::StringReplacePair>& pairs, std::string::size_type startPos = 0,
size_t* nReplacementsTotal =
nullptr, std::vector<size_t>* nReplacements =
nullptr);
228 inline omw::string to_string(int32_t value) {
return std::to_string(value); }
229 inline omw::string to_string(uint32_t value) {
return std::to_string(value); }
230 inline omw::string to_string(int64_t value) {
return std::to_string(value); }
231 inline omw::string to_string(uint64_t value) {
return std::to_string(value); }
232 inline omw::string to_string(
float value) {
return std::to_string(value); }
233 inline omw::string to_string(
double value) {
return std::to_string(value); }
234 inline omw::string to_string(
long double value) {
return std::to_string(value); }
236 omw::string to_string(
bool value,
bool asText =
true);
239 omw::string to_string(
const std::pair<int32_t, int32_t>& value,
char delimiter = pairtos_defaultDelimiter);
240 omw::string to_string(
const std::pair<uint32_t, uint32_t>& value,
char delimiter = pairtos_defaultDelimiter);
241 omw::string to_string(
const std::pair<int64_t, int64_t>& value,
char delimiter = pairtos_defaultDelimiter);
242 omw::string to_string(
const std::pair<uint64_t, uint64_t>& value,
char delimiter = pairtos_defaultDelimiter);
243 omw::string to_string(
const std::pair<float, float>& value,
char delimiter = pairtos_defaultDelimiter);
244 omw::string to_string(
const std::pair<double, double>& value,
char delimiter = pairtos_defaultDelimiter);
245 omw::string to_string(
const std::pair<long double, long double>& value,
char delimiter = pairtos_defaultDelimiter);
253 size_t stoz(
const std::string& str,
size_t* pos =
nullptr,
int base = 10);
255 std::pair<int32_t, int32_t>
stoipair(
const std::string& str,
char delimiter = pairtos_defaultDelimiter);
280 omw::string toHexStr(int16_t value,
char delimiter);
281 omw::string toHexStr(uint16_t value,
char delimiter);
282 omw::string toHexStr(int32_t value,
char delimiter);
283 omw::string toHexStr(uint32_t value,
char delimiter);
284 omw::string toHexStr(int64_t value,
char delimiter);
285 omw::string toHexStr(uint64_t value,
char delimiter);
287 omw::string toHexStr(
const std::vector<char>& data,
char delimiter = toHexStr_defaultDelimiter);
288 omw::string toHexStr(
const std::vector<uint8_t>& data,
char delimiter = toHexStr_defaultDelimiter);
289 omw::string toHexStr(
const char* data,
size_t count,
char delimiter = toHexStr_defaultDelimiter);
290 omw::string toHexStr(
const uint8_t* data,
size_t count,
char delimiter = toHexStr_defaultDelimiter);
298 std::vector<uint8_t> hexstovector(
const std::string& str,
char delimiter = toHexStr_defaultDelimiter);
313 void rmNonHex(
char* str);
328 omw::string join(
const omw::stringVector_t& strings);
329 omw::string join(
const omw::stringVector_t& strings,
char delimiter);
337 omw::stringVector_t stringVector(
const char*
const* strings,
size_t count);
338 omw::stringVector_t stringVector(
const std::string* strings,
size_t count);
339 omw::stringVector_t stringVector(
const omw::string* strings,
size_t count);
340 omw::stringVector_t stringVector(
const omw::stdStringVector_t& strvec);
342 omw::stdStringVector_t stdStringVector(
const char*
const* strings,
size_t count);
343 omw::stdStringVector_t stdStringVector(
const std::string* strings,
size_t count);
344 omw::stdStringVector_t stdStringVector(
const omw::string* strings,
size_t count);
345 omw::stdStringVector_t stdStringVector(
const omw::stringVector_t& strvec);
356 constexpr
bool isBlank(
char ch) {
return ((ch == 0x09) || (ch == 0x20)); }
357 constexpr
bool isCntrl(
char ch) {
return (((ch >= 0x00) && (ch <= 0x1F)) || (ch == 0x7F)); }
358 constexpr
bool isDigit(
char ch) {
return ((ch >= 0x30) && (ch <= 0x39)); }
359 constexpr
bool isGraph(
char ch) {
return ((ch >= 0x21) && (ch <= 0x7E)); }
360 constexpr
bool isHex(
char ch)
362 return (((ch >= 0x30) && (ch <= 0x39)) || ((ch >= 0x41) && (ch <= 0x46)) ||
363 ((ch >= 0x61) && (ch <= 0x66)));
365 constexpr
bool isLower(
char ch) {
return ((ch >= 0x61) && (ch <= 0x7A)); }
366 constexpr
bool isNull(
char ch) {
return (ch == 0x00); }
367 constexpr
bool isPrint(
char ch) {
return ((ch >= 0x20) && (ch <= 0x7E)); }
368 constexpr
bool isPunct(
char ch)
370 return (((ch >= 0x21) && (ch <= 0x2F)) || ((ch >= 0x3A) && (ch <= 0x40)) ||
371 ((ch >= 0x5B) && (ch <= 0x60)) || ((ch >= 0x7B) && (ch <= 0x7E)));
373 constexpr
bool isSpace(
char ch) {
return (((ch >= 0x09) && (ch <= 0x0D)) || (ch == 0x20)); }
374 constexpr
bool isUpper(
char ch) {
return ((ch >= 0x41) && (ch <= 0x5A)); }
375 constexpr
bool isAlpha(
char ch) {
return (isLower(ch) || isUpper(ch)); }
376 constexpr
bool isAlnum(
char ch) {
return (isAlpha(ch) || isDigit(ch)); }
386 bool isHex(
const std::string& str, std::string::size_type pos = 0, std::string::size_type count = std::string::npos);
390 size_t peekNewLine(
const char* p,
const char* end);
393 omw::string readString(
const std::vector<uint8_t>& data, std::vector<uint8_t>::size_type pos, std::vector<uint8_t>::size_type count);
395 void writeString(std::vector<uint8_t>& buffer, std::vector<uint8_t>::size_type pos,
const std::string& str);
402 #endif // IG_OMW_STRING_H