omw  0.2.0
string.h
1 /*
2 author Oliver Blaser
3 date 25.01.2022
4 copyright MIT - Copyright (c) 2022 Oliver Blaser
5 */
6 
7 #ifndef IG_OMW_STRING_H
8 #define IG_OMW_STRING_H
9 
10 #include <cstddef>
11 #include <cstdint>
12 #include <string>
13 #include <utility>
14 #include <vector>
15 
16 #include "../omw/defs.h"
17 #include "../omw/int.h"
18 #include "../omw/vector.h"
19 
20 namespace omw
21 {
26  const char* const UTF8CP_00C4 = "\xC3\x84";
29  const char* const UTF8CP_00D6 = "\xC3\x96";
30  const char* const UTF8CP_00DC = "\xC3\x9C";
31  const char* const UTF8CP_00E4 = "\xC3\xA4";
32  const char* const UTF8CP_00F6 = "\xC3\xB6";
33  const char* const UTF8CP_00FC = "\xC3\xBC";
34  const char* const UTF8CP_2580 = "\xE2\x96\x80";
35  const char* const UTF8CP_2584 = "\xE2\x96\x84";
36  const char* const UTF8CP_2588 = "\xE2\x96\x88";
38 
41  const char* const UTF8CP_Auml = omw::UTF8CP_00C4;
42  const char* const UTF8CP_Ouml = omw::UTF8CP_00D6;
43  const char* const UTF8CP_Uuml = omw::UTF8CP_00DC;
44  const char* const UTF8CP_auml = omw::UTF8CP_00E4;
45  const char* const UTF8CP_ouml = omw::UTF8CP_00F6;
46  const char* const UTF8CP_uuml = omw::UTF8CP_00FC;
48 
49  constexpr char pairtos_defaultDelimiter = ';';
50  const char* const hexStrDigitsUpper = "0123456789ABCDEF";
51  const char* const hexStrDigitsLower = "0123456789abcdef";
52  const char* const hexStrDigits = hexStrDigitsUpper;
53  constexpr char toHexStr_defaultDelimiter = 0x20;
54 
55 
56 
57  using stdStringVector_t = std::vector<std::string>;
58  constexpr omw::stdStringVector_t::size_type stdStringVector_npos = static_cast<omw::stdStringVector_t::size_type>(-1);
59 
60  class string;
61  using stringVector_t = std::vector<omw::string>;
62  constexpr omw::stringVector_t::size_type stringVector_npos = static_cast<omw::stringVector_t::size_type>(-1);
63 
64 
65 
67  {
68  public:
70  StringReplacePair(const std::string& searchElement, const std::string& replaceElement);
71  StringReplacePair(const char searchElement, const std::string& replaceElement);
72  StringReplacePair(const std::string& searchElement, const char replaceElement);
73  StringReplacePair(const char searchElement, const char replaceElement);
74  virtual ~StringReplacePair() {}
75 
76  const std::string& search() const;
77  const std::string& replace() const;
78 
79  private:
80  std::string searchElem;
81  std::string replaceElem;
82  };
83 
84  class string : public std::string
85  {
86  public:
87  string();
88  string(omw::string::size_type count, char c);
89  string(const char* str);
90  string(const char* str, omw::string::size_type count);
91  string(const std::string& other);
92  string(const std::string& other, std::string::size_type pos, std::string::size_type count = std::string::npos);
93  string(const char* first, const char* last);
94  ~string() {}
95 
96  std::string& std();
97  const std::string& std() const;
98 
99 #ifndef OMWi_DOXYGEN_PREDEFINE
100 #if (OMW_CPPSTD < OMW_CPPSTD_23)
101  bool contains(char ch) const { return (this->find(ch) != omw::string::npos); }
102  bool contains(const char* str) const { return (this->find(str) != omw::string::npos); }
103 #if (OMW_CPPSTD < OMW_CPPSTD_17)
104  bool contains(const std::string& str) const { return (this->find(str) != omw::string::npos); }
105 #else // < C++17
106  bool contains(std::string_view sv) const { return (this->find(sv) != omw::string::npos); }
107 #endif // < C++17
108 #endif // < C++23
109 #else // OMWi_DOXYGEN_PREDEFINE
110  bool contains(char ch) const;
111  bool contains(const char* str) const;
112  bool contains(const std::string& str) const;
113  bool contains(std::string_view sv) const;
114 #endif // OMWi_DOXYGEN_PREDEFINE
115 
116  omw::string& replaceFirst(const std::string& search, const std::string& replace, size_type startPos = 0);
117  omw::string& replaceFirst(const omw::StringReplacePair& pair, size_type startPos = 0);
118 
119  omw::string& replaceAll(char search, char replace, size_type startPos = 0, size_t* nReplacements = nullptr);
120  omw::string& replaceAll(char search, const std::string& replace, size_type startPos = 0, size_t* nReplacements = nullptr);
121  omw::string& replaceAll(const std::string& search, char replace, size_type startPos = 0, size_t* nReplacements = nullptr);
122  omw::string& replaceAll(const std::string& search, const std::string& replace, size_type startPos = 0, size_t* nReplacements = nullptr);
123  omw::string& replaceAll(const omw::StringReplacePair& pair, size_type startPos = 0, size_t* nReplacements = nullptr);
124  omw::string& replaceAll(const std::vector<omw::StringReplacePair>& pairs, size_type startPos = 0, size_t* nReplacementsTotal = nullptr, std::vector<size_t>* nReplacements = nullptr);
125  omw::string& replaceAll(const omw::StringReplacePair* pairs, size_t count, size_type startPos = 0, size_t* nReplacementsTotal = nullptr, std::vector<size_t>* nReplacements = nullptr);
126 
127  omw::stringVector_t split(char delimiter, omw::stringVector_t::size_type maxTokenCount = omw::stringVector_npos) const;
128  //omw::stringVector_t split(const char* delimiter, omw::stringVector_t::size_type maxTokenCount = omw::stringVector_npos) const;
129  //omw::stringVector_t split(const std::string& delimiter, omw::stringVector_t::size_type maxTokenCount = omw::stringVector_npos) const;
130  omw::stringVector_t splitLen(omw::string::size_type tokenLength, omw::stringVector_t::size_type maxTokenCount = omw::stringVector_npos) const;
131 
135  //omw::string& lower(); // reserved name
136  omw::string& lower_ascii();
137  omw::string& lower_asciiExt();
138  //omw::string& upper(); // reserved name
139  omw::string& upper_ascii();
140  omw::string& upper_asciiExt();
141  //omw::string toLower() const; // reserved name
142  omw::string toLower_ascii() const;
143  omw::string toLower_asciiExt() const;
144  //omw::string toUpper() const; // reserved name
145  omw::string toUpper_ascii() const;
146  omw::string toUpper_asciiExt() const;
148  };
149 
150 
151 
154  omw::string to_string(int32_t value);
155  omw::string to_string(uint32_t value);
156  omw::string to_string(int64_t value);
157  omw::string to_string(uint64_t value);
158  omw::string to_string(float value);
159  omw::string to_string(double value);
160  omw::string to_string(long double value);
161 
162  omw::string to_string(bool value, bool asText = true);
163  omw::string to_string(const omw::int128_t& value);
164  omw::string to_string(const omw::uint128_t& value);
165  omw::string to_string(const std::pair<int32_t, int32_t>& value, char delimiter = pairtos_defaultDelimiter);
166  omw::string to_string(const std::pair<uint32_t, uint32_t>& value, char delimiter = pairtos_defaultDelimiter);
167  omw::string to_string(const std::pair<int64_t, int64_t>& value, char delimiter = pairtos_defaultDelimiter);
168  omw::string to_string(const std::pair<uint64_t, uint64_t>& value, char delimiter = pairtos_defaultDelimiter);
169  omw::string to_string(const std::pair<float, float>& value, char delimiter = pairtos_defaultDelimiter);
170  omw::string to_string(const std::pair<double, double>& value, char delimiter = pairtos_defaultDelimiter);
171  omw::string to_string(const std::pair<long double, long double>& value, char delimiter = pairtos_defaultDelimiter);
173 
174 
177  bool stob(const std::string& boolStr);
178 
179  std::pair<int32_t, int32_t> stoipair(const std::string& str, char delimiter = pairtos_defaultDelimiter);
180  //std::pair<uint32_t, uint32_t> stouipair(const std::string& str, char delimiter = pairtos_defaultDelimiter);
181  //std::pair<int64_t, int64_t> stoi64pair(const std::string& str, char delimiter = pairtos_defaultDelimiter);
182  //std::pair<uint64_t, uint64_t> stoui64pair(const std::string& str, char delimiter = pairtos_defaultDelimiter);
183  //std::pair<float, float> stofpair(const std::string& str, char delimiter = pairtos_defaultDelimiter);
184  //std::pair<double, double> stodpair(const std::string& str, char delimiter = pairtos_defaultDelimiter);
185  //std::pair<long double, long double> stoldpair(const std::string& str, char delimiter = pairtos_defaultDelimiter);
186 
187  //omw::int128_t stoi128(const std::string& str);
188  //omw::uint128_t stoui128(const std::string& str);
190 
191 
192 
195  omw::string toHexStr(int8_t value);
196  omw::string toHexStr(uint8_t value);
197  omw::string toHexStr(int16_t value);
198  omw::string toHexStr(uint16_t value);
199  omw::string toHexStr(int32_t value);
200  omw::string toHexStr(uint32_t value);
201  omw::string toHexStr(int64_t value);
202  omw::string toHexStr(uint64_t value);
203  omw::string toHexStr(const omw::Base_Int128& value);
204  omw::string toHexStr(int16_t value, char delimiter);
205  omw::string toHexStr(uint16_t value, char delimiter);
206  omw::string toHexStr(int32_t value, char delimiter);
207  omw::string toHexStr(uint32_t value, char delimiter);
208  omw::string toHexStr(int64_t value, char delimiter);
209  omw::string toHexStr(uint64_t value, char delimiter);
210  omw::string toHexStr(const omw::Base_Int128& value, char delimiter);
211  omw::string toHexStr(const std::vector<char>& data, char delimiter = toHexStr_defaultDelimiter);
212  omw::string toHexStr(const std::vector<uint8_t>& data, char delimiter = toHexStr_defaultDelimiter);
213  omw::string toHexStr(const char* data, size_t count, char delimiter = toHexStr_defaultDelimiter);
214  omw::string toHexStr(const uint8_t* data, size_t count, char delimiter = toHexStr_defaultDelimiter);
215 
216  int32_t hexstoi(const std::string& str);
217  int64_t hexstoi64(const std::string& str);
219  uint32_t hexstoui(const std::string& str);
220  uint64_t hexstoui64(const std::string& str);
222  std::vector<uint8_t> hexstovector(const std::string& str, char delimiter = toHexStr_defaultDelimiter);
223 
224  omw::string sepHexStr(const std::string& str);
225  omw::string sepHexStr(const std::string& str, char delimiter);
226  omw::string sepHexStr(const std::string& str, char rmChar, char delimiter);
227  omw::string sepHexStr(const std::string& str, const char* rmChars, size_t count, char delimiter = toHexStr_defaultDelimiter);
228  omw::string sepHexStr(const std::string& str, const std::vector<char>& rmChars, char delimiter = toHexStr_defaultDelimiter);
229  //omw::string sepHexStr(const std::string& str, const char* rmString, char delimiter = toHexStr_defaultDelimiter);
230  //omw::string sepHexStr(const std::string& str, const std::string& rmString, char delimiter = toHexStr_defaultDelimiter);
231  //omw::string sepHexStr(const std::string& str, const std::string* rmStrings, size_t count, char delimiter = toHexStr_defaultDelimiter);
232  //omw::string sepHexStr(const std::string& str, const omw::string* rmStrings, size_t count, char delimiter = toHexStr_defaultDelimiter);
233  //omw::string sepHexStr(const std::string& str, const omw::stdStringVector_t& rmStrings, char delimiter = toHexStr_defaultDelimiter);
234  //omw::string sepHexStr(const std::string& str, const omw::stringVector_t& rmStrings, char delimiter = toHexStr_defaultDelimiter);
235 
236  omw::string rmNonHex(const std::string& str);
237  void rmNonHex(char* str);
238  void rmNonHex(std::string& str);
240 
241 
242 
243  // TODO check overloads
244  //omw::string join(const std::string* strings, size_t count, char delimiter = '\0');
245  //omw::string join(const std::string* strings, size_t count, const char* delimiter);
246  //omw::string join(const std::string* strings, size_t count, const std::string& delimiter);
247  //omw::string join(const omw::stdStringVector_t& strings);
248  //omw::string join(const omw::stdStringVector_t& strings, char delimiter);
249  //omw::string join(const omw::stdStringVector_t& strings, const char* delimiter);
250  //omw::string join(const omw::stdStringVector_t& strings, const std::string& delimiter);
251  //omw::string join(const omw::stringVector_t& strings);
252  omw::string join(const omw::stringVector_t& strings);
253  omw::string join(const omw::stringVector_t& strings, char delimiter);
254  //omw::string join(const omw::stringVector_t& strings, const char* delimiter);
255  //omw::string join(const omw::stringVector_t& strings, const std::string& delimiter);
256 
257 
258 
261  omw::stringVector_t stringVector(const char* const* strings, size_t count);
262  omw::stringVector_t stringVector(const std::string* strings, size_t count);
263  omw::stringVector_t stringVector(const omw::string* strings, size_t count);
264  omw::stringVector_t stringVector(const omw::stdStringVector_t& strvec);
265 
266  omw::stdStringVector_t stdStringVector(const char* const* strings, size_t count);
267  omw::stdStringVector_t stdStringVector(const std::string* strings, size_t count);
268  omw::stdStringVector_t stdStringVector(const omw::string* strings, size_t count);
269  omw::stdStringVector_t stdStringVector(const omw::stringVector_t& strvec);
271 
272 
273 
274  //bool isValidUTF8(const std::string& str);
275 
276 
277 
280  constexpr bool isBlank(char ch) { return ((ch == 0x09) || (ch == 0x20)); }
281  constexpr bool isCntrl(char ch) { return (((ch >= 0x00) && (ch <= 0x1F)) || (ch == 0x7F)); }
282  constexpr bool isDigit(char ch) { return ((ch >= 0x30) && (ch <= 0x39)); }
283  constexpr bool isGraph(char ch) { return ((ch >= 0x21) && (ch <= 0x7E)); }
284  constexpr bool isHex(char ch)
285  {
286  return (((ch >= 0x30) && (ch <= 0x39)) || ((ch >= 0x41) && (ch <= 0x46)) ||
287  ((ch >= 0x61) && (ch <= 0x66)));
288  }
289  constexpr bool isLower(char ch) { return ((ch >= 0x61) && (ch <= 0x7A)); }
290  constexpr bool isNull(char ch) { return (ch == 0x00); }
291  constexpr bool isPrint(char ch) { return ((ch >= 0x20) && (ch <= 0x7E)); }
292  constexpr bool isPunct(char ch)
293  {
294  return (((ch >= 0x21) && (ch <= 0x2F)) || ((ch >= 0x3A) && (ch <= 0x40)) ||
295  ((ch >= 0x5B) && (ch <= 0x60)) || ((ch >= 0x7B) && (ch <= 0x7E)));
296  }
297  constexpr bool isSpace(char ch) { return (((ch >= 0x09) && (ch <= 0x0D)) || (ch == 0x20)); }
298  constexpr bool isUpper(char ch) { return ((ch >= 0x41) && (ch <= 0x5A)); }
299  constexpr bool isWhitespace(char ch) { return isSpace(ch); }
300  constexpr bool isAlpha(char ch) { return (isLower(ch) || isUpper(ch)); }
301  constexpr bool isAlnum(char ch) { return (isAlpha(ch) || isDigit(ch)); }
302 
303  // same for UTF-8:
304  //bool is...(const char* utf8); // utf8 = UTF-8 byte string (e.g. "\xC3\xA4")
306 
309  bool isInteger(const std::string& str);
310  bool isUInteger(const std::string& str);
311  bool isHex(const std::string& str);
313 
314  size_t peekNewLine(const char* p);
315  size_t peekNewLine(const char* p, const char* end);
316 
317  omw::string readString(const uint8_t* data, size_t count);
318  omw::string readString(const std::vector<uint8_t>& data, std::vector<uint8_t>::size_type pos, std::vector<uint8_t>::size_type count);
319  void writeString(uint8_t* buffer, const uint8_t* end, const std::string& str);
320  void writeString(std::vector<uint8_t>& buffer, std::vector<uint8_t>::size_type pos, const std::string& str);
321 
322 
323 
325 }
326 
327 #endif // IG_OMW_STRING_H
omw::StringReplacePair
Definition: string.h:67
std::string
C++ standard string. See std::basic_string.
Definition: linkToStd.dox:19
omw::hexstoi
int32_t hexstoi(const std::string &str)
Definition: string.cpp:818
omw::string::std
std::string & std()
Definition: string.cpp:239
omw::string::contains
bool contains(std::string_view sv) const
omw::readString
omw::string readString(const uint8_t *data, size_t count)
Definition: string.cpp:1276
omw::string::contains
bool contains(const std::string &str) const
omw::SignedInt128
Definition: int.h:100
omw::string::contains
bool contains(const char *str) const
omw::peekNewLine
size_t peekNewLine(const char *p)
Definition: string.cpp:1217
omw::UnsignedInt128
Definition: int.h:127
omw::sepHexStr
omw::string sepHexStr(const std::string &str)
Definition: string.cpp:922
omw::writeString
void writeString(uint8_t *buffer, const uint8_t *end, const std::string &str)
Definition: string.cpp:1308
omw::hexstoi128
omw::int128_t hexstoi128(const std::string &str)
Definition: string.cpp:842
omw::hexstoui128
omw::uint128_t hexstoui128(const std::string &str)
Definition: string.cpp:878
omw::stoipair
std::pair< int32_t, int32_t > stoipair(const std::string &str, char delimiter=pairtos_defaultDelimiter)
Definition: string.cpp:670
omw::string::replaceAll
omw::string & replaceAll(char search, char replace, size_type startPos=0, size_t *nReplacements=nullptr)
Definition: string.cpp:303
omw::hexstoi64
int64_t hexstoi64(const std::string &str)
Definition: string.cpp:830
omw::Base_Int128
Definition: int.h:46
omw::stob
bool stob(const std::string &boolStr)
Definition: string.cpp:648
omw::isUInteger
bool isUInteger(const std::string &str)
Definition: string.cpp:1169
omw::string
Definition: string.h:85
omw
Main namespace.
omw::hexstoui
uint32_t hexstoui(const std::string &str)
Definition: string.cpp:854
omw::isInteger
bool isInteger(const std::string &str)
Definition: string.cpp:1152
omw::hexstoui64
uint64_t hexstoui64(const std::string &str)
Definition: string.cpp:866
omw::string::contains
bool contains(char ch) const
omw::string::replaceFirst
omw::string & replaceFirst(const std::string &search, const std::string &replace, size_type startPos=0)
Definition: string.cpp:283