libosmscout  1.1.1
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 
29 #include <osmscout/CoreFeatures.h>
30 
31 #include <osmscout/system/Assert.h>
32 #include <osmscout/util/Time.h>
33 #include <osmscout/util/Locale.h>
34 
36 #include <osmscout/OSMScoutTypes.h>
37 
38 namespace osmscout {
39 
57  extern OSMSCOUT_API bool StringToBool(const char* string, bool& value);
58 
67  extern OSMSCOUT_API const char* BoolToString(bool value);
68 
76  extern OSMSCOUT_API std::string NumberToString(long value, const Locale &locale);
77 
85  extern OSMSCOUT_API bool GetDigitValue(char digit,
86  size_t& result);
87 
88  template<typename N>
89  size_t NumberDigits(const N& number,
90  size_t base=10)
91  {
92  N value(number);
93  size_t res=0;
94 
95  if (std::numeric_limits<N>::is_signed) {
96  if (value<0) {
97  res++;
98  }
99  }
100 
101  while (value!=0) {
102  res++;
103  value=value/(N)base;
104  }
105 
106  return res;
107  }
108 
109  template<typename N>
110  bool StringToNumberSigned(const std::string& string,
111  N& number,
112  size_t base=10)
113  {
114  assert(base<=16);
115 
116  std::string::size_type pos=0;
117  bool minus=false;
118 
119  number=0;
120 
121  if (string.empty()) {
122  return false;
123  }
124 
125  /*
126  Special handling for the first symbol/digit (could be negative)
127  */
128  if (base==10 && string[0]=='-') {
129  minus=true;
130  pos=1;
131  }
132  else {
133  size_t digitValue;
134 
135  if (!GetDigitValue(string[pos],
136  digitValue)) {
137  return false;
138  }
139 
140  if (digitValue>=base) {
141  return false;
142  }
143 
144  /*
145  For signed values with base!=10 we assume a negative value
146  */
147  if (digitValue==base-1 &&
148  string.length()==NumberDigits(std::numeric_limits<N>::max())) {
149  minus=true;
150  number=(N)(base/2);
151  }
152  else {
153  number=(N)digitValue;
154  }
155 
156  pos=1;
157  }
158 
159  while (pos<string.length()) {
160  size_t digitValue;
161 
162  if (!GetDigitValue(string[pos],digitValue)) {
163  return false;
164  }
165 
166  if (digitValue>=base) {
167  return false;
168  }
169 
170  if (std::numeric_limits<N>::max()/(N)base-(N)digitValue<number) {
171  return false;
172  }
173 
174  number=(N)(number*base+digitValue);
175 
176  pos++;
177  }
178 
179  if (minus) {
180  number=-number;
181  }
182 
183  return true;
184  }
185 
186  template<typename N>
187  bool StringToNumberUnsigned(const std::string& string,
188  N& number,
189  size_t base=10)
190  {
191  assert(base<=16);
192 
193  std::string::size_type pos=0;
194 
195  number=0;
196 
197  if (string.empty()) {
198  return false;
199  }
200 
201  if (string[0]=='-') {
202  return false;
203  }
204 
205  /*
206  Special handling for the first symbol/digit (could be negative)
207  */
208  size_t digitValue;
209 
210  if (!GetDigitValue(string[pos],digitValue)) {
211  return false;
212  }
213 
214  if (digitValue>=base) {
215  return false;
216  }
217 
218  number=(N)digitValue;
219 
220  pos=1;
221 
222  while (pos<string.length()) {
223  size_t digitValue;
224 
225  if (!GetDigitValue(string[pos],
226  digitValue)) {
227  return false;
228  }
229 
230  if (digitValue>=base) {
231  return false;
232  }
233 
234  if (std::numeric_limits<N>::max()/(N)base-(N)digitValue<number) {
235  return false;
236  }
237 
238  number=(N)(number*base+digitValue);
239 
240  pos++;
241  }
242 
243  return true;
244  }
245 
246  template<bool is_signed, typename N>
248  {
249  };
250 
251  template<typename N>
252  struct StringToNumberTemplated<true, N>
253  {
254  static inline bool f(const std::string& string,
255  N& number,
256  size_t base=10)
257  {
258  return StringToNumberSigned<N>(string,number,base);
259  }
260  };
261 
262  template<typename N>
263  struct StringToNumberTemplated<false, N>
264  {
265  static inline bool f(const std::string& string,
266  N& number,
267  size_t base=10)
268  {
269  return StringToNumberUnsigned<N>(string,number,base);
270  }
271  };
272 
281  template<typename N>
282  inline bool StringToNumber(const std::string& string,
283  N& number,
284  size_t base=10)
285  {
287  ::f(string,number,base);
288  }
289 
293  extern OSMSCOUT_API bool StringToNumber(const char* string, double& value);
294 
298  extern OSMSCOUT_API bool StringToNumber(const std::string& string, double& value);
299 
305  extern OSMSCOUT_API size_t CountWords(const std::string& text);
306 
311  extern OSMSCOUT_API std::list<std::string> SplitStringAtSpace(const std::string& input);
312 
322  extern OSMSCOUT_API std::list<std::string> SplitString(const std::string& stringList,
323  const std::string& separator,
324  int maxSize=-1);
325 
326 
337  extern OSMSCOUT_API std::string GetFirstInStringList(const std::string& stringList,
338  const std::string& divider);
339 
344  extern OSMSCOUT_API void TokenizeString(const std::string& input,
345  std::list<std::string>& tokens);
346 
353  extern OSMSCOUT_API void SimplifyTokenList(std::list<std::string>& tokens);
354 
355  extern OSMSCOUT_API std::string GetTokensFromStart(const std::list<std::string>& tokens,
356  size_t count);
357 
358  extern OSMSCOUT_API std::string GetTokensFromEnd(const std::list<std::string>& tokens,
359  size_t count);
360 
369  extern OSMSCOUT_API void GroupStringListToStrings(std::list<std::string>::const_iterator token,
370  size_t listSize,
371  size_t parts,
372  std::list<std::list<std::string> >& lists);
373 
374 
379  extern OSMSCOUT_API std::string ByteSizeToString(FileOffset size);
380  extern OSMSCOUT_API std::string ByteSizeToString(double size);
381 
392  extern OSMSCOUT_API std::wstring LocaleStringToWString(const std::string& text);
393 
404  extern OSMSCOUT_API std::string WStringToLocaleString(const std::wstring& text);
405 
416  extern OSMSCOUT_API std::wstring UTF8StringToWString(const std::string& text);
417 
428  extern OSMSCOUT_API std::u32string UTF8StringToU32String(const std::string& text);
429 
440  extern OSMSCOUT_API std::string WStringToUTF8String(const std::wstring& text);
441 
453  extern OSMSCOUT_API std::string LocaleStringToUTF8String(const std::string& text);
454 
466  extern OSMSCOUT_API std::string UTF8StringToLocaleString(const std::string& text);
467 
478  extern OSMSCOUT_API std::string UTF8StringToUpper(const std::string& text);
479 
490  extern OSMSCOUT_API std::string UTF8StringToLower(const std::string& text);
491 
506  extern OSMSCOUT_API std::string UTF8NormForLookup(const std::string& text);
507 
519  extern OSMSCOUT_API std::string UTF8Transliterate(const std::string& text);
520 
531  extern OSMSCOUT_API bool ParseISO8601TimeString(const std::string &timeStr, Timestamp &timestamp);
532 
540  extern OSMSCOUT_API std::string TimestampToISO8601TimeString(const Timestamp &timestamp);
541 
542  extern OSMSCOUT_API std::string DurationString(const Duration &duration);
543 }
544 
545 #endif
OSMSCOUT_API std::string UTF8NormForLookup(const std::string &text)
std::chrono::system_clock::time_point Timestamp
Definition: Time.h:27
OSMSCOUT_API bool GetDigitValue(char digit, size_t &result)
OSMSCOUT_API std::wstring LocaleStringToWString(const std::string &text)
OSMSCOUT_API std::string WStringToLocaleString(const std::wstring &text)
bool StringToNumber(const std::string &string, N &number, size_t base=10)
Definition: String.h:282
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::list< std::string > SplitString(const std::string &stringList, const std::string &separator, int maxSize=-1)
OSMSCOUT_API std::string ByteSizeToString(FileOffset size)
static bool f(const std::string &string, N &number, size_t base=10)
Definition: String.h:254
OSMSCOUT_API std::string GetTokensFromEnd(const std::list< std::string > &tokens, size_t count)
OSMSCOUT_API bool ParseISO8601TimeString(const std::string &timeStr, Timestamp &timestamp)
OSMSCOUT_API std::list< std::string > SplitStringAtSpace(const std::string &input)
OSMSCOUT_API void SimplifyTokenList(std::list< std::string > &tokens)
OSMSCOUT_API std::string GetFirstInStringList(const std::string &stringList, const std::string &divider)
OSMSCOUT_API std::string UTF8Transliterate(const std::string &text)
OSMSCOUT_API std::string DurationString(const Duration &duration)
Definition: Area.h:38
bool StringToNumberUnsigned(const std::string &string, N &number, size_t base=10)
Definition: String.h:187
OSMSCOUT_API bool StringToBool(const char *string, bool &value)
OSMSCOUT_API std::string UTF8StringToUpper(const std::string &text)
#define OSMSCOUT_API
Definition: CoreImportExport.h:45
OSMSCOUT_API std::string LocaleStringToUTF8String(const std::string &text)
OSMSCOUT_API std::string TimestampToISO8601TimeString(const Timestamp &timestamp)
OSMSCOUT_API std::string WStringToUTF8String(const std::wstring &text)
bool StringToNumberSigned(const std::string &string, N &number, size_t base=10)
Definition: String.h:110
static bool f(const std::string &string, N &number, size_t base=10)
Definition: String.h:265
OSMSCOUT_API std::string GetTokensFromStart(const std::list< std::string > &tokens, size_t count)
OSMSCOUT_API std::string UTF8StringToLower(const std::string &text)
OSMSCOUT_API void TokenizeString(const std::string &input, std::list< std::string > &tokens)
OSMSCOUT_API size_t CountWords(const std::string &text)
size_t NumberDigits(const N &number, size_t base=10)
Definition: String.h:89
OSMSCOUT_API std::string UTF8StringToLocaleString(const std::string &text)
uint64_t FileOffset
Definition: OSMScoutTypes.h:47
OSMSCOUT_API const char * BoolToString(bool value)
Timestamp::duration Duration
Definition: Time.h:29
Definition: String.h:247
OSMSCOUT_API std::u32string UTF8StringToU32String(const std::string &text)
OSMSCOUT_API std::wstring UTF8StringToWString(const std::string &text)
OSMSCOUT_API std::string NumberToString(long value, const Locale &locale)