omw  0.1.1
string.h
1 /*
2 author Oliver Blaser
3 date 08.12.2021
4 copyright MIT - Copyright (c) 2021 Oliver Blaser
5 */
6 
7 #ifndef IG_OMW_STRING_H
8 #define IG_OMW_STRING_H
9 
10 #include <string>
11 #include <utility>
12 #include <vector>
13 
14 #include "../omw/defs.h"
15 
16 
17 #define OMWi_STRING_IMPLEMENT_CONTAINS (1)
18 #if defined(_MSVC_LANG)
19 #if (_MSVC_LANG > 202002L)
20 #undef OMWi_STRING_IMPLEMENT_CONTAINS
21 #endif
22 #elif defined(__cplusplus)
23 #if (__cplusplus > 202100L)
24 #undef OMWi_STRING_IMPLEMENT_CONTAINS
25 #endif
26 #endif
27 
28 
29 namespace omw
30 {
35  const char* const UTF8CP_00C4 = "\xC3\x84";
38  const char* const UTF8CP_00D6 = "\xC3\x96";
39  const char* const UTF8CP_00DC = "\xC3\x9C";
40  const char* const UTF8CP_00E4 = "\xC3\xA4";
41  const char* const UTF8CP_00F6 = "\xC3\xB6";
42  const char* const UTF8CP_00FC = "\xC3\xBC";
43  const char* const UTF8CP_2580 = "\xE2\x96\x80";
44  const char* const UTF8CP_2584 = "\xE2\x96\x84";
45  const char* const UTF8CP_2588 = "\xE2\x96\x88";
47 
50  const char* const UTF8CP_Auml = omw::UTF8CP_00C4;
51  const char* const UTF8CP_Ouml = omw::UTF8CP_00D6;
52  const char* const UTF8CP_Uuml = omw::UTF8CP_00DC;
53  const char* const UTF8CP_auml = omw::UTF8CP_00E4;
54  const char* const UTF8CP_ouml = omw::UTF8CP_00F6;
55  const char* const UTF8CP_uuml = omw::UTF8CP_00FC;
57 
58  constexpr char pairtos_defaultSepChar = ';';
59  const char* const hexStrDigitsUpper = "0123456789ABCDEF";
60  const char* const hexStrDigitsLower = "0123456789abcdef";
61  const char* const hexStrDigits = hexStrDigitsUpper;
62  constexpr char toHexStr_defaultSepChar = 0x20;
63 
64 
65 
66  using stdStringVector_t = std::vector<std::string>;
67  using stdStringVector_size_type = omw::stdStringVector_t::size_type;
68  constexpr stdStringVector_size_type stdStringVector_npos = (omw::stdStringVector_size_type)-1;
69 
70  class string;
71  using stringVector_t = std::vector<omw::string>;
72  using stringVector_size_type = omw::stringVector_t::size_type;
73  constexpr stringVector_size_type stringVector_npos = (omw::stringVector_size_type)-1;
74 
75 
76 
78  {
79  public:
81  StringReplacePair(const std::string& searchElement, const std::string& replaceElement);
82  StringReplacePair(const char searchElement, const std::string& replaceElement);
83  StringReplacePair(const std::string& searchElement, const char replaceElement);
84  StringReplacePair(const char searchElement, const char replaceElement);
85  virtual ~StringReplacePair() {}
86 
87  const std::string& search() const;
88  const std::string& replace() const;
89 
90  private:
91  std::string searchElem;
92  std::string replaceElem;
93  };
94 
95  class string : public std::string
96  {
97  public:
98  string();
99  string(std::string::size_type count, char c);
100  string(const char* str);
101  string(const char* str, std::string::size_type count);
102  string(const std::string& other, std::string::size_type pos = 0, std::string::size_type count = std::string::npos);
103  string(const char* first, const char* last);
104  virtual ~string() {}
105 
106 #ifdef OMWi_STRING_IMPLEMENT_CONTAINS
107  bool contains(char ch) const;
108  bool contains(const char* str) const;
109  bool contains(const std::string& str) const;
110 #endif
111 
112  omw::string& replaceFirst(const std::string& search, const std::string& replace, size_type startPos = 0);
113  omw::string& replaceFirst(const omw::StringReplacePair& pair, size_type startPos = 0);
114 
115  omw::string& replaceAll(char search, char replace, size_type startPos = 0, size_t* nReplacements = nullptr);
116  omw::string& replaceAll(char search, const std::string& replace, size_type startPos = 0, size_t* nReplacements = nullptr);
117  omw::string& replaceAll(const std::string& search, char replace, size_type startPos = 0, size_t* nReplacements = nullptr);
118  omw::string& replaceAll(const std::string& search, const std::string& replace, size_type startPos = 0, size_t* nReplacements = nullptr);
119  omw::string& replaceAll(const omw::StringReplacePair& pair, size_type startPos = 0, size_t* nReplacements = nullptr);
120  omw::string& replaceAll(const std::vector<omw::StringReplacePair>& pairs, size_type startPos = 0, size_t* nReplacementsTotal = nullptr, std::vector<size_t>* nReplacements = nullptr);
121  omw::string& replaceAll(const omw::StringReplacePair* pairs, size_t count, size_type startPos = 0, size_t* nReplacementsTotal = nullptr, std::vector<size_t>* nReplacements = nullptr);
122 
123  omw::stringVector_t split(omw::string::size_type tokenLength, omw::stringVector_size_type maxTokenCount = omw::stringVector_npos) const;
124  //omw::stringVector_t split(char sepChar, omw::stringVector_size_type maxTokenCount = omw::stringVector_npos) const;
125  //omw::stringVector_t split(const char* sepString, omw::stringVector_size_type maxTokenCount = omw::stringVector_npos) const;
126  //omw::stringVector_t split(const std::string& sepString, omw::stringVector_size_type maxTokenCount = omw::stringVector_npos) const;
127 
131  //omw::string& lower(); // reserved name
132  omw::string& lower_ascii();
133  omw::string& lower_asciiExt();
134  //omw::string& upper(); // reserved name
135  omw::string& upper_ascii();
136  omw::string& upper_asciiExt();
137  //omw::string toLower() const; // reserved name
138  omw::string toLower_ascii() const;
139  omw::string toLower_asciiExt() const;
140  //omw::string toUpper() const; // reserved name
141  omw::string toUpper_ascii() const;
142  omw::string toUpper_asciiExt() const;
144 
145  omw::string& encodeUrl();
146  omw::string toUrlEncoded() const;
147  };
148 
149 
150 
151  omw::string to_string(int32_t value);
152  omw::string to_string(uint32_t value);
153  omw::string to_string(int64_t value);
154  omw::string to_string(uint64_t value);
155  omw::string to_string(float value);
156  omw::string to_string(double value);
157  omw::string to_string(long double value);
158 
159  omw::string to_string(bool value, bool asText = true);
160  omw::string to_string(const std::pair<int32_t, int32_t>& value, char sepChar = pairtos_defaultSepChar);
161  omw::string to_string(const std::pair<uint32_t, uint32_t>& value, char sepChar = pairtos_defaultSepChar);
162  omw::string to_string(const std::pair<int64_t, int64_t>& value, char sepChar = pairtos_defaultSepChar);
163  omw::string to_string(const std::pair<uint64_t, uint64_t>& value, char sepChar = pairtos_defaultSepChar);
164  omw::string to_string(const std::pair<float, float>& value, char sepChar = pairtos_defaultSepChar);
165  omw::string to_string(const std::pair<double, double>& value, char sepChar = pairtos_defaultSepChar);
166  omw::string to_string(const std::pair<long double, long double>& value, char sepChar = pairtos_defaultSepChar);
167 
168 
169 
170  bool stob(const std::string& boolStr);
171  std::pair<int32_t, int32_t> stoipair(const std::string& str, char sepChar = pairtos_defaultSepChar);
172  //std::pair<uint32_t, uint32_t> stouipair(const std::string& str, char sepChar = pairtos_defaultSepChar);
173  //std::pair<int64_t, int64_t> stoi64pair(const std::string& str, char sepChar = pairtos_defaultSepChar);
174  //std::pair<uint64_t, uint64_t> stoui64pair(const std::string& str, char sepChar = pairtos_defaultSepChar);
175  //std::pair<float, float> stofpair(const std::string& str, char sepChar = pairtos_defaultSepChar);
176  //std::pair<double, double> stodpair(const std::string& str, char sepChar = pairtos_defaultSepChar);
177  //std::pair<long double, long double> stoldpair(const std::string& str, char sepChar = pairtos_defaultSepChar);
178 
179 
180 
183  omw::string toHexStr(int8_t value);
184  omw::string toHexStr(uint8_t value);
185  omw::string toHexStr(int16_t value);
186  omw::string toHexStr(uint16_t value);
187  omw::string toHexStr(int32_t value);
188  omw::string toHexStr(uint32_t value);
189  omw::string toHexStr(int64_t value);
190  omw::string toHexStr(uint64_t value);
191  omw::string toHexStr(int16_t value, char sepChar);
192  omw::string toHexStr(uint16_t value, char sepChar);
193  omw::string toHexStr(int32_t value, char sepChar);
194  omw::string toHexStr(uint32_t value, char sepChar);
195  omw::string toHexStr(int64_t value, char sepChar);
196  omw::string toHexStr(uint64_t value, char sepChar);
197  omw::string toHexStr(const std::vector<char>& data, char sepChar = toHexStr_defaultSepChar);
198  omw::string toHexStr(const std::vector<uint8_t>& data, char sepChar = toHexStr_defaultSepChar);
199  omw::string toHexStr(const char* data, size_t count, char sepChar = toHexStr_defaultSepChar);
200  omw::string toHexStr(const uint8_t* data, size_t count, char sepChar = toHexStr_defaultSepChar);
201 
202  int32_t hexstoi(const std::string& str);
203  int64_t hexstoi64(const std::string& str);
204  uint32_t hexstoui(const std::string& str);
205  uint64_t hexstoui64(const std::string& str);
206  std::vector<uint8_t> hexstovector(const std::string& str, char sepChar = toHexStr_defaultSepChar);
207 
208 
209 
210  omw::string sepHexStr(const std::string& str);
211  omw::string sepHexStr(const std::string& str, char sepChar);
212  omw::string sepHexStr(const std::string& str, char rmChar, char sepChar);
213  omw::string sepHexStr(const std::string& str, const char* rmChars, size_t count, char sepChar = toHexStr_defaultSepChar);
214  omw::string sepHexStr(const std::string& str, const std::vector<char>& rmChars, char sepChar = toHexStr_defaultSepChar);
215  //omw::string sepHexStr(const std::string& str, const char* rmString, char sepChar = toHexStr_defaultSepChar);
216  //omw::string sepHexStr(const std::string& str, const std::string& rmString, char sepChar = toHexStr_defaultSepChar);
217  //omw::string sepHexStr(const std::string& str, const std::string* rmStrings, size_t count, char sepChar = toHexStr_defaultSepChar);
218  //omw::string sepHexStr(const std::string& str, const omw::string* rmStrings, size_t count, char sepChar = toHexStr_defaultSepChar);
219  //omw::string sepHexStr(const std::string& str, const omw::stdStringVector_t& rmStrings, char sepChar = toHexStr_defaultSepChar);
220  //omw::string sepHexStr(const std::string& str, const omw::stringVector_t& rmStrings, char sepChar = toHexStr_defaultSepChar);
221 
222  omw::string rmNonHex(const std::string& str);
223  void rmNonHex(char* str);
224  void rmNonHex(std::string& str);
226 
227 
228 
229  // TODO check overloads
230  //omw::string join(const std::string* strings, size_t count, char sepChar = '\0');
231  //omw::string join(const std::string* strings, size_t count, const char* sepString);
232  //omw::string join(const std::string* strings, size_t count, const std::string& sepString);
233  //omw::string join(const omw::stdStringVector_t& strings);
234  //omw::string join(const omw::stdStringVector_t& strings, char sepChar);
235  //omw::string join(const omw::stdStringVector_t& strings, const char* sepString);
236  //omw::string join(const omw::stdStringVector_t& strings, const std::string& sepString);
237  //omw::string join(const omw::stringVector_t& strings);
238  omw::string join(const omw::stringVector_t& strings);
239  omw::string join(const omw::stringVector_t& strings, char sepChar);
240  //omw::string join(const omw::stringVector_t& strings, const char* sepString);
241  //omw::string join(const omw::stringVector_t& strings, const std::string& sepString);
242 
243 
244 
247  omw::stringVector_t stringVector(const char* const* strings, size_t count);
248  omw::stringVector_t stringVector(const std::string* strings, size_t count);
249  omw::stringVector_t stringVector(const omw::string* strings, size_t count);
250  omw::stringVector_t stringVector(const omw::stdStringVector_t& strvec);
251 
252  omw::stdStringVector_t stdStringVector(const char* const* strings, size_t count);
253  omw::stdStringVector_t stdStringVector(const std::string* strings, size_t count);
254  omw::stdStringVector_t stdStringVector(const omw::string* strings, size_t count);
255  omw::stdStringVector_t stdStringVector(const omw::stringVector_t& strvec);
257 
258 
259 
260  //bool isValidUTF8(const std::string& str);
261 
262 
263 
266  constexpr bool isBlank(char ch) { return ((ch == 0x09) || (ch == 0x20)); }
267  constexpr bool isCntrl(char ch) { return (((ch >= 0x00) && (ch <= 0x1F)) || (ch == 0x7F)); }
268  constexpr bool isDigit(char ch) { return ((ch >= 0x30) && (ch <= 0x39)); }
269  constexpr bool isGraph(char ch) { return ((ch >= 0x21) && (ch <= 0x7E)); }
270  constexpr bool isHex(char ch)
271  {
272  return (((ch >= 0x30) && (ch <= 0x39)) || ((ch >= 0x41) && (ch <= 0x46)) ||
273  ((ch >= 0x61) && (ch <= 0x66)));
274  }
275  constexpr bool isLower(char ch) { return ((ch >= 0x61) && (ch <= 0x7A)); }
276  constexpr bool isNull(char ch) { return (ch == 0x00); }
277  constexpr bool isPrint(char ch) { return ((ch >= 0x20) && (ch <= 0x7E)); }
278  constexpr bool isPunct(char ch)
279  {
280  return (((ch >= 0x21) && (ch <= 0x2F)) || ((ch >= 0x3A) && (ch <= 0x40)) ||
281  ((ch >= 0x5B) && (ch <= 0x60)) || ((ch >= 0x7B) && (ch <= 0x7E)));
282  }
283  constexpr bool isSpace(char ch) { return (((ch >= 0x09) && (ch <= 0x0D)) || (ch == 0x20)); }
284  constexpr bool isUpper(char ch) { return ((ch >= 0x41) && (ch <= 0x5A)); }
285  constexpr bool isWhitespace(char ch) { return isSpace(ch); }
286  constexpr bool isAlpha(char ch) { return (isLower(ch) || isUpper(ch)); }
287  constexpr bool isAlnum(char ch) { return (isAlpha(ch) || isDigit(ch)); }
288 
289  // same for UTF-8:
290  //bool is...(const char* utf8cp); // utf8cp = UTF-8 code point (e.g. "\xC3\xA4")
292 
295  bool isInteger(const std::string& str);
296  bool isUInteger(const std::string& str);
297  bool isHex(const std::string& str);
299 
300  size_t peekNewLine(const char* p);
301  size_t peekNewLine(const char* p, const char* end);
302 
303 
304 
306 }
307 
308 #endif // IG_OMW_STRING_H
omw::StringReplacePair
Definition: string.h:78
std::string
C++ standard string. See std::basic_string for detailed information.
Definition: linkToStd.dox:15
omw::hexstoi
int32_t hexstoi(const std::string &str)
Definition: string.cpp:693
omw::stoipair
std::pair< int32_t, int32_t > stoipair(const std::string &str, char sepChar=pairtos_defaultSepChar)
Definition: string.cpp:562
omw::peekNewLine
size_t peekNewLine(const char *p)
Definition: string.cpp:1024
omw::sepHexStr
omw::string sepHexStr(const std::string &str)
Definition: string.cpp:768
omw::string::replaceAll
omw::string & replaceAll(char search, char replace, size_type startPos=0, size_t *nReplacements=nullptr)
Definition: string.cpp:221
omw::hexstoi64
int64_t hexstoi64(const std::string &str)
Definition: string.cpp:705
omw::stob
bool stob(const std::string &boolStr)
Definition: string.cpp:540
omw::string
Definition: string.h:96
omw
Main namespace.
omw::hexstoui
uint32_t hexstoui(const std::string &str)
Definition: string.cpp:717
omw::hexstoui64
uint64_t hexstoui64(const std::string &str)
Definition: string.cpp:729
omw::string::replaceFirst
omw::string & replaceFirst(const std::string &search, const std::string &replace, size_type startPos=0)
Definition: string.cpp:201