24 #ifndef _OPTIMIZED_LEXICAL_CAST_HPP_
25 #define _OPTIMIZED_LEXICAL_CAST_HPP_
29 #include <boost/lexical_cast.hpp>
30 #include <boost/logic/tribool.hpp>
40 class ThreadSafeCLocale :
public boost::singleton<ThreadSafeCLocale>
43 ThreadSafeCLocale(boost::restricted) : c_locale(::newlocale(LC_ALL_MASK,
"C", 0)) {}
44 ~ThreadSafeCLocale() {::freelocale(c_locale);}
49 #define STRTOD(x, y) strtod_l((x), (y), ThreadSafeCLocale::instance->c_locale)
50 #define ATOF(x) STRTOD(x,NULL)
53 #define STRTOD(x, y) strtod((x), (y))
54 #define ATOF(x) atof(x)
57 #define OPTIMIZED_LEXICAL_CAST(toType) \
58 template<> inline toType lexical_cast(const std::string& str) { \
60 toType value = lexical_cast<toType>(str, success); \
62 throw bad_lexical_cast(); \
69 template <
typename toType>
73 throw std::logic_error(
"BUG: new overload needed");
81 const char* stringToConvert = str.c_str();
82 const char* endOfConversion = stringToConvert;
83 float value = (float)
STRTOD( stringToConvert,
const_cast<char**
>(&endOfConversion) );
84 if(
value == 0.0f && stringToConvert == endOfConversion )
92 inline double lexical_cast(
const std::string& str,
bool& success )
96 const char* stringToConvert = str.c_str();
97 const char* endOfConversion = stringToConvert;
98 double value =
STRTOD( stringToConvert,
const_cast<char**
>(&endOfConversion) );
99 if(
value == 0.0 && stringToConvert == endOfConversion )
107 inline int lexical_cast(
const std::string& str,
bool& success )
111 const char* stringToConvert = str.c_str();
112 const char* endOfConversion = stringToConvert;
113 int value = (int) strtol( stringToConvert,
const_cast<char**
>(&endOfConversion), 0 );
114 if( (
value == 0 && stringToConvert == endOfConversion ) ||
123 inline long lexical_cast(
const std::string& str,
bool& success )
127 const char* stringToConvert = str.c_str();
128 const char* endOfConversion = stringToConvert;
129 long value = strtol( stringToConvert,
const_cast<char**
>(&endOfConversion), 0 );
130 if( (
value == 0l && stringToConvert == endOfConversion ) ||
139 inline unsigned int lexical_cast(
const std::string& str,
bool& success )
143 const char* stringToConvert = str.c_str();
144 const char* endOfConversion = stringToConvert;
145 unsigned int value = (
unsigned int) strtoul( stringToConvert,
const_cast<char**
>(&endOfConversion), 0 );
146 if( (
value == 0u && stringToConvert == endOfConversion ) ||
155 inline unsigned long lexical_cast(
const std::string& str,
bool& success )
159 const char* stringToConvert = str.c_str();
160 const char* endOfConversion = stringToConvert;
161 unsigned long value = strtoul( stringToConvert,
const_cast<char**
>(&endOfConversion), 0 );
162 if( (
value == 0ul && stringToConvert == endOfConversion ) ||
171 inline long long lexical_cast(
const std::string& str,
bool& success )
175 const char* stringToConvert = str.c_str();
176 const char* endOfConversion = stringToConvert;
177 long long value = strtoll( stringToConvert,
const_cast<char**
>(&endOfConversion), 0 );
178 if ((
value == 0ll && stringToConvert == endOfConversion) ||
187 inline unsigned long long lexical_cast(
const std::string& str,
bool& success )
191 const char* stringToConvert = str.c_str();
192 const char* endOfConversion = stringToConvert;
193 unsigned long long value = strtoull( stringToConvert,
const_cast<char**
>(&endOfConversion), 0 );
194 if( (
value == 0ull && stringToConvert == endOfConversion ) ||
205 if (str ==
"0" || str ==
"false")
211 inline boost::logic::tribool
lexical_cast(
const std::string& str )
213 using namespace boost::logic;
215 return tribool(indeterminate);
216 if (str ==
"0" || str ==
"false")
295 #endif // _OPTIMIZED_LEXICAL_CAST_HPP_