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)
65 const char* stringToConvert = str.c_str();
66 const char* endOfConversion = stringToConvert;
67 float value = (float)
STRTOD( stringToConvert, const_cast<char**>(&endOfConversion) );
68 if( value == 0.0f && stringToConvert == endOfConversion )
69 throw bad_lexical_cast();
77 const char* stringToConvert = str.c_str();
78 const char* endOfConversion = stringToConvert;
79 double value =
STRTOD( stringToConvert, const_cast<char**>(&endOfConversion) );
80 if( value == 0.0 && stringToConvert == endOfConversion )
81 throw bad_lexical_cast();
89 const char* stringToConvert = str.c_str();
90 const char* endOfConversion = stringToConvert;
91 int value = (int) strtol( stringToConvert, const_cast<char**>(&endOfConversion), 0 );
92 if( ( value == 0 && stringToConvert == endOfConversion ) ||
94 throw bad_lexical_cast();
102 const char* stringToConvert = str.c_str();
103 const char* endOfConversion = stringToConvert;
104 long value = strtol( stringToConvert, const_cast<char**>(&endOfConversion), 0 );
105 if( ( value == 0l && stringToConvert == endOfConversion ) ||
107 throw bad_lexical_cast();
112 inline unsigned int lexical_cast(
const std::string& str )
115 const char* stringToConvert = str.c_str();
116 const char* endOfConversion = stringToConvert;
117 unsigned int value = (
unsigned int) strtoul( stringToConvert, const_cast<char**>(&endOfConversion), 0 );
118 if( ( value == 0u && stringToConvert == endOfConversion ) ||
120 throw bad_lexical_cast();
125 inline unsigned long lexical_cast(
const std::string& str )
128 const char* stringToConvert = str.c_str();
129 const char* endOfConversion = stringToConvert;
130 unsigned long value = strtoul( stringToConvert, const_cast<char**>(&endOfConversion), 0 );
131 if( ( value == 0ul && stringToConvert == endOfConversion ) ||
133 throw bad_lexical_cast();
140 if (str ==
"0" || str ==
"false")
146 inline boost::logic::tribool
lexical_cast(
const std::string& str )
148 using namespace boost::logic;
150 return tribool(indeterminate);
151 if (str ==
"0" || str ==
"false")
230 #endif // _OPTIMIZED_LEXICAL_CAST_HPP_