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>
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>
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 <typename TSource, typename TTarget, typename = void>
75
81 template <typename TSource, typename TTarget>
82 class NumericConverter<TSource,
83 TTarget,
84 typename std::enable_if<std::is_arithmetic<TSource>::value && std::is_arithmetic<TTarget>::value>::type>
85 : public IValueConverter<TSource, TTarget>
86 {
87 public:
88 virtual TTarget Convert(TSource source) override
89 {
90 return static_cast<TTarget>(source);
91 }
92 virtual TSource ConvertBack(TTarget target) override
93 {
94 return static_cast<TSource>(target);
95 }
96 };
97
102
103 /*================================================================================*/
104
109 template <typename T, typename = void>
111
116 template <typename T>
117 class NumericNegationConverter<T, typename std::enable_if<std::is_arithmetic<T>::value>::type>
118 : public IValueConverter<T, T>
119 {
120 public:
121 virtual T Convert(T source) override
122 {
123 return -source;
124 }
125 virtual T ConvertBack(T target) override
126 {
127 return -target;
128 }
129 };
130
131 /*================================================================================*/
132
136 class BoolNegationConverter : public IValueConverter<bool, bool>
137 {
138 public:
139 virtual bool Convert(bool source) override
140 {
141 return !source;
142 }
143 virtual bool ConvertBack(bool target) override
144 {
145 return !target;
146 }
147 };
148
153 template <typename TSource, typename = void>
155
160 template <typename TSource>
161 class NumericToBoolConverter<TSource, typename std::enable_if<std::is_arithmetic<TSource>::value>::type>
162 : public IValueConverter<TSource, bool>
163 {
164 public:
165 virtual bool Convert(TSource source) override
166 {
167 return source != static_cast<TSource>(0);
168 }
169 virtual TSource ConvertBack(bool target) override
170 {
171 return target ? static_cast<TSource>(1) : static_cast<TSource>(0);
172 }
173 };
174
179 template <typename TTarget, typename = void>
181
186 template <typename TTarget>
187 class BoolToNumericConverter<TTarget, typename std::enable_if<std::is_arithmetic<TTarget>::value>::type>
188 : public IValueConverter<bool, TTarget>
189 {
190 public:
191 virtual TTarget Convert(bool source) override
192 {
193 return source ? static_cast<TTarget>(1) : static_cast<TTarget>(0);
194 }
195 virtual bool ConvertBack(TTarget target) override
196 {
197 return target != static_cast<TTarget>(0);
198 }
199 };
200
203
204 /*================================================================================*/
205
211 template <typename TSource, typename TTarget, typename = void>
213
219 template <typename TSource, typename TTarget>
221 TTarget,
222 typename std::enable_if<std::is_enum<TSource>::value && std::is_arithmetic<TTarget>::value>::type>
223 : public IValueConverter<TSource, TTarget>
224 {
225 public:
226 virtual TTarget Convert(TSource source) override
227 {
228 return static_cast<TTarget>(source);
229 }
230 virtual TSource ConvertBack(TTarget target) override
231 {
232 return static_cast<TSource>(target);
233 }
234 };
235
241 template <typename TSource, typename TTarget, typename = void>
243
249 template <typename TSource, typename TTarget>
251 TTarget,
252 typename std::enable_if<std::is_arithmetic<TSource>::value && std::is_enum<TTarget>::value>::type>
253 : public IValueConverter<TSource, TTarget>
254 {
255 public:
256 virtual TTarget Convert(TSource source) override
257 {
258 return static_cast<TTarget>(source);
259 }
260 virtual TSource ConvertBack(TTarget target) override
261 {
262 return static_cast<TSource>(target);
263 }
264 };
265
266 template <typename TEnum>
268
269 template <typename TEnum>
271
272 /*================================================================================*/
273
277 class IntToStringConverter : public IValueConverter<int, std::wstring>
278 {
279 public:
280 explicit IntToStringConverter(int defaultValue = 0)
281 : defaultValue(defaultValue)
282 {
283 }
284 virtual std::wstring Convert(int source) override
285 {
286 return std::to_wstring(source);
287 }
288 virtual int ConvertBack(const std::wstring &target) override
289 {
290 int result;
291 bool success = std::swscanf(target.c_str(), L"%d", &result) == 1;
292 return success ? result : defaultValue;
293 }
294
295 private:
296 int defaultValue;
297 };
298
302 class FloatToStringConverter : public IValueConverter<float, std::wstring>
303 {
304 public:
305 explicit FloatToStringConverter(float defaultValue = 0.0f)
306 : defaultValue(defaultValue)
307 {
308 }
309 virtual std::wstring Convert(float source) override
310 {
311 std::wstring result(32, L'\0');
312 int len = std::swprintf(&result[0], result.size(), L"%g", source);
313 result.resize(len > 0 ? len : 0);
314 return result;
315 }
316 virtual float ConvertBack(const std::wstring &target) override
317 {
318 float result;
319 bool success = std::swscanf(target.c_str(), L"%f", &result) == 1;
320 return success ? result : defaultValue;
321 }
322
323 private:
324 float defaultValue;
325 };
326
330 class DoubleToStringConverter : public IValueConverter<double, std::wstring>
331 {
332 public:
333 explicit DoubleToStringConverter(double defaultValue = 0.0)
334 : defaultValue(defaultValue)
335 {
336 }
337 virtual std::wstring Convert(double source) override
338 {
339 std::wstring result(32, L'\0');
340 int len = std::swprintf(&result[0], result.size(), L"%g", source);
341 result.resize(len > 0 ? len : 0);
342 return result;
343 }
344 virtual double ConvertBack(const std::wstring &target) override
345 {
346 double result;
347 bool success = std::swscanf(target.c_str(), L"%lf", &result) == 1;
348 return success ? result : defaultValue;
349 }
350
351 private:
352 double defaultValue;
353 };
354
358 class StringToIntConverter : public IValueConverter<std::wstring, int>
359 {
360 public:
361 explicit StringToIntConverter(int defaultValue = 0)
362 : defaultValue(defaultValue)
363 {
364 }
365 virtual int Convert(const std::wstring &source) override
366 {
367 int result;
368 bool success = std::swscanf(source.c_str(), L"%d", &result) == 1;
369 return success ? result : defaultValue;
370 }
371 virtual std::wstring ConvertBack(int target) override
372 {
373 return std::to_wstring(target);
374 }
375
376 private:
377 int defaultValue;
378 };
379
383 class StringToFloatConverter : public IValueConverter<std::wstring, float>
384 {
385 public:
386 explicit StringToFloatConverter(float defaultValue = 0.0f)
387 : defaultValue(defaultValue)
388 {
389 }
390 virtual float Convert(const std::wstring &source) override
391 {
392 float result;
393 bool success = std::swscanf(source.c_str(), L"%f", &result) == 1;
394 return success ? result : defaultValue;
395 }
396 virtual std::wstring ConvertBack(float target) override
397 {
398 std::wstring result(32, L'\0');
399 int len = std::swprintf(&result[0], result.size(), L"%g", target);
400 result.resize(len > 0 ? len : 0);
401 return result;
402 }
403
404 private:
405 float defaultValue;
406 };
407
411 class StringToDoubleConverter : public IValueConverter<std::wstring, double>
412 {
413 public:
414 explicit StringToDoubleConverter(double defaultValue = 0.0)
415 : defaultValue(defaultValue)
416 {
417 }
418 virtual double Convert(const std::wstring &source) override
419 {
420 double result;
421 bool success = std::swscanf(source.c_str(), L"%lf", &result) == 1;
422 return success ? result : defaultValue;
423 }
424 virtual std::wstring ConvertBack(double target) override
425 {
426 std::wstring result(32, L'\0');
427 int len = std::swprintf(&result[0], result.size(), L"%g", target);
428 result.resize(len > 0 ? len : 0);
429 return result;
430 }
431
432 private:
433 double defaultValue;
434 };
435
436 /*================================================================================*/
437
441 class IntToAnsiStringConverter : public IValueConverter<int, std::string>
442 {
443 public:
444 explicit IntToAnsiStringConverter(int defaultValue = 0)
445 : defaultValue(defaultValue)
446 {
447 }
448 virtual std::string Convert(int source) override
449 {
450 return std::to_string(source);
451 }
452 virtual int ConvertBack(const std::string &target) override
453 {
454 int result;
455 bool success = std::sscanf(target.c_str(), "%d", &result) == 1;
456 return success ? result : defaultValue;
457 }
458
459 private:
460 int defaultValue;
461 };
462
466 class FloatToAnsiStringConverter : public IValueConverter<float, std::string>
467 {
468 public:
469 explicit FloatToAnsiStringConverter(float defaultValue = 0.0f)
470 : defaultValue(defaultValue)
471 {
472 }
473 virtual std::string Convert(float source) override
474 {
475 std::string result(32, '\0');
476 int len = std::snprintf(&result[0], result.size(), "%g", source);
477 result.resize(len > 0 ? len : 0);
478 return result;
479 }
480 virtual float ConvertBack(const std::string &target) override
481 {
482 float result;
483 bool success = std::sscanf(target.c_str(), "%f", &result) == 1;
484 return success ? result : defaultValue;
485 }
486
487 private:
488 float defaultValue;
489 };
490
494 class DoubleToAnsiStringConverter : public IValueConverter<double, std::string>
495 {
496 public:
497 explicit DoubleToAnsiStringConverter(double defaultValue = 0.0)
498 : defaultValue(defaultValue)
499 {
500 }
501 virtual std::string Convert(double source) override
502 {
503 std::string result(32, '\0');
504 int len = std::snprintf(&result[0], result.size(), "%g", source);
505 result.resize(len > 0 ? len : 0);
506 return result;
507 }
508 virtual double ConvertBack(const std::string &target) override
509 {
510 double result;
511 bool success = std::sscanf(target.c_str(), "%lf", &result) == 1;
512 return success ? result : defaultValue;
513 }
514
515 private:
516 double defaultValue;
517 };
518
522 class AnsiStringToIntConverter : public IValueConverter<std::string, int>
523 {
524 public:
525 explicit AnsiStringToIntConverter(int defaultValue = 0)
526 : defaultValue(defaultValue)
527 {
528 }
529 virtual int Convert(const std::string &source) override
530 {
531 int result;
532 bool success = std::sscanf(source.c_str(), "%d", &result) == 1;
533 return success ? result : defaultValue;
534 }
535 virtual std::string ConvertBack(int target) override
536 {
537 return std::to_string(target);
538 }
539
540 private:
541 int defaultValue;
542 };
543
547 class AnsiStringToFloatConverter : public IValueConverter<std::string, float>
548 {
549 public:
550 explicit AnsiStringToFloatConverter(float defaultValue = 0.0f)
551 : defaultValue(defaultValue)
552 {
553 }
554 virtual float Convert(const std::string &source) override
555 {
556 float result;
557 bool success = std::sscanf(source.c_str(), "%f", &result) == 1;
558 return success ? result : defaultValue;
559 }
560 virtual std::string ConvertBack(float target) override
561 {
562 std::string result(32, '\0');
563 int len = std::snprintf(&result[0], result.size(), "%g", target);
564 result.resize(len > 0 ? len : 0);
565 return result;
566 }
567
568 private:
569 float defaultValue;
570 };
571
575 class AnsiStringToDoubleConverter : public IValueConverter<std::string, double>
576 {
577 public:
578 explicit AnsiStringToDoubleConverter(double defaultValue = 0.0)
579 : defaultValue(defaultValue)
580 {
581 }
582 virtual double Convert(const std::string &source) override
583 {
584 double result;
585 bool success = std::sscanf(source.c_str(), "%lf", &result) == 1;
586 return success ? result : defaultValue;
587 }
588 virtual std::string ConvertBack(double target) override
589 {
590 std::string result(32, '\0');
591 int len = std::snprintf(&result[0], result.size(), "%g", target);
592 result.resize(len > 0 ? len : 0);
593 return result;
594 }
595
596 private:
597 double defaultValue;
598 };
599
600 /*================================================================================*/
601
605 class StringToAnsiStringConverter : public IValueConverter<std::wstring, std::string>
606 {
607 public:
608 virtual std::string Convert(const std::wstring &source) override
609 {
610 return Utils::ToMultiByteStr(source);
611 }
612 virtual std::wstring ConvertBack(const std::string &target) override
613 {
614 return Utils::ToWideStr(target);
615 }
616 };
617
621 class AnsiStringToStringConverter : public IValueConverter<std::string, std::wstring>
622 {
623 public:
624 virtual std::wstring Convert(const std::string &source) override
625 {
626 return Utils::ToWideStr(source);
627 }
628 virtual std::string ConvertBack(const std::wstring &target) override
629 {
631 }
632 };
633
637 class StringToUtf8StringConverter : public IValueConverter<std::wstring, std::string>
638 {
639 public:
640 virtual std::string Convert(const std::wstring &source) override
641 {
642 return Utils::ToMultiByteStr(source, true);
643 }
644 virtual std::wstring ConvertBack(const std::string &target) override
645 {
646 return Utils::ToWideStr(target, true);
647 }
648 };
649
653 class Utf8StringToStringConverter : public IValueConverter<std::string, std::wstring>
654 {
655 public:
656 virtual std::wstring Convert(const std::string &source) override
657 {
658 return Utils::ToWideStr(source, true);
659 }
660 virtual std::string ConvertBack(const std::wstring &target) override
661 {
662 return Utils::ToMultiByteStr(target, true);
663 }
664 };
665}
666
667#ifdef _MSC_VER
668#pragma warning(pop)
669#endif
窄字符串与双精度浮点数转换器
Definition Converters.h:576
窄字符串与浮点数转换器
Definition Converters.h:548
窄字符串与整数转换器
Definition Converters.h:523
窄字符串与宽字符串转换器
Definition Converters.h:622
布尔值取反转换器
Definition Converters.h:137
布尔值与数值转换器模板声明
Definition Converters.h:180
双精度浮点数与窄字符串转换器
Definition Converters.h:495
双精度浮点数与字符串转换器
Definition Converters.h:331
枚举类型与数值类型转换器模板声明
Definition Converters.h:212
浮点数与窄字符串转换器
Definition Converters.h:467
浮点数与字符串转换器
Definition Converters.h:303
值转换器接口
Definition IValueConverter.h:14
整数与窄字符串转换器
Definition Converters.h:442
整数与字符串转换器
Definition Converters.h:278
数值类型转换器模板声明
Definition Converters.h:74
数值取反转换器模板声明
Definition Converters.h:110
数值与布尔值转换器模板声明
Definition Converters.h:154
数值类型与枚举类型转换器模板声明
Definition Converters.h:242
反向转换器模板声明
Definition Converters.h:23
宽字符串与窄字符串转换器
Definition Converters.h:606
字符串与双精度浮点数转换器
Definition Converters.h:412
字符串与浮点数转换器
Definition Converters.h:384
字符串与整数转换器
Definition Converters.h:359
宽字符串与UTF-8编码窄字符串转换器
Definition Converters.h:638
UTF-8编码窄字符串与宽字符串转换器
Definition Converters.h:654
static std::string ToMultiByteStr(const std::wstring &wstr)
将宽字符串转为窄字符串
static std::wstring ToWideStr(const std::string &str)
将窄字符串转为宽字符串