SimpleWindow
载入中...
搜索中...
未找到
Converters.h
1#pragma once
2
3#include "IValueConverter.h"
4#include "Utils.h"
5#include <cwchar>
6
7// clang-format off
8
9#ifdef _MSC_VER
10#pragma warning(push)
11#pragma warning(disable: 4996) // make sscanf great again
12#endif
13
14// clang-format on
15
16namespace sw
17{
22 template <typename TBaseConverter, typename = void>
24
29 template <typename TBaseConverter>
31 TBaseConverter,
32 typename std::enable_if<
33 std::is_base_of<
34 IValueConverter<
35 typename std::decay<typename TBaseConverter::TSourceParam>::type,
36 typename std::decay<typename TBaseConverter::TTargetParam>::type>,
37 TBaseConverter>::value>::type>
38 : public IValueConverter<
39 typename std::decay<typename TBaseConverter::TTargetParam>::type,
40 typename std::decay<typename TBaseConverter::TSourceParam>::type>
41 {
42 public:
43 using TSourceParam = typename TBaseConverter::TTargetParam;
44 using TTargetParam = typename TBaseConverter::TSourceParam;
45 using TSource = typename std::decay<TSourceParam>::type;
46 using TTarget = typename std::decay<TTargetParam>::type;
47
48 template <typename... Args>
49 ReverseConverter(Args &&...args)
50 : baseConverter(std::forward<Args>(args)...)
51 {
52 }
53 virtual TTarget Convert(TSourceParam source) override
54 {
55 return baseConverter.ConvertBack(source);
56 }
57 virtual TSource ConvertBack(TTargetParam target) override
58 {
59 return baseConverter.Convert(target);
60 }
61
62 private:
63 TBaseConverter baseConverter;
64 };
65
66 /*================================================================================*/
67
73 template <
74 typename TSource,
75 typename TTarget,
76 typename std::enable_if<std::is_arithmetic<TSource>::value && std::is_arithmetic<TTarget>::value, int>::type = 0>
77 class NumericConverter : public IValueConverter<TSource, TTarget>
78 {
79 public:
80 virtual TTarget Convert(TSource source) override
81 {
82 return static_cast<TTarget>(source);
83 }
84 virtual TSource ConvertBack(TTarget target) override
85 {
86 return static_cast<TSource>(target);
87 }
88 };
89
94
95 /*================================================================================*/
96
101 template <
102 typename T,
103 typename std::enable_if<std::is_arithmetic<T>::value, int>::type = 0>
105 {
106 public:
107 virtual T Convert(T source) override
108 {
109 return -source;
110 }
111 virtual T ConvertBack(T target) override
112 {
113 return -target;
114 }
115 };
116
117 /*================================================================================*/
118
122 class BoolNegationConverter : public IValueConverter<bool, bool>
123 {
124 public:
125 virtual bool Convert(bool source) override
126 {
127 return !source;
128 }
129 virtual bool ConvertBack(bool target) override
130 {
131 return !target;
132 }
133 };
134
139 template <
140 typename TSource,
141 typename std::enable_if<std::is_arithmetic<TSource>::value, int>::type = 0>
142 class NumericToBoolConverter : public IValueConverter<TSource, bool>
143 {
144 public:
145 virtual bool Convert(TSource source) override
146 {
147 return source != static_cast<TSource>(0);
148 }
149 virtual TSource ConvertBack(bool target) override
150 {
151 return target ? static_cast<TSource>(1) : static_cast<TSource>(0);
152 }
153 };
154
159 template <
160 typename TTarget,
161 typename std::enable_if<std::is_arithmetic<TTarget>::value, int>::type = 0>
162 class BoolToNumericConverter : public IValueConverter<bool, TTarget>
163 {
164 public:
165 virtual TTarget Convert(bool source) override
166 {
167 return source ? static_cast<TTarget>(1) : static_cast<TTarget>(0);
168 }
169 virtual bool ConvertBack(TTarget target) override
170 {
171 return target != static_cast<TTarget>(0);
172 }
173 };
174
177
178 /*================================================================================*/
179
183 class IntToStringConverter : public IValueConverter<int, std::wstring>
184 {
185 public:
186 explicit IntToStringConverter(int defaultValue = 0)
187 : defaultValue(defaultValue)
188 {
189 }
190 virtual std::wstring Convert(int source) override
191 {
192 return std::to_wstring(source);
193 }
194 virtual int ConvertBack(const std::wstring &target) override
195 {
196 int result;
197 bool success = std::swscanf(target.c_str(), L"%d", &result) == 1;
198 return success ? result : defaultValue;
199 }
200
201 private:
202 int defaultValue;
203 };
204
208 class FloatToStringConverter : public IValueConverter<float, std::wstring>
209 {
210 public:
211 explicit FloatToStringConverter(float defaultValue = 0.0f)
212 : defaultValue(defaultValue)
213 {
214 }
215 virtual std::wstring Convert(float source) override
216 {
217 std::wstring result(32, L'\0');
218 int len = std::swprintf(&result[0], result.size(), L"%g", source);
219 result.resize(len > 0 ? len : 0);
220 return result;
221 }
222 virtual float ConvertBack(const std::wstring &target) override
223 {
224 float result;
225 bool success = std::swscanf(target.c_str(), L"%f", &result) == 1;
226 return success ? result : defaultValue;
227 }
228
229 private:
230 float defaultValue;
231 };
232
236 class DoubleToStringConverter : public IValueConverter<double, std::wstring>
237 {
238 public:
239 explicit DoubleToStringConverter(double defaultValue = 0.0)
240 : defaultValue(defaultValue)
241 {
242 }
243 virtual std::wstring Convert(double source) override
244 {
245 std::wstring result(32, L'\0');
246 int len = std::swprintf(&result[0], result.size(), L"%g", source);
247 result.resize(len > 0 ? len : 0);
248 return result;
249 }
250 virtual double ConvertBack(const std::wstring &target) override
251 {
252 double result;
253 bool success = std::swscanf(target.c_str(), L"%lf", &result) == 1;
254 return success ? result : defaultValue;
255 }
256
257 private:
258 double defaultValue;
259 };
260
264 class StringToIntConverter : public IValueConverter<std::wstring, int>
265 {
266 public:
267 explicit StringToIntConverter(int defaultValue = 0)
268 : defaultValue(defaultValue)
269 {
270 }
271 virtual int Convert(const std::wstring &source) override
272 {
273 int result;
274 bool success = std::swscanf(source.c_str(), L"%d", &result) == 1;
275 return success ? result : defaultValue;
276 }
277 virtual std::wstring ConvertBack(int target) override
278 {
279 return std::to_wstring(target);
280 }
281
282 private:
283 int defaultValue;
284 };
285
289 class StringToFloatConverter : public IValueConverter<std::wstring, float>
290 {
291 public:
292 explicit StringToFloatConverter(float defaultValue = 0.0f)
293 : defaultValue(defaultValue)
294 {
295 }
296 virtual float Convert(const std::wstring &source) override
297 {
298 float result;
299 bool success = std::swscanf(source.c_str(), L"%f", &result) == 1;
300 return success ? result : defaultValue;
301 }
302 virtual std::wstring ConvertBack(float target) override
303 {
304 std::wstring result(32, L'\0');
305 int len = std::swprintf(&result[0], result.size(), L"%g", target);
306 result.resize(len > 0 ? len : 0);
307 return result;
308 }
309
310 private:
311 float defaultValue;
312 };
313
317 class StringToDoubleConverter : public IValueConverter<std::wstring, double>
318 {
319 public:
320 explicit StringToDoubleConverter(double defaultValue = 0.0)
321 : defaultValue(defaultValue)
322 {
323 }
324 virtual double Convert(const std::wstring &source) override
325 {
326 double result;
327 bool success = std::swscanf(source.c_str(), L"%lf", &result) == 1;
328 return success ? result : defaultValue;
329 }
330 virtual std::wstring ConvertBack(double target) override
331 {
332 std::wstring result(32, L'\0');
333 int len = std::swprintf(&result[0], result.size(), L"%g", target);
334 result.resize(len > 0 ? len : 0);
335 return result;
336 }
337
338 private:
339 double defaultValue;
340 };
341
342 /*================================================================================*/
343
347 class IntToAnsiStringConverter : public IValueConverter<int, std::string>
348 {
349 public:
350 explicit IntToAnsiStringConverter(int defaultValue = 0)
351 : defaultValue(defaultValue)
352 {
353 }
354 virtual std::string Convert(int source) override
355 {
356 return std::to_string(source);
357 }
358 virtual int ConvertBack(const std::string &target) override
359 {
360 int result;
361 bool success = std::sscanf(target.c_str(), "%d", &result) == 1;
362 return success ? result : defaultValue;
363 }
364
365 private:
366 int defaultValue;
367 };
368
372 class FloatToAnsiStringConverter : public IValueConverter<float, std::string>
373 {
374 public:
375 explicit FloatToAnsiStringConverter(float defaultValue = 0.0f)
376 : defaultValue(defaultValue)
377 {
378 }
379 virtual std::string Convert(float source) override
380 {
381 std::string result(32, '\0');
382 int len = std::snprintf(&result[0], result.size(), "%g", source);
383 result.resize(len > 0 ? len : 0);
384 return result;
385 }
386 virtual float ConvertBack(const std::string &target) override
387 {
388 float result;
389 bool success = std::sscanf(target.c_str(), "%f", &result) == 1;
390 return success ? result : defaultValue;
391 }
392
393 private:
394 float defaultValue;
395 };
396
400 class DoubleToAnsiStringConverter : public IValueConverter<double, std::string>
401 {
402 public:
403 explicit DoubleToAnsiStringConverter(double defaultValue = 0.0)
404 : defaultValue(defaultValue)
405 {
406 }
407 virtual std::string Convert(double source) override
408 {
409 std::string result(32, '\0');
410 int len = std::snprintf(&result[0], result.size(), "%g", source);
411 result.resize(len > 0 ? len : 0);
412 return result;
413 }
414 virtual double ConvertBack(const std::string &target) override
415 {
416 double result;
417 bool success = std::sscanf(target.c_str(), "%lf", &result) == 1;
418 return success ? result : defaultValue;
419 }
420
421 private:
422 double defaultValue;
423 };
424
428 class AnsiStringToIntConverter : public IValueConverter<std::string, int>
429 {
430 public:
431 explicit AnsiStringToIntConverter(int defaultValue = 0)
432 : defaultValue(defaultValue)
433 {
434 }
435 virtual int Convert(const std::string &source) override
436 {
437 int result;
438 bool success = std::sscanf(source.c_str(), "%d", &result) == 1;
439 return success ? result : defaultValue;
440 }
441 virtual std::string ConvertBack(int target) override
442 {
443 return std::to_string(target);
444 }
445
446 private:
447 int defaultValue;
448 };
449
453 class AnsiStringToFloatConverter : public IValueConverter<std::string, float>
454 {
455 public:
456 explicit AnsiStringToFloatConverter(float defaultValue = 0.0f)
457 : defaultValue(defaultValue)
458 {
459 }
460 virtual float Convert(const std::string &source) override
461 {
462 float result;
463 bool success = std::sscanf(source.c_str(), "%f", &result) == 1;
464 return success ? result : defaultValue;
465 }
466 virtual std::string ConvertBack(float target) override
467 {
468 std::string result(32, '\0');
469 int len = std::snprintf(&result[0], result.size(), "%g", target);
470 result.resize(len > 0 ? len : 0);
471 return result;
472 }
473
474 private:
475 float defaultValue;
476 };
477
481 class AnsiStringToDoubleConverter : public IValueConverter<std::string, double>
482 {
483 public:
484 explicit AnsiStringToDoubleConverter(double defaultValue = 0.0)
485 : defaultValue(defaultValue)
486 {
487 }
488 virtual double Convert(const std::string &source) override
489 {
490 double result;
491 bool success = std::sscanf(source.c_str(), "%lf", &result) == 1;
492 return success ? result : defaultValue;
493 }
494 virtual std::string ConvertBack(double target) override
495 {
496 std::string result(32, '\0');
497 int len = std::snprintf(&result[0], result.size(), "%g", target);
498 result.resize(len > 0 ? len : 0);
499 return result;
500 }
501
502 private:
503 double defaultValue;
504 };
505
506 /*================================================================================*/
507
511 class StringToAnsiStringConverter : public IValueConverter<std::wstring, std::string>
512 {
513 public:
514 virtual std::string Convert(const std::wstring &source) override
515 {
516 return Utils::ToMultiByteStr(source);
517 }
518 virtual std::wstring ConvertBack(const std::string &target) override
519 {
520 return Utils::ToWideStr(target);
521 }
522 };
523
527 class AnsiStringToStringConverter : public IValueConverter<std::string, std::wstring>
528 {
529 public:
530 virtual std::wstring Convert(const std::string &source) override
531 {
532 return Utils::ToWideStr(source);
533 }
534 virtual std::string ConvertBack(const std::wstring &target) override
535 {
536 return Utils::ToMultiByteStr(target);
537 }
538 };
539
543 class StringToUtf8StringConverter : public IValueConverter<std::wstring, std::string>
544 {
545 public:
546 virtual std::string Convert(const std::wstring &source) override
547 {
548 return Utils::ToMultiByteStr(source, true);
549 }
550 virtual std::wstring ConvertBack(const std::string &target) override
551 {
552 return Utils::ToWideStr(target, true);
553 }
554 };
555
559 class Utf8StringToStringConverter : public IValueConverter<std::string, std::wstring>
560 {
561 public:
562 virtual std::wstring Convert(const std::string &source) override
563 {
564 return Utils::ToWideStr(source, true);
565 }
566 virtual std::string ConvertBack(const std::wstring &target) override
567 {
568 return Utils::ToMultiByteStr(target, true);
569 }
570 };
571}
572
573#ifdef _MSC_VER
574#pragma warning(pop)
575#endif
窄字符串与双精度浮点数转换器
Definition Converters.h:482
窄字符串与浮点数转换器
Definition Converters.h:454
窄字符串与整数转换器
Definition Converters.h:429
窄字符串与宽字符串转换器
Definition Converters.h:528
布尔值取反转换器
Definition Converters.h:123
布尔值与数值转换器,true转换为1,false转换为0
Definition Converters.h:163
双精度浮点数与窄字符串转换器
Definition Converters.h:401
双精度浮点数与字符串转换器
Definition Converters.h:237
浮点数与窄字符串转换器
Definition Converters.h:373
浮点数与字符串转换器
Definition Converters.h:209
值转换器接口
Definition IValueConverter.h:20
整数与窄字符串转换器
Definition Converters.h:348
整数与字符串转换器
Definition Converters.h:184
数值类型转换器,将源数值类型转换为目标数值类型
Definition Converters.h:78
数值取反转换器
Definition Converters.h:105
数值与布尔值转换器,非零数值转换为true,零数值转换为false
Definition Converters.h:143
反向转换器模板声明
Definition Converters.h:23
宽字符串与窄字符串转换器
Definition Converters.h:512
字符串与双精度浮点数转换器
Definition Converters.h:318
字符串与浮点数转换器
Definition Converters.h:290
字符串与整数转换器
Definition Converters.h:265
宽字符串与UTF-8编码窄字符串转换器
Definition Converters.h:544
UTF-8编码窄字符串与宽字符串转换器
Definition Converters.h:560
static std::string ToMultiByteStr(const std::wstring &wstr, bool utf8=false)
将宽字符串转为窄字符串
static std::wstring ToWideStr(const std::string &str, bool utf8=false)
将窄字符串转为宽字符串