27 #include "StringUtil.h"
34 static string demangle(
const char *mangled)
39 demangled = __cxa_demangle(mangled, NULL, 0, &status);
44 template <
typename T>
static string getClassName(T t)
46 const char *mangled =
typeid(t).name();
47 string tn = demangle(mangled);
48 if(tn[tn.length()-1]==
'*')
49 tn = tn.substr(0,tn.length()-1);
55 template <
typename T,
typename R>
static R cast(
const T& val)
57 return lexical_cast<R>(val);
60 template <
typename T>
static T lexical_cast(
const short& val)
72 string tn = getClassName(t);
73 throw (
"Conversion exception - short to " + tn);
76 template <
typename T>
static T lexical_cast(
const unsigned short& val)
88 string tn = getClassName(t);
89 throw (
"Conversion exception - unsigned short to " + tn);
92 template <
typename T>
static T lexical_cast(
const int& val)
104 string tn = getClassName(t);
105 throw (
"Conversion exception - int to " + tn);
108 template <
typename T>
static T lexical_cast(
const unsigned int& val)
120 string tn = getClassName(t);
121 throw (
"Conversion exception - unsigned int to " + tn);
124 template <
typename T>
static T lexical_cast(
const long& val)
136 string tn = getClassName(t);
137 throw (
"Conversion exception - long to " + tn);
140 template <
typename T>
static T lexical_cast(
const unsigned long& val)
152 string tn = getClassName(t);
153 throw (
"Conversion exception - unsigned long to " + tn);
156 template <
typename T>
static T lexical_cast(
const long long& val)
168 string tn = getClassName(t);
169 throw (
"Conversion exception - long long to " + tn);
172 template <
typename T>
static T lexical_cast(
const unsigned long long& val)
184 string tn = getClassName(t);
185 throw (
"Conversion exception - unsigned long long to " + tn);
188 template <
typename T>
static T lexical_cast(
const double& val)
200 string tn = getClassName(t);
201 throw (
"Conversion exception - double to " + tn);
204 template <
typename T>
static T lexical_cast(
const float& val)
216 string tn = getClassName(t);
217 throw (
"Conversion exception - float to " + tn);
220 template <
typename T>
static T lexical_cast(
const bool& val)
232 string tn = getClassName(t);
233 throw (
"Conversion exception - bool to " + tn);
236 template <
typename T>
static T lexical_cast(
const string& val)
238 return lexical_cast<T>(val.c_str());
240 template <
typename T>
static T lexical_cast(
const char* val)
243 string tn = getClassName(t);
245 if(tn==
"double" || tn==
"float")
248 d = strtod(val, &endptr);
251 throw "Conversion exception - string to double";
258 d = strtol(val, &endptr, 10);
261 throw "Conversion exception - string to int";
268 d = strtol(val, &endptr, 10);
271 throw "Conversion exception - string to short";
278 d = strtol(val, &endptr, 10);
281 throw "Conversion exception - string to long";
285 else if(tn==
"size_t")
288 d = strtol(val, &endptr, 10);
291 throw "Conversion exception - string to size_t";
295 else if(tn==
"unsigned short")
297 unsigned short d = 1;
298 d = strtoul(val, &endptr, 10);
301 throw "Conversion exception - string to unsigned short";
305 else if(tn==
"unsigned int")
308 d = strtoul(val, &endptr, 10);
311 throw "Conversion exception - string to unsigned int";
315 else if(tn==
"unsigned long")
318 d = strtoul(val, &endptr, 10);
321 throw "Conversion exception - string to unsigned long";
325 else if(tn==
"long long")
328 if(sscanf(val,
"%lld", &d)==1)
332 throw "Conversion exception - string to long long";
335 else if(tn==
"unsigned long long")
337 unsigned long long d = -1;
338 if(sscanf(val,
"%llu", &d)==1)
342 throw "Conversion exception - string to unsigned long long";
348 if(StringUtil::toLowerCopy(val)==
"true" || StringUtil::toLowerCopy(val)==
"1")
350 else if(StringUtil::toLowerCopy(val)==
"false" || StringUtil::toLowerCopy(val)==
"0")
354 throw "Conversion exception - string to bool";
358 else if(tn==
"std::string" || tn==
"string")
360 if(strlen(val)==0)
return t;
370 throw "Conversion exception - string to string";
375 throw "Generic Conversion exception";