libosmscout 1.1.1
Loading...
Searching...
No Matches
String.h
Go to the documentation of this file.
1#ifndef OSMSCOUT_UTIL_STRING_H
2#define OSMSCOUT_UTIL_STRING_H
3
4/*
5 This source is part of the libosmscout library
6 Copyright (C) 2009 Tim Teulings
7
8 This library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Lesser General Public
10 License as published by the Free Software Foundation; either
11 version 2.1 of the License, or (at your option) any later version.
12
13 This library is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public
19 License along with this library; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21*/
22
23#include <limits>
24#include <list>
25#include <memory>
26#include <string>
27#include <chrono>
28#include <optional>
29#include <utility>
30
31#include <osmscout/lib/CoreFeatures.h>
33
35
36#include <osmscout/util/Time.h>
38
40
41namespace osmscout {
42
48
60 extern OSMSCOUT_API bool StringToBool(const char* string, bool& value);
61
70 extern OSMSCOUT_API const char* BoolToString(bool value);
71
79 extern OSMSCOUT_API std::string NumberToString(long value, const Locale &locale);
80
89 extern OSMSCOUT_API std::string FloatToString(double value, const Locale &locale, uint32_t precision = 3);
90
98 extern OSMSCOUT_API bool GetDigitValue(char digit,
99 size_t& result);
100
101 template<typename N>
102 size_t NumberDigits(const N& number,
103 size_t base=10)
104 {
105 N value(number);
106 size_t res=0;
107
108 if (std::numeric_limits<N>::is_signed) {
109 if (value<0) {
110 res++;
111 }
112 }
113
114 while (value!=0) {
115 res++;
116 value=value/(N)base;
117 }
118
119 return res;
120 }
121
122 template<typename N>
123 bool StringToNumberSigned(const std::string& string,
124 N& number,
125 size_t base=10)
126 {
127 assert(base<=16);
128
129 std::string::size_type pos=0;
130 bool minus=false;
131
132 number=0;
133
134 if (string.empty()) {
135 return false;
136 }
137
138 /*
139 Special handling for the first symbol/digit (could be negative)
140 */
141 if (base==10 && string[0]=='-') {
142 minus=true;
143 pos=1;
144 }
145 else {
146 size_t digitValue;
147
148 if (!GetDigitValue(string[pos],
149 digitValue)) {
150 return false;
151 }
152
153 if (digitValue>=base) {
154 return false;
155 }
156
157 /*
158 For signed values with base!=10 we assume a negative value
159 */
160 if (digitValue==base-1 &&
161 string.length()==NumberDigits(std::numeric_limits<N>::max())) {
162 minus=true;
163 number=(N)(base/2);
164 }
165 else {
166 number=(N)digitValue;
167 }
168
169 pos=1;
170 }
171
172 while (pos<string.length()) {
173 size_t digitValue;
174
175 if (!GetDigitValue(string[pos],digitValue)) {
176 return false;
177 }
178
179 if (digitValue>=base) {
180 return false;
181 }
182
183 if (std::numeric_limits<N>::max()/(N)base-(N)digitValue<number) {
184 return false;
185 }
186
187 number=(N)(number*base+digitValue);
188
189 pos++;
190 }
191
192 if (minus) {
193 number=-number;
194 }
195
196 return true;
197 }
198
199 template<typename N>
200 bool StringToNumberUnsigned(const std::string& string,
201 N& number,
202 size_t base=10)
203 {
204 assert(base<=16);
205
206 std::string::size_type pos=0;
207
208 number=0;
209
210 if (string.empty()) {
211 return false;
212 }
213
214 if (string[0]=='-') {
215 return false;
216 }
217
218 /*
219 Special handling for the first symbol/digit (could be negative)
220 */
221 size_t digitValue;
222
223 if (!GetDigitValue(string[pos],digitValue)) {
224 return false;
225 }
226
227 if (digitValue>=base) {
228 return false;
229 }
230
231 number=(N)digitValue;
232
233 pos=1;
234
235 while (pos<string.length()) {
236 size_t digitValue;
237
238 if (!GetDigitValue(string[pos],
239 digitValue)) {
240 return false;
241 }
242
243 if (digitValue>=base) {
244 return false;
245 }
246
247 if (std::numeric_limits<N>::max()/(N)base-(N)digitValue<number) {
248 return false;
249 }
250
251 number=(N)(number*base+digitValue);
252
253 pos++;
254 }
255
256 return true;
257 }
258
259 template<bool is_signed, typename N>
261 {
262 };
263
264 template<typename N>
266 {
267 static inline bool f(const std::string& string,
268 N& number,
269 size_t base=10)
270 {
271 return StringToNumberSigned<N>(string,number,base);
272 }
273 };
274
275 template<typename N>
276 struct StringToNumberTemplated<false, N>
277 {
278 static inline bool f(const std::string& string,
279 N& number,
280 size_t base=10)
281 {
282 return StringToNumberUnsigned<N>(string,number,base);
283 }
284 };
285
294 template<typename N>
295 inline bool StringToNumber(const std::string& string,
296 N& number,
297 size_t base=10)
298 {
300 ::f(string,number,base);
301 }
302
306 extern OSMSCOUT_API bool StringToNumber(const char* string, double& value);
307
311 extern OSMSCOUT_API bool StringToNumber(const std::string& string, double& value);
312
317
318 extern OSMSCOUT_API size_t CountWords(const std::string& text);
319
324 extern OSMSCOUT_API std::list<std::string> SplitStringAtSpace(const std::string& input);
325
335 extern OSMSCOUT_API std::list<std::string> SplitString(const std::string& stringList,
336 const std::string& separator,
337 int maxSize=-1);
338
349 extern OSMSCOUT_API std::string ReplaceString(const std::string &in,
350 const std::string &search,
351 const std::string &replacement);
352
362 extern OSMSCOUT_API std::optional<std::pair<std::string,std::string>> SplitStringToPair(const std::string& str,
363 const std::string& separator);
364
375 extern OSMSCOUT_API std::string GetFirstInStringList(const std::string& stringList,
376 const std::string& divider);
377
382 extern OSMSCOUT_API void TokenizeString(const std::string& input,
383 std::list<std::string>& tokens);
384
391 extern OSMSCOUT_API void SimplifyTokenList(std::list<std::string>& tokens);
392
393 extern OSMSCOUT_API std::string GetTokensFromStart(const std::list<std::string>& tokens,
394 size_t count);
395
396 extern OSMSCOUT_API std::string GetTokensFromEnd(const std::list<std::string>& tokens,
397 size_t count);
398
407 extern OSMSCOUT_API void GroupStringListToStrings(std::list<std::string>::const_iterator token,
408 size_t listSize,
409 size_t parts,
410 std::list<std::list<std::string> >& lists);
411
412
421 extern OSMSCOUT_API std::string ByteSizeToString(FileOffset size, const Locale &locale = Locale::ByEnvironmentSafe());
422 extern OSMSCOUT_API std::string ByteSizeToString(double size, const Locale &locale = Locale::ByEnvironmentSafe());
423
434 extern OSMSCOUT_API std::wstring LocaleStringToWString(const std::string& text);
435
446 extern OSMSCOUT_API std::string WStringToLocaleString(const std::wstring& text);
447
458 extern OSMSCOUT_API std::wstring UTF8StringToWString(const std::string& text);
459
470 extern OSMSCOUT_API std::u32string UTF8StringToU32String(const std::string& text);
471
482 extern OSMSCOUT_API std::string WStringToUTF8String(const std::wstring& text);
483
495 extern OSMSCOUT_API std::string LocaleStringToUTF8String(const std::string& text);
496
508 extern OSMSCOUT_API std::string UTF8StringToLocaleString(const std::string& text);
509
520 extern OSMSCOUT_API std::string UTF8StringToUpper(const std::string& text);
521
532 extern OSMSCOUT_API std::string UTF8StringToLower(const std::string& text);
533
548 extern OSMSCOUT_API std::string UTF8NormForLookup(const std::string& text);
549
561 extern OSMSCOUT_API std::string UTF8Transliterate(const std::string& text);
562
573 extern OSMSCOUT_API bool ParseISO8601TimeString(const std::string &timeStr, Timestamp &timestamp);
574
582 extern OSMSCOUT_API std::string TimestampToISO8601TimeString(const Timestamp &timestamp);
583
584 extern OSMSCOUT_API std::string DurationString(const Duration &duration);
585
589 extern OSMSCOUT_API std::string Trim(const std::string &str, char trimmedChar=' ');
590}
591
592#endif
#define OSMSCOUT_API
Definition CoreImportExport.h:45
OSMSCOUT_API std::list< std::string > SplitString(const std::string &stringList, const std::string &separator, int maxSize=-1)
OSMSCOUT_API void GroupStringListToStrings(std::list< std::string >::const_iterator token, size_t listSize, size_t parts, std::list< std::list< std::string > > &lists)
OSMSCOUT_API std::wstring LocaleStringToWString(const std::string &text)
OSMSCOUT_API std::string UTF8StringToLocaleString(const std::string &text)
OSMSCOUT_API std::string WStringToUTF8String(const std::wstring &text)
OSMSCOUT_API std::string LocaleStringToUTF8String(const std::string &text)
OSMSCOUT_API std::string ReplaceString(const std::string &in, const std::string &search, const std::string &replacement)
OSMSCOUT_API std::string ByteSizeToString(FileOffset size, const Locale &locale=Locale::ByEnvironmentSafe())
OSMSCOUT_API size_t CountWords(const std::string &text)
OSMSCOUT_API std::string WStringToLocaleString(const std::wstring &text)
OSMSCOUT_API std::u32string UTF8StringToU32String(const std::string &text)
uint64_t FileOffset
Definition OSMScoutTypes.h:46
OSMSCOUT_API bool StringToBool(const char *string, bool &value)
OSMSCOUT_API bool GetDigitValue(char digit, size_t &result)
OSMSCOUT_API void TokenizeString(const std::string &input, std::list< std::string > &tokens)
OSMSCOUT_API std::string GetFirstInStringList(const std::string &stringList, const std::string &divider)
OSMSCOUT_API std::list< std::string > SplitStringAtSpace(const std::string &input)
OSMSCOUT_API void SimplifyTokenList(std::list< std::string > &tokens)
OSMSCOUT_API std::wstring UTF8StringToWString(const std::string &text)
bool StringToNumber(const std::string &string, N &number, size_t base=10)
Definition String.h:295
Definition Area.h:39
OSMSCOUT_API std::string Trim(const std::string &str, char trimmedChar=' ')
OSMSCOUT_API std::string UTF8StringToLower(const std::string &text)
OSMSCOUT_API const char * BoolToString(bool value)
OSMSCOUT_API bool ParseISO8601TimeString(const std::string &timeStr, Timestamp &timestamp)
std::chrono::system_clock::time_point Timestamp
Definition Time.h:27
OSMSCOUT_API std::string UTF8Transliterate(const std::string &text)
OSMSCOUT_API std::string UTF8NormForLookup(const std::string &text)
OSMSCOUT_API std::string NumberToString(long value, const Locale &locale)
bool StringToNumberUnsigned(const std::string &string, N &number, size_t base=10)
Definition String.h:200
OSMSCOUT_API std::string FloatToString(double value, const Locale &locale, uint32_t precision=3)
OSMSCOUT_API std::string GetTokensFromEnd(const std::list< std::string > &tokens, size_t count)
size_t NumberDigits(const N &number, size_t base=10)
Definition String.h:102
OSMSCOUT_API std::string GetTokensFromStart(const std::list< std::string > &tokens, size_t count)
OSMSCOUT_API std::optional< std::pair< std::string, std::string > > SplitStringToPair(const std::string &str, const std::string &separator)
OSMSCOUT_API std::string UTF8StringToUpper(const std::string &text)
@ base
way center
Definition Styles.h:45
OSMSCOUT_API std::string DurationString(const Duration &duration)
OSMSCOUT_API std::string TimestampToISO8601TimeString(const Timestamp &timestamp)
Timestamp::duration Duration
Definition Time.h:29
bool StringToNumberSigned(const std::string &string, N &number, size_t base=10)
Definition String.h:123
static bool f(const std::string &string, N &number, size_t base=10)
Definition String.h:278
static bool f(const std::string &string, N &number, size_t base=10)
Definition String.h:267
Definition String.h:261