neoWidgets
 All Classes Namespaces Files Functions Variables Enumerations Enumerator Pages
StringConversions.h
1 #ifndef NEO_STRING_CONVERSIONS_H
2 #define NEO_STRING_CONVERSIONS_H
3 
4 namespace neo
5 {
6 
7 #pragma warning(push)
8 #pragma warning(disable:4996) // disable Microsoft warning about vsnprintf
9 
10 #define NEO_VSNPRINTF(buf, size, fmt, ap) _vsntprintf(buf, size, fmt, ap);
11 
18 inline tstring neoFormat(const TCHAR* fmt, ...)
19 {
20  va_list ap;
21 
22  va_start(ap, fmt);
23  int n = NEO_VSNPRINTF(0, 0, fmt, ap);
24  va_end(ap);
25 
26  if(n < 0)
27  return _T("");
28 
29  tstring str;
30  str.resize(n+1);
31 
32  va_start(ap, fmt);
33  n = NEO_VSNPRINTF(&str[0], n+1, fmt, ap);
34  va_end(ap);
35 
36  // can it fail on the second try? Regardless, handle the error
37  if(n < 0)
38  return _T("");
39 
40  return str;
41 }
42 
43 #pragma warning(pop) // enable warning again
44 
45 //-----------------------------------------------------------------------------
46 
47 // number to string
48 // definition for all bit lengths supported by the compiler
49 inline tstring neoToString(signed char value)
50 { return neoFormat(_T("%hhd"), value); }
51 inline tstring neoToString(short value)
52 { return neoFormat(_T("%hd"), value); }
53 inline tstring neoToString(int value)
54 { return neoFormat(_T("%d"), value); }
55 inline tstring neoToString(long value)
56 { return neoFormat(_T("%ld"), value); }
57 inline tstring neoToString(long long value)
58 { return neoFormat(_T("%lld"), value); }
59 
60 inline tstring neoToString(unsigned char value)
61 { return neoFormat(_T("%hhu"), value); }
62 inline tstring neoToString(unsigned short value)
63 { return neoFormat(_T("%hu"), value); }
64 inline tstring neoToString(unsigned int value)
65 { return neoFormat(_T("%u"), value); }
66 inline tstring neoToString(unsigned long value)
67 { return neoFormat(_T("%lu"), value); }
68 inline tstring neoToString(unsigned long long value)
69 { return neoFormat(_T("%llu"), value); }
70 
71 inline tstring neoToString(float value)
72 { return neoFormat(_T("%.7g"), value); }
73 inline tstring neoToString(double value)
74 { return neoFormat(_T("%.17g"), value); }
75 inline tstring neoToString(long double value)
76 { return neoFormat(_T("%.17Lg"), value); }
77 
78 // parse number
79 // definition for all bit lengths supported by the compiler
80 // this way the config will natively accept typedef'd integers like uint or LONG
81 inline signed char neoParseNumber(signed char, const tstring& text)
82 { return std::stoi(text); }
83 inline short neoParseNumber(short, const tstring& text)
84 { return std::stoi(text); }
85 inline int neoParseNumber(int, const tstring& text)
86 { return std::stoi(text); }
87 inline long neoParseNumber(long, const tstring& text)
88 { return std::stol(text); }
89 inline long long neoParseNumber(long long, const tstring& text)
90 { return std::stoll(text); }
91 
92 inline unsigned char neoParseNumber(unsigned char, const tstring& text)
93 { return static_cast<unsigned char>(std::stoul(text)); }
94 inline unsigned short neoParseNumber(unsigned short, const tstring& text)
95 { return static_cast<unsigned short>(std::stoul(text)); }
96 inline unsigned int neoParseNumber(unsigned int, const tstring& text)
97 { return std::stoul(text); }
98 inline unsigned long neoParseNumber(unsigned long, const tstring& text)
99 { return std::stoul(text); }
100 inline unsigned long long neoParseNumber(unsigned long long, const tstring& text)
101 { return std::stoull(text); }
102 
103 inline float neoParseNumber(float, const tstring& text)
104 { return std::stof(text); }
105 inline double neoParseNumber(double, const tstring& text)
106 { return std::stod(text); }
107 inline long double neoParseNumber(long double, const tstring& text)
108 { return std::stold(text); }
109 
110 template<typename T>
111 bool neoParse(const tstring& text, T& result)
112 {
113  try
114  {
115  T parsed = neoParseNumber(T(), text);
116  result = parsed;
117  return true;
118  }
119  catch(...)
120  {
121  return false;
122  }
123 }
124 
125 //-----------------------------------------------------------------------------
126 
127 inline tstring neoToString(const bool& value)
128 {
129  return value ? _T("1") : _T("0");
130 }
131 
132 inline bool neoParse(const tstring& text, bool& result)
133 {
134  int i;
135  if(neoParse(text, i))
136  {
137  result = i != 0;
138  return true;
139  }
140  return false;
141 }
142 
143 //-----------------------------------------------------------------------------
144 
145 template<typename T>
146 bool configStructWrite(Config& conf, const tstring& key, const T& value)
147 {
148  return conf.Write(key, neoToString(value));
149 }
150 
151 template<typename T>
152 bool configStructRead(const Config& conf, const tstring& key, T& result)
153 {
154  tstring text;
155  return conf.Read(key, text) &&
156  neoParse(text, result);
157 }
158 
159 //-----------------------------------------------------------------------------
160 
161 inline bool configStructWrite(Config& conf, const tstring& key, const Point& value)
162 {
163  return conf.Write(key + _T(".x"), value.x) &&
164  conf.Write(key + _T(".y"), value.y);
165 }
166 
167 inline bool configStructRead(const Config& conf, const tstring& key, Point& result)
168 {
169  LONG x,y;
170  if( conf.Read(key + _T(".x"), x) &&
171  conf.Read(key + _T(".y"), y))
172  {
173  result.x = x;
174  result.y = y;
175  return true;
176  }
177  return false;
178 }
179 
180 //-----------------------------------------------------------------------------
181 
182 inline bool configStructWrite(Config& conf, const tstring& key, const Size& value)
183 {
184  return conf.Write(key + _T(".w"), value.cx) &&
185  conf.Write(key + _T(".h"), value.cy);
186 }
187 
188 inline bool configStructRead(const Config& conf, const tstring& key, Size& result)
189 {
190  LONG w,h;
191  if( conf.Read(key + _T(".w"), w) &&
192  conf.Read(key + _T(".h"), h))
193  {
194  result.cx = w;
195  result.cy = h;
196  return true;
197  }
198  return false;
199 }
200 
201 //-----------------------------------------------------------------------------
202 
203 inline bool configStructWrite(Config& conf, const tstring& key, const Rect& value)
204 {
205  return conf.Write(key + _T(".x"), value.left) &&
206  conf.Write(key + _T(".y"), value.top) &&
207  conf.Write(key + _T(".w"), value.Width()) &&
208  conf.Write(key + _T(".h"), value.Height());
209 }
210 
211 inline bool configStructRead(const Config& conf, const tstring& key, Rect& result)
212 {
213  LONG x,y,w,h;
214  if( conf.Read(key + _T(".x"), x) &&
215  conf.Read(key + _T(".y"), y) &&
216  conf.Read(key + _T(".w"), w) &&
217  conf.Read(key + _T(".h"), h))
218  {
219  result = Rect(x, y, w, h);
220  return true;
221  }
222  return false;
223 }
224 
225 //-----------------------------------------------------------------------------
226 
227 template<typename T>
228 bool configStructWrite(Config& conf, const tstring& key, const std::vector<T>& value)
229 {
230  if(conf.Write(key + _T(".n"), value.size()))
231  {
232  for(size_t i = 0; i < value.size(); ++i)
233  {
234  conf.Write(key + _T(".") + std::to_wstring(i), value[i]);
235  }
236  return true;
237  }
238  return false;
239 }
240 
241 template<typename T>
242 bool configStructRead(const Config& conf, const tstring& key, std::vector<T>& result)
243 {
244  size_t n;
245  if(!conf.Read(key + _T(".n"), n))
246  return false;
247 
248  result.resize(n);
249  for(size_t i = 0; i < n; ++i)
250  {
251  T& item = result[i];
252  if(!conf.Read(key + _T(".") + std::to_wstring(i), item))
253  return false;
254  }
255  return true;
256 }
257 
258 } // neo
259 
260 #endif
tstring neoFormat(const TCHAR *fmt,...)
printf-style function
Definition: StringConversions.h:18