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 )
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 ) ||
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 ) ||
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")
215 return tribool(indeterminate);
216 if (str ==
"0" || str ==
"false")
295 #endif // _OPTIMIZED_LEXICAL_CAST_HPP_ #define OPTIMIZED_LEXICAL_CAST(toType)
boost::logic::tribool lexical_cast(const std::string &str)
PWIZ_API_DECL std::string value(const std::string &id, const std::string &name)
convenience function to extract a named value from an id string