Sleeping Wombat Common Library  0.50.0
swCommonLibrary
Converters.h
1 #pragma once
2 
3 #include <string>
4 #include <codecvt>
5 #include <type_traits>
6 
7 
8 
9 
10 class Convert
11 {
12 private:
13 
14  template< typename SrcType >
15  static inline std::string EnumToString ( SrcType defaultVal );
16 
17  template< typename SrcType >
18  static inline SrcType StringToEnum ( const std::string& value, SrcType defaultValue );
19 
20 public:
21 
22  template< typename SrcType >
23  static inline typename std::enable_if< std::is_enum< SrcType >::value, std::string >::type
24  ToString ( const SrcType& val );
25 
26  template< typename SrcType >
27  static inline typename std::enable_if< std::is_enum< SrcType >::value, SrcType >::type
28  FromString ( const std::string& val, const SrcType& defaultValue );
29 
30  template< typename SrcType >
31  static inline typename std::enable_if< !std::is_enum< SrcType >::value, std::string >::type
32  ToString ( const SrcType& val );
33 
34  template< typename SrcType >
35  static inline typename std::enable_if< !std::is_enum< SrcType >::value, SrcType >::type
36  FromString ( const std::string& val, const SrcType& defaultValue );
37 
38 
39 
40  template<>
41  static inline typename std::enable_if< !std::is_enum< std::wstring >::value, std::string >::type
42  ToString< std::wstring > ( const std::wstring& value );
43 
44  template<>
45  static inline typename std::enable_if< !std::is_enum< std::wstring >::value, std::wstring >::type
46  FromString< std::wstring > ( const std::string& value, const std::wstring& defaultValue );
47 
48 };
49 
50 
51 template< typename SrcType >
52 inline typename std::enable_if< !std::is_enum< SrcType >::value, std::string >::type
53  Convert::ToString ( const SrcType& val )
54 {
55  return std::to_string( val );
56 }
57 
58 template< typename SrcType >
59 inline typename std::enable_if< !std::is_enum< SrcType >::value, SrcType >::type
60  Convert::FromString ( const std::string& val, const SrcType& defaultValue )
61 {
62  static_assert( false, "Specialize template" );
63  return SrcType();
64 }
65 
66 
67 //====================================================================================//
68 // Public template specialization for enum types
69 //====================================================================================//
70 
72 template< typename SrcType >
73 inline typename std::enable_if< std::is_enum< SrcType >::value, std::string >::type
74  Convert::ToString ( const SrcType& val )
75 {
76  return EnumToString( val );
77 }
78 
80 template< typename SrcType >
81 inline typename std::enable_if< std::is_enum< SrcType >::value, SrcType >::type
82  Convert::FromString ( const std::string& val, const SrcType& defaultValue )
83 {
84  return StringToEnum( val, defaultValue );
85 }
86 
87 //====================================================================================//
88 // Wstring to string
89 //====================================================================================//
90 
91 template<>
92 inline typename std::enable_if< !std::is_enum< std::wstring >::value, std::string >::type
93  Convert::ToString< std::wstring > ( const std::wstring& value )
94 {
95  typedef std::codecvt_utf8<wchar_t> convert_type;
96  std::wstring_convert<convert_type, wchar_t> converter;
97  return converter.to_bytes( value );
98 }
99 
100 template<>
101 inline typename std::enable_if< !std::is_enum< std::wstring >::value, std::wstring >::type
102  Convert::FromString< std::wstring > ( const std::string& value, const std::wstring& defaultValue )
103 {
104  typedef std::codecvt_utf8<wchar_t> convert_type;
105  std::wstring_convert<convert_type, wchar_t> converter;
106  return converter.from_bytes( value );
107 }
108 
109 //====================================================================================//
110 // Private enum helpers
111 //====================================================================================//
112 
113 
114 template< typename SrcType >
115 std::string Convert::EnumToString ( SrcType value )
116 {
117  static_assert( std::is_enum< SrcType >::value, "Type is not enum" );
118 
119  auto type = rttr::type::get< SrcType >();
120 
121  assert( type.is_valid() );
122  assert( type.is_enumeration() );
123 
124  rttr::enumeration enumVal = type.get_enumeration();
125 
126  return enumVal.value_to_name( value );
127 }
128 
129 
130 template< typename SrcType >
131 SrcType Convert::StringToEnum ( const std::string& value, SrcType defaultValue )
132 {
133  static_assert( std::is_enum< SrcType >::value, "Type is not enum" );
134 
135  auto type = rttr::type::get< SrcType >();
136 
137  assert( type.is_valid() );
138  assert( type.is_enumeration() );
139 
140  rttr::enumeration enumVal = type.get_enumeration();
141 
142  rttr::variant result = enumVal.value_to_name( value );
143  if( !result.is_valid() )
144  return defaultValue;
145 
146  return result.get_value< SrcType >();
147 }
148 
149 
150 
151 
static std::string EnumToString(SrcType defaultVal)
Definition: Converters.h:115
static SrcType StringToEnum(const std::string &value, SrcType defaultValue)
Definition: Converters.h:131
Definition: Converters.h:10