MyGUI  3.0.1
MyGUI_Utility.h
Go to the documentation of this file.
1 
7 /*
8  This file is part of MyGUI.
9 
10  MyGUI is free software: you can redistribute it and/or modify
11  it under the terms of the GNU Lesser General Public License as published by
12  the Free Software Foundation, either version 3 of the License, or
13  (at your option) any later version.
14 
15  MyGUI is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  GNU Lesser General Public License for more details.
19 
20  You should have received a copy of the GNU Lesser General Public License
21  along with MyGUI. If not, see <http://www.gnu.org/licenses/>.
22 */
23 #ifndef __MYGUI_UTILITY_H__
24 #define __MYGUI_UTILITY_H__
25 
26 #include "MyGUI_Prerequest.h"
27 #include <vector>
28 #include <sstream>
29 
30 namespace MyGUI
31 {
32  namespace utility
33  {
34 
35  inline void trim(std::string& _str, bool _left = true, bool _right = true)
36  {
37  if (_right) _str.erase(_str.find_last_not_of(" \t\r")+1);
38  if (_left) _str.erase(0, _str.find_first_not_of(" \t\r"));
39  }
40 
41  // конвертирование в строку
42  template<typename T >
43  inline std::string toString (T p)
44  {
45  std::ostringstream stream;
46  stream << p;
47  return stream.str();
48  }
49 
50  inline const std::string& toString (const std::string& _value)
51  {
52  return _value;
53  }
54 
55  template<typename T1, typename T2 >
56  inline std::string toString (T1 p1, T2 p2)
57  {
58  std::ostringstream stream;
59  stream << p1 << p2;
60  return stream.str();
61  }
62 
63  template<typename T1, typename T2, typename T3 >
64  inline std::string toString (T1 p1, T2 p2, T3 p3)
65  {
66  std::ostringstream stream;
67  stream << p1 << p2 << p3;
68  return stream.str();
69  }
70 
71  template<typename T1, typename T2, typename T3, typename T4 >
72  inline std::string toString (T1 p1, T2 p2, T3 p3, T4 p4)
73  {
74  std::ostringstream stream;
75  stream << p1 << p2 << p3 << p4;
76  return stream.str();
77  }
78 
79  template<typename T1, typename T2, typename T3, typename T4, typename T5 >
80  inline std::string toString (T1 p1, T2 p2, T3 p3, T4 p4, T5 p5)
81  {
82  std::ostringstream stream;
83  stream << p1 << p2 << p3 << p4 << p5;
84  return stream.str();
85  }
86 
87  template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6 >
88  inline std::string toString (T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6)
89  {
90  std::ostringstream stream;
91  stream << p1 << p2 << p3 << p4 << p5 << p6;
92  return stream.str();
93  }
94 
95  template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7 >
96  inline std::string toString (T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7)
97  {
98  std::ostringstream stream;
99  stream << p1 << p2 << p3 << p4 << p5 << p6 << p7;
100  return stream.str();
101  }
102 
103  template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8 >
104  inline std::string toString (T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8)
105  {
106  std::ostringstream stream;
107  stream << p1 << p2 << p3 << p4 << p5 << p6 << p7 << p8;
108  return stream.str();
109  }
110 
111  template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9 >
112  inline std::string toString (T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8, T9 p9)
113  {
114  std::ostringstream stream;
115  stream << p1 << p2 << p3 << p4 << p5 << p6 << p7 << p8 << p9;
116  return stream.str();
117  }
118 
119  template< >
120  inline std::string toString<bool> (bool _value)
121  {
122  return _value ? "true" : "false";
123  }
124 
125 
126  // утилиты для парсинга
127  template<typename T >
128  inline T parseValue( const std::string& _value )
129  {
130  std::istringstream stream(_value);
131  T result;
132  stream >> result;
133  if (stream.fail()) return T();
134  else
135  {
136  int item = stream.get();
137  while (item != -1)
138  {
139  if (item != ' ' && item != '\t') return T();
140  item = stream.get();
141  }
142  }
143  return result;
144  }
145 
146  // отдельная имплементация под bool
147  template<>
148  inline bool parseValue( const std::string& _value )
149  {
150  if (_value == "true" || _value == "1") return true;
151  return false;
152  }
153 
154  // отдельная имплементация под char
155  template<>
156  inline char parseValue( const std::string& _value ) { return (char)parseValue<short>(_value); }
157 
158  // отдельная имплементация под unsigned char
159  template<>
160  inline unsigned char parseValue( const std::string& _value ) { return (unsigned char)parseValue<unsigned short>(_value); }
161 
162 
163  inline short parseShort(const std::string& _value) { return parseValue<short>(_value); }
164  inline unsigned short parseUShort(const std::string& _value) { return parseValue<unsigned short>(_value); }
165  inline int parseInt(const std::string& _value) { return parseValue<int>(_value); }
166  inline unsigned int parseUInt(const std::string& _value) { return parseValue<unsigned int>(_value); }
167  inline size_t parseSizeT(const std::string& _value) { return parseValue<size_t>(_value); }
168  inline float parseFloat(const std::string& _value) { return parseValue<float>(_value); }
169  inline double parseDouble(const std::string& _value) { return parseValue<double>(_value); }
170 
171  inline bool parseBool(const std::string& _value) { return parseValue<bool>(_value); }
172  inline char parseChar(const std::string& _value) { return parseValue<char>(_value); }
173  inline unsigned char parseUChar(const std::string& _value) { return parseValue<unsigned char>(_value); }
174 
175  // для парсинга сложных типов, состоящих из простых
176  template<typename T1, typename T2 >
177  inline T1 parseValueEx2(const std::string& _value)
178  {
179  T2 p1, p2;
180  std::istringstream stream(_value);
181  stream >> p1 >> p2;
182  if (stream.fail()) return T1();
183  else
184  {
185  int item = stream.get();
186  while (item != -1)
187  {
188  if (item != ' ' && item != '\t') return T1();
189  item = stream.get();
190  }
191  }
192  return T1(p1, p2);
193  }
194 
195  template<typename T1, typename T2 >
196  inline T1 parseValueEx3(const std::string& _value)
197  {
198  T2 p1, p2, p3;
199  std::istringstream stream(_value);
200  stream >> p1 >> p2 >> p3;
201  if (stream.fail()) return T1();
202  else
203  {
204  int item = stream.get();
205  while (item != -1)
206  {
207  if (item != ' ' && item != '\t') return T1();
208  item = stream.get();
209  }
210  }
211  return T1(p1, p2, p3);
212  }
213 
214  template<typename T1, typename T2 >
215  inline T1 parseValueEx4(const std::string& _value)
216  {
217  T2 p1, p2, p3, p4;
218  std::istringstream stream(_value);
219  stream >> p1 >> p2 >> p3 >> p4;
220  if (stream.fail()) return T1();
221  else
222  {
223  int item = stream.get();
224  while (item != -1)
225  {
226  if (item != ' ' && item != '\t') return T1();
227  item = stream.get();
228  }
229  }
230  return T1(p1, p2, p3, p4);
231  }
232 
233  namespace templates
234  {
235  template<typename T>
236  inline void split(std::vector<std::string>& _ret, const std::string& _source, const std::string& _delims)
237  {
238  size_t start = _source.find_first_not_of(_delims);
239  while (start != _source.npos)
240  {
241  size_t end = _source.find_first_of(_delims, start);
242  if (end != _source.npos) _ret.push_back(_source.substr(start, end-start));
243  else
244  {
245  _ret.push_back(_source.substr(start));
246  break;
247  }
248  start = _source.find_first_not_of(_delims, end + 1);
249  }
250  }
251  } // namespace templates
252 
253  inline std::vector<std::string> split(const std::string& _source, const std::string& _delims = "\t\n ")
254  {
255  std::vector<std::string> result;
256  templates::split<void>(result, _source, _delims);
257  return result;
258  }
259 
260  template<typename T1, typename T2, typename T3, typename T4>
261  inline bool parseComplex(const std::string& _value, T1& _p1, T2& _p2, T3& _p3, T4& _p4)
262  {
263  std::istringstream stream(_value);
264 
265  stream >> _p1 >> _p2 >> _p3 >> _p4;
266 
267  if (stream.fail()) return false;
268  int item = stream.get();
269  while (item != -1)
270  {
271  if (item != ' ' && item != '\t') return false;
272  item = stream.get();
273  }
274 
275  return true;
276  }
277 
278  template<typename T1, typename T2, typename T3>
279  inline bool parseComplex(const std::string& _value, T1& _p1, T2& _p2, T3& _p3)
280  {
281  std::istringstream stream(_value);
282 
283  stream >> _p1 >> _p2 >> _p3;
284 
285  if (stream.fail()) return false;
286  int item = stream.get();
287  while (item != -1)
288  {
289  if (item != ' ' && item != '\t') return false;
290  item = stream.get();
291  }
292 
293  return true;
294  }
295 
296  template<typename T1, typename T2>
297  inline bool parseComplex(const std::string& _value, T1& _p1, T2& _p2)
298  {
299  std::istringstream stream(_value);
300 
301  stream >> _p1 >> _p2;
302 
303  if (stream.fail()) return false;
304  int item = stream.get();
305  while (item != -1)
306  {
307  if (item != ' ' && item != '\t') return false;
308  item = stream.get();
309  }
310 
311  return true;
312  }
313 
314  template<typename T1>
315  inline bool parseComplex(const std::string& _value, T1& _p1)
316  {
317  std::istringstream stream(_value);
318 
319  stream >> _p1;
320 
321  if (stream.fail()) return false;
322  int item = stream.get();
323  while (item != -1)
324  {
325  if (item != ' ' && item != '\t') return false;
326  item = stream.get();
327  }
328 
329  return true;
330  }
331 
332  template<>
333  inline bool parseComplex<bool>(const std::string& _value, bool& _p1)
334  {
335  std::string value(_value);
336  trim(value);
337  if ((value == "true") || (value == "1"))
338  {
339  _p1 = true;
340  return true;
341  }
342  else if ((value == "false") || (value == "0"))
343  {
344  _p1 = false;
345  return true;
346  }
347 
348  return false;
349  }
350 
351  } // namespace utility
352 
353 } // namespace MyGUI
354 
355 #endif // __MYGUI_UTILITY_H__